<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.gramps-project.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Codefarmer</id>
	<title>Gramps - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.gramps-project.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Codefarmer"/>
	<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php/Special:Contributions/Codefarmer"/>
	<updated>2026-06-21T19:49:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.3</generator>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=What_to_do_for_a_release&amp;diff=130300</id>
		<title>What to do for a release</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=What_to_do_for_a_release&amp;diff=130300"/>
		<updated>2026-04-13T13:43:18Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: There is no 32-bit version AIO package any more&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man note|Developer notes for '''What to do for a release '''}}&lt;br /&gt;
&lt;br /&gt;
Note that the main use of this page will be for making a normal &amp;quot;minor&amp;quot; release.  If you are making a &amp;quot;major&amp;quot; release (e.g. x.y.0) then you will need to update this page first, to change the numbers.  But if you are only making an &amp;quot;alpha&amp;quot; or &amp;quot;beta&amp;quot; release, some steps may be skipped, or altered slightly.&lt;br /&gt;
&lt;br /&gt;
Note also that there are additional necessary [[What_to_do_for_a_release#Post-release|Post release]] tasks which are related to making a new release. For instance, the wiki will require making a new release-section and   updating [[Template:Version_Templates#General|&amp;quot;General&amp;quot; version templates]]. For the making a new release-section on the bug tracker. Or when making new Debian and Mac and Windows [[:Category:Developers/Packaging|packaging]], they will need to be coordinated with the appropriate [[Team#Package_Maintainers|package maintainers]] and updating the corresponding [[:Category:Versions|Versions]] : [[Template:Version_Templates|Templates]]. &lt;br /&gt;
&lt;br /&gt;
==Pre-release==&lt;br /&gt;
===Agree a release timetable===&lt;br /&gt;
&lt;br /&gt;
Co-ordinate with the [[Team#Package_Maintainers|package maintainers]] to agree a release timetable.&lt;br /&gt;
For a major release there may be a schedule on the [[5.2_Roadmap|Roadmap]]&lt;br /&gt;
&lt;br /&gt;
===Announce a feature freeze===&lt;br /&gt;
For a major release, announce a feature freeze on the ''gramps-devel'' mailing list.&lt;br /&gt;
This will usually be about 4 weeks before the release date.&lt;br /&gt;
&lt;br /&gt;
===Translation update===&lt;br /&gt;
The translation template should be updated, if necessary, just before the string freeze is announced.&lt;br /&gt;
* Check for new files since the last release:&lt;br /&gt;
  cd po&lt;br /&gt;
  intltool-update -m &lt;br /&gt;
:That will create a file called &amp;lt;code&amp;gt;missing&amp;lt;/code&amp;gt;in the &amp;lt;code&amp;gt;po&amp;lt;/code&amp;gt; directory if there are new files that need to be scanned for translatable strings. Examine each of the files listed in &amp;lt;code&amp;gt;missing&amp;lt;/code&amp;gt;, adding each to &amp;lt;code&amp;gt;POTFILES.in&amp;lt;/code&amp;gt; if it contains translatable string constants and to &amp;lt;code&amp;gt;POTFILES.skip&amp;lt;/code&amp;gt; if it does not.&lt;br /&gt;
* Generate a new template file:&lt;br /&gt;
  python3 update_po.py -p # makes a new gramps.pot template file&lt;br /&gt;
  git diff gramps.pot&lt;br /&gt;
:Examine the changes. If they're all just comments about where a string is found you need not commit the change (so the next line will restore the official file, instead of the one you just made):&lt;br /&gt;
  git restore gramps.pot&lt;br /&gt;
:If there have been changes on &amp;lt;code&amp;gt;msgid&amp;lt;/code&amp;gt; entries, you'll need to commit &amp;lt;code&amp;gt;gramps.pot&amp;lt;/code&amp;gt; and ask translators to update their &amp;lt;tt&amp;gt;.po&amp;lt;/tt&amp;gt; files before you can make a release:&lt;br /&gt;
  git add gramps.pot&lt;br /&gt;
  git commit -m &amp;quot;Update translation template for new release&amp;quot;&lt;br /&gt;
  git push&lt;br /&gt;
:After updating the &amp;lt;code&amp;gt;pot&amp;lt;/code&amp;gt; file, push the changes and wait for Weblate to update the &amp;lt;code&amp;gt;po&amp;lt;/code&amp;gt; files.  Merge the corresponding pull request from Weblate.&lt;br /&gt;
* Check current translation files:&lt;br /&gt;
  python3 update_po.py -k all&lt;br /&gt;
:There should be very few warnings or fatal errors. Warnings related to new languages using default values in their headers are acceptable. There will also be some fatal errors reported due to the non-standard way we handle inflected dates. See the section on [https://gramps-project.org/wiki/index.php/Date_Handler#Localizing_the_date_formats Localizing the date formats] in the [https://gramps-project.org/wiki/index.php/Date_Handler Date Handler] wiki page for further details.  For example &amp;quot;{long_month}&amp;quot; may be translated as &amp;quot;{long_month.forms[Р]}&amp;quot;.&lt;br /&gt;
:All other fatal errors should be fixed.&lt;br /&gt;
Also see:&lt;br /&gt;
* [[Template:Gramps_translations#INCOMPLETE_TRANSLATIONS]] - Update if any translation needs to be added or excluded due to not meeting the minimum 70% completion requirement.&lt;br /&gt;
&lt;br /&gt;
===Announce a string freeze===&lt;br /&gt;
For a major release, announce a string freeze on the ''gramps-devel'' mailing list and on Weblate.&lt;br /&gt;
This will usually be about 2 weeks before the release date.&lt;br /&gt;
&lt;br /&gt;
In the ''Program'' component on Weblate, select &amp;quot;Manage⟶Post announcement&amp;quot; from the menu.  Enter an ''Expiry date'' the day before the release date, and select the ''Notify users'' checkbox to send a notification to all subscribed users.&lt;br /&gt;
&lt;br /&gt;
==Prepare your repository==&lt;br /&gt;
* Check out the current stable branch:&lt;br /&gt;
  git checkout maintenance/gramps{{Stable_branch}}&lt;br /&gt;
:That branch name assumes that you're using the same name as the Github repository; if you're not (perhaps you don't use &amp;lt;code&amp;gt;maintenance&amp;lt;/code&amp;gt; in the name) use your local name.&lt;br /&gt;
* Make sure that your local copy is clean:&lt;br /&gt;
  git status&lt;br /&gt;
: If you have any uncommitted changes, either commit them now or stash them until after you've completed the release.&lt;br /&gt;
* Clean up any untracked files and make sure that the local repo is up to date:&lt;br /&gt;
  git clean -fdx&lt;br /&gt;
  git pull --rebase&lt;br /&gt;
:If you had commits that hadn't been pushed yet they'll show up as &amp;quot;applying&amp;quot; messages in the output of this command. If that's the case re-run the tests and push as usual.&lt;br /&gt;
* Build and test to make sure that everything works, then clean the repo of all build products.&lt;br /&gt;
&lt;br /&gt;
===Check the About box year===&lt;br /&gt;
&lt;br /&gt;
Check if the year in the {{man label|About}} box needs to be updated&lt;br /&gt;
&lt;br /&gt;
eg:&lt;br /&gt;
   ''© 2007-2024 The Gramps Developers'' &lt;br /&gt;
to&lt;br /&gt;
   ''© 2007-'''2025''' The Gramps Developers''.&lt;br /&gt;
&lt;br /&gt;
Found in &amp;lt;code&amp;gt;gramps/gen/const.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API docs update year===&lt;br /&gt;
If needed in the file:&lt;br /&gt;
&lt;br /&gt;
docs/conf.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update the year for the copyright.&lt;br /&gt;
&lt;br /&gt;
 copyright = '2001-2025, The Gramps Project'&lt;br /&gt;
&lt;br /&gt;
===Update Classifier in setup.py===&lt;br /&gt;
Change [https://pypi.python.org/pypi?%3Aaction=list_classifiers Classifier] to the appropriate one in [https://github.com/gramps-project/gramps/blob/maintenance/gramps50/setup.py setup.py]  (master is always the first one)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Development Status :: 1 - Planning&lt;br /&gt;
Development Status :: 2 - Pre-Alpha&lt;br /&gt;
Development Status :: 3 - Alpha&lt;br /&gt;
Development Status :: 4 - Beta&lt;br /&gt;
Development Status :: 5 - Production/Stable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check if any additional language classifier needs to be added also.&lt;br /&gt;
&lt;br /&gt;
==Release name==&lt;br /&gt;
Refer to (and update) the [[Previous releases of Gramps|list of previous releases]].&lt;br /&gt;
&lt;br /&gt;
Previously you needed to select an appropriate name but we have not named releases for several years now.  You will still need to add the release though, including things like its relevant color.&lt;br /&gt;
&lt;br /&gt;
* [[Talk:Previous_releases_of_Gramps|Suggestions]] : For Gramps 5.0 &amp;lt;code&amp;gt;Just remember that you're standing on a planet that's evolving&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog and NEWS file==&lt;br /&gt;
&lt;br /&gt;
[https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html#section2 Section ''2a''] of the '''G'''eneral '''P'''ublic '''L'''icense says that if you distribute a modified version of a program: ''you must cause the modified files to carry prominent notices stating that you changed the files and the date of any change''. &lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;code&amp;gt;{{version}}&amp;lt;/code&amp;gt; below means the ''previous'' version, not the one you're about to release (which is the&lt;br /&gt;
&amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;).&lt;br /&gt;
 git log v{{version}}.. --pretty --numstat --summary --no-merges | git2cl &amp;gt; ChangeLog&lt;br /&gt;
 git log v{{version}}.. --pretty --numstat --summary --no-merges -- po/*.po | git2cl &amp;gt; po/ChangeLog&lt;br /&gt;
 git add ChangeLog&lt;br /&gt;
 git add po/ChangeLog&lt;br /&gt;
*Edit and update the &amp;lt;code&amp;gt;NEWS&amp;lt;/code&amp;gt; file using the new ChangeLog entries as a guide. If this is the first branch in a new series there will be no NEWS file, so look at a previous release and mimic the format.&lt;br /&gt;
Commit the NEWS file:&lt;br /&gt;
 git add NEWS&lt;br /&gt;
 git commit -m &amp;quot;Update ChangeLog and NEWS files&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Working on VERSION==&lt;br /&gt;
* Modify &amp;lt;code&amp;gt;[https://github.com/gramps-project/gramps/blob/master/gramps/version.py gramps/version.py]&amp;lt;/code&amp;gt;. Update &amp;lt;code&amp;gt;VERSION_TUPLE&amp;lt;/code&amp;gt; to the new version and set &amp;lt;code&amp;gt;DEV_VERSION&amp;lt;/code&amp;gt; to indicate an official release:&lt;br /&gt;
&lt;br /&gt;
 VERSION_TUPLE = (4, 2, ...)&lt;br /&gt;
&lt;br /&gt;
 - DEV_VERSION = True&lt;br /&gt;
 + DEV_VERSION = False&lt;br /&gt;
&lt;br /&gt;
* Add an entry to the [https://github.com/gramps-project/gramps/blob/maintenance/gramps52/data/org.gramps_project.Gramps.metainfo.xml.in org.gramps_project.Gramps.metainfo.xml.in] file.&lt;br /&gt;
&lt;br /&gt;
* Save the changes:&lt;br /&gt;
 git commit -am &amp;quot;Release Gramps {{version}}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Check that the version number is correct:&lt;br /&gt;
 python3 Gramps.py -v&lt;br /&gt;
&lt;br /&gt;
* If everything looks good, push the changes:&lt;br /&gt;
  git push origin maintenance/gramps{{Stable_branch}}&lt;br /&gt;
* If that fails then someone pushed a commit while you were working. Return to [[What_to_do_for_a_release#Prepare_your_repository|Prepare your repository]] and start over.&lt;br /&gt;
&lt;br /&gt;
==Create a tag==&lt;br /&gt;
Create the release tag; note the '''v''' leading the actual tag.:&lt;br /&gt;
 git tag -am &amp;quot;Tag {{version}}&amp;quot; v{{version}}&lt;br /&gt;
&lt;br /&gt;
==Push to repository==&lt;br /&gt;
Push the changes to the repository:&lt;br /&gt;
 git push origin v{{version}}&lt;br /&gt;
&lt;br /&gt;
===Update DEV_VERSION to indicate a development version===&lt;br /&gt;
&lt;br /&gt;
Revert change on &amp;lt;code&amp;gt;DEV_VERSION&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;gramps/version.py&amp;lt;/code&amp;gt; so that the git revision is appended to the reported version in non-release builds:&lt;br /&gt;
 - DEV_VERSION = False&lt;br /&gt;
 + DEV_VERSION = True&lt;br /&gt;
&lt;br /&gt;
Save change:&lt;br /&gt;
 git commit -am &amp;quot;Set to development version&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
===Github===&lt;br /&gt;
* Github generates a tarball automatically when we push a tag.&lt;br /&gt;
* Go to [https://github.com/gramps-project/gramps Github] and log in if necessary.&lt;br /&gt;
* Select '''NN Releases''' from the line of items just above the thick line ('''NN''' is the number of releases so far).&lt;br /&gt;
* Find the tag you just pushed and click it, or click the &amp;quot;Draft a new release&amp;quot; button.&lt;br /&gt;
* Copy the NEWS file contents into the '''Write''' tab. You can use the '''Preview''' tab to check your formatting.&lt;br /&gt;
* Add the sh256sum of the source distribution to the bottom of the release notes.&lt;br /&gt;
&lt;br /&gt;
You can obtain the sha256sum with the following command:&lt;br /&gt;
&lt;br /&gt;
 git archive --format=tar --prefix=gramps-{{version}} v{{version}} | gzip | sha256sum&lt;br /&gt;
&lt;br /&gt;
Alternatively, download it and use:&lt;br /&gt;
&lt;br /&gt;
 sha256sum gramps-{{version}}.tar.gz&lt;br /&gt;
&lt;br /&gt;
* Click '''Publish Release''' at the bottom of the edit area when you're satisfied with the contents.&lt;br /&gt;
&lt;br /&gt;
===SourceForge===&lt;br /&gt;
* Go to [https://sourceforge.net/projects/gramps/files/ the SourceForge files page] and log in if necessary.&lt;br /&gt;
* Click on '''Stable''' or '''Unstable''' depending on the class of the release you're making.&lt;br /&gt;
* Click '''Add Folder''' and name the directory for the release version. Click &amp;quot;'Create'&amp;quot;. Click your new folder to enter it.&lt;br /&gt;
* You can either download the GitHub-generated tarball or create one locally:&lt;br /&gt;
  python3 setup.py sdist&lt;br /&gt;
* Click '''Add File''' and drag the tarball to the drop area on the web page.&lt;br /&gt;
* Copy the release notes from GitHub into a file called README.md and upload it.&lt;br /&gt;
&lt;br /&gt;
==Announcing the new release==&lt;br /&gt;
* update mantisdb(Bug/issue database) and enable the new version via Admin:Projects item for reporting issues. (You will need a high-enough status on the bug tracker in order to do this, so you can ask an appropriate person if you aren't.)&lt;br /&gt;
* announce on gramps-announce@lists.sourceforge.net, gramps-devel@lists.sourceforge.net and gramps-users@lists.sourceforge.net (You will need to be a member of all three lists first, to send to them.)&lt;br /&gt;
* announce on the Discourse forum in the &amp;quot;[https://gramps.discourse.group/c/gramps-announce Announcements]&amp;quot; category.&lt;br /&gt;
* announce on Gramps [https://gramps-project.org/blog/blog/ blog] (File under: [https://gramps-project.org/blog/category/releases/ Gramps Releases] and [https://gramps-project.org/blog/category/news/  News]) (not needed for an alpha or beta release)&lt;br /&gt;
* update [[News]] section on this wiki (not needed for an alpha or beta release)&lt;br /&gt;
* update the list of [[Previous releases of Gramps|previous releases]]&lt;br /&gt;
* update reference to the new version on the [[Template:Version|wiki template]] &amp;lt;small&amp;gt;{{version}}&amp;lt;/small&amp;gt;  (not needed for an alpha or beta release)&lt;br /&gt;
* Verify other [[:Category:Versions|&amp;quot;version&amp;quot; Wiki templates]] values: Last version, Stable version, etc.&lt;br /&gt;
* update [[HeadlineNews]] (not needed for an alpha or beta release)&lt;br /&gt;
* update &amp;lt;nowiki&amp;gt;{{version-released}}&amp;lt;/nowiki&amp;gt; [https://gramps-project.org/wiki/index.php/Template:Version-released date template] for the [[Download]] pages &amp;lt;small&amp;gt;{{version-released}}&amp;lt;/small&amp;gt; (not needed for an alpha or beta release)&lt;br /&gt;
* change the Matrix room title and IRC channel title (not needed for an alpha or beta release) &lt;br /&gt;
* update the version number at [https://en.wikipedia.org/wiki/Gramps_(software) Wikipedia] (not needed for an alpha or beta release)&lt;br /&gt;
&lt;br /&gt;
==Post-release==&lt;br /&gt;
* merge forward the &amp;lt;code&amp;gt;NEWS&amp;lt;/code&amp;gt; file&lt;br /&gt;
&lt;br /&gt;
=See also=&lt;br /&gt;
*Category [[:Category:Versions|Versions]] : [[Template:Version_Templates|Template]]&lt;br /&gt;
*Building a distribution to share as on the [[Download]] page&lt;br /&gt;
:[[File:Windows_32x32.png]] [[Building Gramps AIO cx freeze-based]] - Updating the MS-Windows All-In-One package&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[File:Linux 32x32.png]]   please add link to instructions on building Gramps installers for Linux. proofed while building v5.1.3  &lt;br /&gt;
:[[File:Beastie 32x32.png]]   please add link to instructions on building Gramps installer for BSD. proofed while building v5.1.3  &lt;br /&gt;
:[[File:Apple logo black 32x32.png]]   please add link to instructions on building Gramps installer for Apple. proofed while building v5.1.3  &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* [[Brief introduction to Git]]&lt;br /&gt;
* [[Running a development version of Gramps]]&lt;br /&gt;
* [[:Category:Developers/Packaging]]&lt;br /&gt;
* [[:Category:AppData]] - Screenshots used by Appdata - Debian&lt;br /&gt;
* [[.dtd and .rng]]&lt;br /&gt;
* [[Rollover_for_the_manual|Rollover for the Wiki]] - for major and feature releases. No rollover for maintenance releases.&lt;br /&gt;
* [[Special:WhatLinksHere/Template:Bug|List of pages linked to Bug Report template]] - verify the reported issues still apply to the new release. Leave links in place for any issue fixed in maintenance releases. Simply add notations for the version where the fix was applied. Remove links for fixed issues in Rollovers.&lt;br /&gt;
&lt;br /&gt;
=External links=&lt;br /&gt;
* https://github.com/gramps-project&lt;br /&gt;
* https://gramps-project.org/cpanel&lt;br /&gt;
* https://sourceforge.net/projects/gramps/&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Packaging]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130283</id>
		<title>Programming guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130283"/>
		<updated>2026-04-09T18:38:30Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: suggest standalone black installation as the least preferred option&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a multi-programmer environment, it is important to follow common coding guidelines to make sure the code remains maintainable. &lt;br /&gt;
&lt;br /&gt;
== Coding style ==&lt;br /&gt;
&lt;br /&gt;
=== PEP8 ===&lt;br /&gt;
* Write [https://www.python.org/dev/peps/pep-0008/ PEP 8] compatible code! This is important to have a consistent, readable codebase.&lt;br /&gt;
** it is not explicit in PEP8, but we like a space after a comma&lt;br /&gt;
&lt;br /&gt;
=== Tabs ===&lt;br /&gt;
* Do not use TABs. Use space characters. In Gramps we use 4 spaces for indentation. This does not mean you must set your TAB stops to 4. TABs and indents are not the same thing. Most editors have a configuration option to set indentation and TAB stops. Be careful to just set the '''indentation''' to 4, which automatically means it has to be '''spaces'''. TABs are still necessary, in Makefiles for example, and they '''have to''' be equivalent to 8 spaces, '''always'''. To summarize:&lt;br /&gt;
** uses spaces, no TABs&lt;br /&gt;
** indentation is 4&lt;br /&gt;
** TAB stops (if any) are at position 9,17,25,... (first column is 1)&lt;br /&gt;
&lt;br /&gt;
=== Members names ===&lt;br /&gt;
* Private class functions (functions that cannot be called outside the class) should be preceded with two underscores. &lt;br /&gt;
* Protected functions (functions that can only be called by the class or derived classes) should be preceded with one underscore.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __private_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
 &lt;br /&gt;
def _protected_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&lt;br /&gt;
Names of callbacks should be prefixed by 'cb_'.  For example, &amp;lt;code&amp;gt;cb_my_callback&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; does not check that arguments are used when methods are named in this way.  This is useful to avoid the &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; warning:  'W0613: Unused argument &amp;lt;arg&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
=== Imports ===&lt;br /&gt;
The top module is called gramps, and it has following submodules:&lt;br /&gt;
* gen&lt;br /&gt;
* cli&lt;br /&gt;
* gui&lt;br /&gt;
* plugins&lt;br /&gt;
The other dirs should not contain code, or are for testing.&lt;br /&gt;
&lt;br /&gt;
Within a submodule, only relative imports are allowed of the own submodule (so starting with . or with a module of the own directory), and absolute imports of other submodules (so starting with &amp;lt;code&amp;gt;gramps.&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{man note|Important:|files in the gen submodule are '''not''' allowed to import files from the other submodules. So &amp;lt;code&amp;gt;gen&amp;lt;/code&amp;gt; should be self-contained.}}&lt;br /&gt;
&lt;br /&gt;
== Class headers ==&lt;br /&gt;
* Each class should have a simple header to help mark it in the file. This is not used for documentation - it is used to help find the class when multiple classes exist in the same file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
#&lt;br /&gt;
# MyClass&lt;br /&gt;
#&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
* Python provides a docstrings to document classes and functions. If the class is a class used by others (such as the [http://www.gramps-project.org/docs/gen/gen_lib.html#module-gen.lib gen lib] classes), the docstrings should follow the restructuredtext ([http://docutils.sourceforge.net/docs/user/rst/quickstart.html#structure rst]) format. This allows us to extract [http://www.gramps-project.org/docs/ API] documentation [[Devhelp#See_also|using Sphinx]], a documentation generator for Python code.&lt;br /&gt;
&lt;br /&gt;
* Aside from adding doc strings to classes and functions, also the api generating rst files must be edited so as to extract the documentation. These files are in the [https://github.com/gramps-project/gramps/tree/master/docs docs directory], for info read the [https://github.com/gramps-project/gramps/blob/master/docs/README.txt /docs/README.txt] file.&lt;br /&gt;
&lt;br /&gt;
:More info&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/markup/ Sphinx for python]&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/rest.html doc with Sphinx]&lt;br /&gt;
&lt;br /&gt;
Classes that are not core reusable classes do not have to follow this format (although we encourage you do), but should be documented using docstrings.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    MyClass is a sample class.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    def my_function(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        The my_function task serves no purpose whatsoever.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black ==&lt;br /&gt;
Gramps CI checks for code formatting compliance using [https://github.com/psf/black Black]. &lt;br /&gt;
&lt;br /&gt;
Black can be installed as a [https://pypi.org/project/black/ Python PIP package,] as a plugin/integration to many IDEs, or as a [https://github.com/psf/black/releases/ standalone tool] on the system. Follow the [https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html usage instructions] on the Black docs to validate your file changes. Doing this prior to creating the Pull Request ensures that it will pass the lint check.&lt;br /&gt;
&lt;br /&gt;
If code in a PR violates formatting rules the PR fails the CI check, and cannot be merged. Code which requires changes is shown in the Checks tab in the Lint panel. Make changes required to make the lint check pass. Sometimes the changes are not visible because they are white space violations, so look carefully. When using Black locally, use the same version as the CI system to ensure formatting consistency.&lt;br /&gt;
&lt;br /&gt;
== Pylint ==&lt;br /&gt;
* Run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; on your code before checking in. &lt;br /&gt;
* New files shall have a Pylint score of 9 or higher, but not enforced by CI tools as Black formatting is.&lt;br /&gt;
* Any changes to existing files with a Pylint score lower than 9 shall not reduce the Pylint score. It is expected that over time, this policy will cause all files to eventually have a score of 9 or higher.&lt;br /&gt;
&lt;br /&gt;
Note that you must run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt; directory. If import errors still occur, add a PYTHONPATH. Example usage:&lt;br /&gt;
  me@laptop:~/programs/master/src$ PYTHONPATH=plugins/lib/ pylint --reports=y plugins/mapservices/googlemap.py&lt;br /&gt;
Set reports to '''n''' to have less output. Information on the meaning of codes can be found here:&lt;br /&gt;
* [http://pylint-messages.wikidot.com/all-codes All codes, PyLint 1.1.0] Messages: and what they're trying to tell you&lt;br /&gt;
* [https://pylint.readthedocs.io/en/stable/user_guide/messages Pylint current stable] documentation - now generally has a bit more detail that the older version&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Maintain good code hygiene by following coding guidelines and running code analysis and formatting tools locally&lt;br /&gt;
&lt;br /&gt;
* Always develop with [[Coding_for_translation|language translation]] in mind &lt;br /&gt;
&lt;br /&gt;
* Reduce dependencies (imports) between files.&lt;br /&gt;
&lt;br /&gt;
* Think on [[Accessibility]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130274</id>
		<title>Programming guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130274"/>
		<updated>2026-04-09T16:38:39Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: move punctuation within URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a multi-programmer environment, it is important to follow common coding guidelines to make sure the code remains maintainable. &lt;br /&gt;
&lt;br /&gt;
== Coding style ==&lt;br /&gt;
&lt;br /&gt;
=== PEP8 ===&lt;br /&gt;
* Write [https://www.python.org/dev/peps/pep-0008/ PEP 8] compatible code! This is important to have a consistent, readable codebase.&lt;br /&gt;
** it is not explicit in PEP8, but we like a space after a comma&lt;br /&gt;
&lt;br /&gt;
=== Tabs ===&lt;br /&gt;
* Do not use TABs. Use space characters. In Gramps we use 4 spaces for indentation. This does not mean you must set your TAB stops to 4. TABs and indents are not the same thing. Most editors have a configuration option to set indentation and TAB stops. Be careful to just set the '''indentation''' to 4, which automatically means it has to be '''spaces'''. TABs are still necessary, in Makefiles for example, and they '''have to''' be equivalent to 8 spaces, '''always'''. To summarize:&lt;br /&gt;
** uses spaces, no TABs&lt;br /&gt;
** indentation is 4&lt;br /&gt;
** TAB stops (if any) are at position 9,17,25,... (first column is 1)&lt;br /&gt;
&lt;br /&gt;
=== Members names ===&lt;br /&gt;
* Private class functions (functions that cannot be called outside the class) should be preceded with two underscores. &lt;br /&gt;
* Protected functions (functions that can only be called by the class or derived classes) should be preceded with one underscore.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __private_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
 &lt;br /&gt;
def _protected_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&lt;br /&gt;
Names of callbacks should be prefixed by 'cb_'.  For example, &amp;lt;code&amp;gt;cb_my_callback&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; does not check that arguments are used when methods are named in this way.  This is useful to avoid the &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; warning:  'W0613: Unused argument &amp;lt;arg&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
=== Imports ===&lt;br /&gt;
The top module is called gramps, and it has following submodules:&lt;br /&gt;
* gen&lt;br /&gt;
* cli&lt;br /&gt;
* gui&lt;br /&gt;
* plugins&lt;br /&gt;
The other dirs should not contain code, or are for testing.&lt;br /&gt;
&lt;br /&gt;
Within a submodule, only relative imports are allowed of the own submodule (so starting with . or with a module of the own directory), and absolute imports of other submodules (so starting with &amp;lt;code&amp;gt;gramps.&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{man note|Important:|files in the gen submodule are '''not''' allowed to import files from the other submodules. So &amp;lt;code&amp;gt;gen&amp;lt;/code&amp;gt; should be self-contained.}}&lt;br /&gt;
&lt;br /&gt;
== Class headers ==&lt;br /&gt;
* Each class should have a simple header to help mark it in the file. This is not used for documentation - it is used to help find the class when multiple classes exist in the same file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
#&lt;br /&gt;
# MyClass&lt;br /&gt;
#&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
* Python provides a docstrings to document classes and functions. If the class is a class used by others (such as the [http://www.gramps-project.org/docs/gen/gen_lib.html#module-gen.lib gen lib] classes), the docstrings should follow the restructuredtext ([http://docutils.sourceforge.net/docs/user/rst/quickstart.html#structure rst]) format. This allows us to extract [http://www.gramps-project.org/docs/ API] documentation [[Devhelp#See_also|using Sphinx]], a documentation generator for Python code.&lt;br /&gt;
&lt;br /&gt;
* Aside from adding doc strings to classes and functions, also the api generating rst files must be edited so as to extract the documentation. These files are in the [https://github.com/gramps-project/gramps/tree/master/docs docs directory], for info read the [https://github.com/gramps-project/gramps/blob/master/docs/README.txt /docs/README.txt] file.&lt;br /&gt;
&lt;br /&gt;
:More info&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/markup/ Sphinx for python]&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/rest.html doc with Sphinx]&lt;br /&gt;
&lt;br /&gt;
Classes that are not core reusable classes do not have to follow this format (although we encourage you do), but should be documented using docstrings.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    MyClass is a sample class.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    def my_function(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        The my_function task serves no purpose whatsoever.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black ==&lt;br /&gt;
Gramps CI checks for code formatting compliance using [https://github.com/psf/black Black]. &lt;br /&gt;
&lt;br /&gt;
Black can be installed as a [https://github.com/psf/black/releases/ standalone tool] on the system, as a [https://pypi.org/project/black/ Python PIP package,] or as a plugin/integration to many IDEs. Follow the [https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html usage instructions] on the Black docs to validate your file changes. Doing this prior to creating the Pull Request ensures that it will pass the lint check.&lt;br /&gt;
&lt;br /&gt;
If code in a PR violates formatting rules the PR fails the CI check, and cannot be merged. Code which requires changes is shown in the Checks tab in the Lint panel. Make changes required to make the lint check pass. Sometimes the changes are not visible because they are white space violations, so look carefully. When using Black locally, use the same version as the CI system to ensure formatting consistency.&lt;br /&gt;
&lt;br /&gt;
== Pylint ==&lt;br /&gt;
* Run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; on your code before checking in. &lt;br /&gt;
* New files shall have a Pylint score of 9 or higher, but not enforced by CI tools as Black formatting is.&lt;br /&gt;
* Any changes to existing files with a Pylint score lower than 9 shall not reduce the Pylint score. It is expected that over time, this policy will cause all files to eventually have a score of 9 or higher.&lt;br /&gt;
&lt;br /&gt;
Note that you must run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt; directory. If import errors still occur, add a PYTHONPATH. Example usage:&lt;br /&gt;
  me@laptop:~/programs/master/src$ PYTHONPATH=plugins/lib/ pylint --reports=y plugins/mapservices/googlemap.py&lt;br /&gt;
Set reports to '''n''' to have less output. Information on the meaning of codes can be found here:&lt;br /&gt;
* [http://pylint-messages.wikidot.com/all-codes All codes, PyLint 1.1.0] Messages: and what they're trying to tell you&lt;br /&gt;
* [https://pylint.readthedocs.io/en/stable/user_guide/messages Pylint current stable] documentation - now generally has a bit more detail that the older version&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Maintain good code hygiene by following coding guidelines and running code analysis and formatting tools locally&lt;br /&gt;
&lt;br /&gt;
* Always develop with [[Coding_for_translation|language translation]] in mind &lt;br /&gt;
&lt;br /&gt;
* Reduce dependencies (imports) between files.&lt;br /&gt;
&lt;br /&gt;
* Think on [[Accessibility]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130273</id>
		<title>Programming guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=130273"/>
		<updated>2026-04-09T16:17:08Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Elaborate on usage of Black&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a multi-programmer environment, it is important to follow common coding guidelines to make sure the code remains maintainable. &lt;br /&gt;
&lt;br /&gt;
== Coding style ==&lt;br /&gt;
&lt;br /&gt;
=== PEP8 ===&lt;br /&gt;
* Write [https://www.python.org/dev/peps/pep-0008/ PEP 8] compatible code! This is important to have a consistent, readable codebase.&lt;br /&gt;
** it is not explicit in PEP8, but we like a space after a comma&lt;br /&gt;
&lt;br /&gt;
=== Tabs ===&lt;br /&gt;
* Do not use TABs. Use space characters. In Gramps we use 4 spaces for indentation. This does not mean you must set your TAB stops to 4. TABs and indents are not the same thing. Most editors have a configuration option to set indentation and TAB stops. Be careful to just set the '''indentation''' to 4, which automatically means it has to be '''spaces'''. TABs are still necessary, in Makefiles for example, and they '''have to''' be equivalent to 8 spaces, '''always'''. To summarize:&lt;br /&gt;
** uses spaces, no TABs&lt;br /&gt;
** indentation is 4&lt;br /&gt;
** TAB stops (if any) are at position 9,17,25,... (first column is 1)&lt;br /&gt;
&lt;br /&gt;
=== Members names ===&lt;br /&gt;
* Private class functions (functions that cannot be called outside the class) should be preceded with two underscores. &lt;br /&gt;
* Protected functions (functions that can only be called by the class or derived classes) should be preceded with one underscore.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __private_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
 &lt;br /&gt;
def _protected_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&lt;br /&gt;
Names of callbacks should be prefixed by 'cb_'.  For example, &amp;lt;code&amp;gt;cb_my_callback&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; does not check that arguments are used when methods are named in this way.  This is useful to avoid the &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; warning:  'W0613: Unused argument &amp;lt;arg&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
=== Imports ===&lt;br /&gt;
The top module is called gramps, and it has following submodules:&lt;br /&gt;
* gen&lt;br /&gt;
* cli&lt;br /&gt;
* gui&lt;br /&gt;
* plugins&lt;br /&gt;
The other dirs should not contain code, or are for testing.&lt;br /&gt;
&lt;br /&gt;
Within a submodule, only relative imports are allowed of the own submodule (so starting with . or with a module of the own directory), and absolute imports of other submodules (so starting with &amp;lt;code&amp;gt;gramps.&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{man note|Important:|files in the gen submodule are '''not''' allowed to import files from the other submodules. So &amp;lt;code&amp;gt;gen&amp;lt;/code&amp;gt; should be self-contained.}}&lt;br /&gt;
&lt;br /&gt;
== Class headers ==&lt;br /&gt;
* Each class should have a simple header to help mark it in the file. This is not used for documentation - it is used to help find the class when multiple classes exist in the same file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
#&lt;br /&gt;
# MyClass&lt;br /&gt;
#&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
* Python provides a docstrings to document classes and functions. If the class is a class used by others (such as the [http://www.gramps-project.org/docs/gen/gen_lib.html#module-gen.lib gen lib] classes), the docstrings should follow the restructuredtext ([http://docutils.sourceforge.net/docs/user/rst/quickstart.html#structure rst]) format. This allows us to extract [http://www.gramps-project.org/docs/ API] documentation [[Devhelp#See_also|using Sphinx]], a documentation generator for Python code.&lt;br /&gt;
&lt;br /&gt;
* Aside from adding doc strings to classes and functions, also the api generating rst files must be edited so as to extract the documentation. These files are in the [https://github.com/gramps-project/gramps/tree/master/docs docs directory], for info read the [https://github.com/gramps-project/gramps/blob/master/docs/README.txt /docs/README.txt] file.&lt;br /&gt;
&lt;br /&gt;
:More info&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/markup/ Sphinx for python]&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/rest.html doc with Sphinx]&lt;br /&gt;
&lt;br /&gt;
Classes that are not core reusable classes do not have to follow this format (although we encourage you do), but should be documented using docstrings.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    MyClass is a sample class.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    def my_function(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        The my_function task serves no purpose whatsoever.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black ==&lt;br /&gt;
Gramps CI checks for code formatting compliance using [https://github.com/psf/black Black]. &lt;br /&gt;
&lt;br /&gt;
Black can be installed as a [https://github.com/psf/black/releases/ standalone tool] on the system, as a [https://pypi.org/project/black/ Python PIP package], or as a plugin/integration to many IDEs. Follow the [https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html usage instructions] on the Black docs to validate your file changes. Doing this prior to creating the Pull Request ensures that it will pass the lint check.&lt;br /&gt;
&lt;br /&gt;
If code in a PR violates formatting rules the PR fails the CI check, and cannot be merged. Code which requires changes is shown in the Checks tab in the Lint panel. Make changes required to make the lint check pass. Sometimes the changes are not visible because they are white space violations, so look carefully. When using Black locally, use the same version as the CI system to ensure formatting consistency.&lt;br /&gt;
&lt;br /&gt;
== Pylint ==&lt;br /&gt;
* Run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; on your code before checking in. &lt;br /&gt;
* New files shall have a Pylint score of 9 or higher, but not enforced by CI tools as Black formatting is.&lt;br /&gt;
* Any changes to existing files with a Pylint score lower than 9 shall not reduce the Pylint score. It is expected that over time, this policy will cause all files to eventually have a score of 9 or higher.&lt;br /&gt;
&lt;br /&gt;
Note that you must run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt; directory. If import errors still occur, add a PYTHONPATH. Example usage:&lt;br /&gt;
  me@laptop:~/programs/master/src$ PYTHONPATH=plugins/lib/ pylint --reports=y plugins/mapservices/googlemap.py&lt;br /&gt;
Set reports to '''n''' to have less output. Information on the meaning of codes can be found here:&lt;br /&gt;
* [http://pylint-messages.wikidot.com/all-codes All codes, PyLint 1.1.0] Messages: and what they're trying to tell you&lt;br /&gt;
* [https://pylint.readthedocs.io/en/stable/user_guide/messages Pylint current stable] documentation - now generally has a bit more detail that the older version&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Maintain good code hygiene by following coding guidelines and running code analysis and formatting tools locally&lt;br /&gt;
&lt;br /&gt;
* Always develop with [[Coding_for_translation|language translation]] in mind &lt;br /&gt;
&lt;br /&gt;
* Reduce dependencies (imports) between files.&lt;br /&gt;
&lt;br /&gt;
* Think on [[Accessibility]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:Graph_View&amp;diff=130268</id>
		<title>Addon:Graph View</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:Graph_View&amp;diff=130268"/>
		<updated>2026-04-08T15:58:05Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: GraphViz configuration for PortableApps installation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Addon:Graph View}}&lt;br /&gt;
{{Third-party addon}}&lt;br /&gt;
[[File:Graph-View-addon-example-60.png|450px|thumb|right|&amp;quot;Graph View&amp;quot; - addon - In action showing both ancestors and descendant trees]]&lt;br /&gt;
'''{{man label|Graph View}}''' is an interactive {{icon|ance}} {{man label|[[Gramps_{{man version}}_Wiki_Manual_-_Categories#Charts_Category|Charts]]}} category view addon that presents a navigable ancestors and descendant tree using the current active person as a starting point. Clicking another person in the family tree will make that person the active person and will redraw the family tree based on them.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
From the {{icon|ance}} {{man label|Charts}} category view select the '''Graph View''' icon or select {{man menu|View &amp;gt; Graph View}} from the menu.&lt;br /&gt;
&lt;br /&gt;
In general the Graph View is:&lt;br /&gt;
* Interactive, the view redraws in response to changes made to a person or family.&lt;br /&gt;
* The active person is highlighted.&lt;br /&gt;
* Clicking on another person will redraw the family tree based on that person.&lt;br /&gt;
* Clicking the active person will show the parent family of the active person, thereby allowing previous generations to be shown.&lt;br /&gt;
* A right mouse click on a person or family node shows the person or family editor as appropriate.&lt;br /&gt;
* Able to show both ancestors and descendant trees (adjustable from the Graph View toolbar).&lt;br /&gt;
* Graph view can be panned by using mouse click and drag. Select the background of the tree and drag the mouse to pan the view. Also you can use mouse scroll button to pan view in any place of view.&lt;br /&gt;
* Connecting full line style represents biological relationships and dashed lines non biological.&lt;br /&gt;
&lt;br /&gt;
=== Graph View Toolbar ===&lt;br /&gt;
[[File:Graph-View-addon-toolbar-overview-60.png]]&lt;br /&gt;
&lt;br /&gt;
Graph View has a smaller toolbar of its own with the following options (from left to right):&lt;br /&gt;
&lt;br /&gt;
* {{man button|'''+'''}} button - {{man tooltip|Zoom in}} the view.&lt;br /&gt;
* {{man button|'''-'''}} button - {{man tooltip|Zoom out}} the view.&lt;br /&gt;
* {{man button|'''1'''}} button - {{man tooltip|Zoom to original}} resets the view to the default size.&lt;br /&gt;
* {{man button|'''☐'''}} button - {{man tooltip|Zoom to best fit}} fits the current family tree graph to the displayed area.&lt;br /&gt;
* {{man button|'''⏎'''}} button - {{man tooltip|Go to active person}} centering them in the graph area.&lt;br /&gt;
* {{man button|Go to bookmark}} button - {{man tooltip|Center view on selected bookmark}} - also shows {{man label|Bookmarks for current graph:}} (who are being display) and {{man label|Other Bookmarks:}} (who are not being displayed) - along with two buttons to {{man button|Add active person}} to bookmarks and {{man button|Edit}} that brings up the {{man label|Organize bookmarks}} dialog.&lt;br /&gt;
* {{man button|🔍 Search...}} - typing shows {{man label|Persons from current graph:}} (who are being display) and {{man label|Other persons from database:}} (who are not being displayed) as well as any being able to add or remove directly to bookmarks. {{man tooltip|Search people in the current visible graph and database.&amp;lt;br&amp;gt;Use &amp;lt;{{man button|Ctrl + F}}&amp;gt; to make search entry active.}}&lt;br /&gt;
* {{man button|Generations}} - setting to change the generations shown for {{man tooltip|Ancestor generations}} 3 by default and {{man tooltip|Descendants  generations}} 10 by default.&lt;br /&gt;
* {{man button|Spacing}} - changes the {{man tooltip|Vertical spacing between generations}} (5 default) and {{man tooltip|Horizontal spacing between the generations}} (2 default).&lt;br /&gt;
* {{man button|All connected}} - {{man tooltip|Show all connected persons limited by generation restrictions. Works slow, so don't set large generation values.}} ( Limited to 1000 persons, if your family tree has more than that you get the {{man label|[[Addon:Graph_View#Incomplete_graph_warning|Incomplete graph]]}} warning and only the first 1000 connected persons are drawn.)&lt;br /&gt;
&lt;br /&gt;
==== On main Gramps Toolbar ====&lt;br /&gt;
On the main Gramps Toolbar you also have:&lt;br /&gt;
* {{man button|'''⎙'''(Print)}} button that does not print but instead allows you to save the currently displayed Graph into a dot format file for a later printing.  This will save a .gv file and a svg file. You must select a .gv file.  ([https://www.reddit.com/r/gramps/comments/jhnj9w/gramps_print_svg_does_not_show_photo/ Gramps Print -SVG does not show photo])&lt;br /&gt;
* [[File:Gramps-config.png|34px]] Configure the active view with options shown in the next section.&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
Select {{man menu|View &amp;gt; Configure...}} from the menu to change the settings on the following four tabs:&lt;br /&gt;
&lt;br /&gt;
*[[Addon:Graph_View#Layout|Layout]]&lt;br /&gt;
*[[Addon:Graph_View#Themes|Themes]]&lt;br /&gt;
*[[Addon:Graph_View#Animation|Animation]]&lt;br /&gt;
*[[Addon:Graph_View#Search|Search]]&lt;br /&gt;
&lt;br /&gt;
====Layout====&lt;br /&gt;
* {{checkbox|1}}{{man label|Show images}} (checkbox selected by default)&lt;br /&gt;
* {{checkbox|1}}{{man label|Show IDs}} (checkbox selected by default)&lt;br /&gt;
* {{checkbox|1}}{{man label|Show avatars}} (checkbox selected by default)&lt;br /&gt;
* {{checkbox|1}}{{man label|Highlight the home person}} (checkbox selected by default)&lt;br /&gt;
* {{checkbox|0}}{{man label|Show full dates}} (checkbox unselected by default)&lt;br /&gt;
* {{checkbox|0}}{{man label|Show places}} (checkbox unselected by default)&lt;br /&gt;
* {{man label|Placeformat:}} &lt;br /&gt;
** '''Default'''&lt;br /&gt;
** Full&lt;br /&gt;
* {{checkbox|0}}{{man label|Show tags}} (checkbox unselected by default)&lt;br /&gt;
* {{man label|Time Direction:}} &lt;br /&gt;
** '''Vertical: Top to Bottom'''&lt;br /&gt;
** Vertical: Bottom to Top&lt;br /&gt;
** Horizontal: Left to Right&lt;br /&gt;
** Horizontal: Right to Left&lt;br /&gt;
* {{man label|Limit number of people displayed (use 0 for unlimited):}} (&amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt; default) -  lets users set or disable a limit to the number of individuals that may be shown on an {{man button|[[Addon:Graph_View#Graph_View_Toolbar|All connected]]}} chart. If you see the {{man label|[[Addon:Graph_View#Incomplete_graph_warning|Incomplete graph warning]]}} dialog then change this to suit you. [https://github.com/gramps-project/addons-source/pull/635]&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Themes====&lt;br /&gt;
* {{man label|Person theme:}}&lt;br /&gt;
**'''Default'''&lt;br /&gt;
** Image on right side&lt;br /&gt;
** Image on left side&lt;br /&gt;
* {{man label|Path color to home person:}} '''&amp;lt;code&amp;gt;#000000&amp;lt;/code&amp;gt;'''(default)&lt;br /&gt;
* {{man label|Font:}} shows the default that can be changed by selecting from the &lt;br /&gt;
** {{man label|Pick a Font}} dialog&lt;br /&gt;
* {{man label|Avatars style:}} for person nodes.&lt;br /&gt;
** ''Custom'' - adds four more popup entries to allow you to select your own avatar images:&lt;br /&gt;
*** {{man label|Male avatar:}} ''File selector''&lt;br /&gt;
*** {{man label|Female avatar:}} ''File selector''&lt;br /&gt;
*** {{man label|Unknown avatar:}} ''File selector''&lt;br /&gt;
*** {{man label|Other avatar:}} ''File selector''&lt;br /&gt;
** '''Dark (default)'''&lt;br /&gt;
** ''Light''&lt;br /&gt;
** ''Cartoon''&lt;br /&gt;
** ''Modern''&lt;br /&gt;
** ''Updated''&lt;br /&gt;
** ''Generic (dark)''&lt;br /&gt;
** ''Generic (grey)''&lt;br /&gt;
** ''Generic (light)''&lt;br /&gt;
[[File:Graph-View Avatar set.png|471px|thumb|right|Graph View - Avatar styles (Left to right: '''Dark''' / '''Light''' / '''Cartoon''')]]&lt;br /&gt;
* {{man label|Active person border size:}} &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;(default)&lt;br /&gt;
* {{man label|Person border size:}} &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;(default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Animation====&lt;br /&gt;
*{{checkbox|1}}{{man label|Show animation}} (checkbox selected by default)&lt;br /&gt;
**{{man label|Animation speed (1..5 and 5 is the slower):}} (default is 3)&lt;br /&gt;
**{{man label|Animation count (0..8 use 0 to turn off):}} (default is 4)&lt;br /&gt;
{{-}}&lt;br /&gt;
====Search====&lt;br /&gt;
*{{checkbox|1}}{{man label|Search in all database}} (checkbox selected by default)&lt;br /&gt;
*{{checkbox|1}}{{man label|Show person images}} (checkbox selected by default)&lt;br /&gt;
*{{checkbox|1}}{{man label|Show bookmarked first}} (checkbox selected by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===Context menus===&lt;br /&gt;
Graph view has three [https://en.wikipedia.org/wiki/Context_menu context menus] that allow the following:&lt;br /&gt;
*[[#Empty_section|Empty section]]&lt;br /&gt;
*[[#Person_node|Person node]]&lt;br /&gt;
*[[#Family_node|Family node]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
====Empty section====&lt;br /&gt;
[[File:GraphView-empty-context menu-52.png|thumb|450px|Right click menu shown when selecting an empty section of the chart.]]&lt;br /&gt;
Right-click an empty section of the Graph View to offer the following display options:&lt;br /&gt;
* {{checkbox|1}}{{man menu|Show images}} - Display thumbnails or avatars&lt;br /&gt;
* {{checkbox|1}}{{man menu|Highlight the home person}} - set the background of the Home Person to green&lt;br /&gt;
* {{checkbox|0}}{{man menu|Show full dates}} - format the birth and death date as only the year or as the complete date&lt;br /&gt;
* {{checkbox|0}}{{man menu|Show places}} - show or hide birth and death places&lt;br /&gt;
* {{checkbox|0}}{{man menu|Show tags}} - show color markers on tagged Persons and Families&lt;br /&gt;
* {{checkbox|1}}{{man menu|Show animation}} - after redraws, wiggle the Active Person to draw focus&lt;br /&gt;
* {{man menu|Lines type}} - choose the style of lines connecting People and Families&lt;br /&gt;
** {{man menu|''Direct''}}&lt;br /&gt;
** {{man menu|'''Curves'''}} (default)&lt;br /&gt;
** {{man menu|''Ortho''}}&lt;br /&gt;
* {{man menu|About Graph View}} - this help wiki webpage&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Person node====&lt;br /&gt;
[[File:GraphView-person-node-context-menu-52.png|thumb|450px|Right click menu shown when selecting a Person on the chart.]]&lt;br /&gt;
Right-click a person (node) to show a context menu offering the following options for the indicated person:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|Edit}}&lt;br /&gt;
* {{man menu|Copy}}&lt;br /&gt;
* {{man menu|Delete}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|Events}}&lt;br /&gt;
* {{man menu|Tags}}&lt;br /&gt;
* {{man menu|Spouses}}&lt;br /&gt;
* {{man menu|Siblings}}&lt;br /&gt;
* {{man menu|Children}}&lt;br /&gt;
* {{man menu|Parents}}&lt;br /&gt;
* {{man menu|Related}} - shows people sharing an event &lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|Set as home person}}&lt;br /&gt;
* {{man menu|Show path to home person}} - changes the view to show how these two people connect to their common ancestor&lt;br /&gt;
* {{man menu|Add to bookmarks}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|[[Gramps_{{man version}}_Wiki_Manual_-_Gramplets#Quick_View|Quick View]]}}&lt;br /&gt;
* {{man menu|[[Addon:Web_Connect_Pack|Web Connection]]}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|About Graph View}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Family node====&lt;br /&gt;
[[File:GraphView-family-node-context-menu-52.png|thumb|450px|Right click menu shown when selecting a Family (node) on the chart.]]&lt;br /&gt;
Right click a family (node) to add or delete a spouse or child.&lt;br /&gt;
&lt;br /&gt;
* {{man menu|Edit}}&lt;br /&gt;
* {{man menu|Delete}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|Events}}&lt;br /&gt;
* {{man menu|Tags}}&lt;br /&gt;
* {{man menu|Spouses}}&lt;br /&gt;
* {{man menu|Children}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|[[Gramps_{{man version}}_Wiki_Manual_-_Gramplets#Quick_View|Quick View]]}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* {{man menu|About Graph View}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==={{man label|Incomplete graph}} warning ===&lt;br /&gt;
[[File:Incomplete-graph-warning-graphview-addon-60.png|thumb|450px|right]]&amp;lt;!--Update message --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''This graph would contain at least {people_count} people, which exceeds the limit of {people_limit} people. For performance reasons, at least {people_missing} people won't be shown. You can change this limit in the view configuration.''&lt;br /&gt;
&lt;br /&gt;
The limit may be removed or changed by setting the [[Addon:Graph_View#Layout|Layout]] tabs {{man label|Limit number of people displayed (use 0 for unlimited):}} option.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--{{man warn|Feature is slow in larger Trees|The larger the number of people in the Family Tree, the longer the chart will take to appear.&amp;lt;br /&amp;gt;e.g.: a test with about 7000 people took 10 minutes.&amp;lt;/br&amp;gt;This can be adjusted by changing the number of generations to be shown.}}--&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Before '''Graph View''' can be used you will need the following installed:&lt;br /&gt;
* [[Output_formats#Graphviz|Graphviz]]. If you can run the Gramps [[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_5|Graph reports]] then you already have this installed.&lt;br /&gt;
* [https://wiki.gnome.org/Projects/GObjectIntrospection Goocanvas2 or gir1.2-goocanvas] (Gramps 4.x or greater)&lt;br /&gt;
** [https://wiki.gnome.org/Attic/PyGoocanvas PyGoocanvas] (Gramps 3.x)&lt;br /&gt;
* [https://wiki.gnome.org/action/show/Projects/GooCanvas Goocanvas]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
These are already installed if you are using the Gramps All In One installer eg: &amp;lt;code&amp;gt;GrampsAIOxxxxx.exe&amp;lt;/code&amp;gt;. If you are using the Gramps v6.0.6 PortableApps installer, GraphViz is installed but not configured. Execute these steps once after installing to fix that:&lt;br /&gt;
&lt;br /&gt;
# Open a command prompt&lt;br /&gt;
# Change to the GrampsPortable\App\Gramps folder, e.g. &amp;lt;code&amp;gt;cd C:\GrampsPortable\App\Gramps&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ask dot to configure plugins and write a configuration file by executing: &amp;lt;code&amp;gt;lib\dot.exe -c&amp;lt;/code&amp;gt;&lt;br /&gt;
# Launch GrampsPortable and switch to the GraphView and you should see a chart.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
All of these should be available in common Linux distributions. &lt;br /&gt;
&lt;br /&gt;
For example, &lt;br /&gt;
&lt;br /&gt;
;Debian&lt;br /&gt;
Packages &amp;lt;code&amp;gt;Goocanvas&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PyGoocanvas&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;libgoocanvas3&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;python-pygoocanvas&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note: As of May 2020 the required packages for Debian Testing are &amp;lt;code&amp;gt;gir1.2-goocanvas-2.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libgoocanvas-2.0-9&amp;lt;/code&amp;gt; from the official repositories.&lt;br /&gt;
&lt;br /&gt;
Please make sure to download these for the proper architecture, like amd64 for 64-bit PCs (Intel included).&lt;br /&gt;
&lt;br /&gt;
;Fedora&lt;br /&gt;
Try package &amp;lt;code&amp;gt;goocanvas2-devel&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;Opensuse&lt;br /&gt;
You may need to install &amp;lt;code&amp;gt;typelib-1_0-GooCanvas-2_0&amp;lt;/code&amp;gt; as mentioned in issue {{bug|8076}}.&lt;br /&gt;
&lt;br /&gt;
=== macOS ===&lt;br /&gt;
These are already installed if you are using the Gramps All In One installer eg: &amp;lt;code&amp;gt;Gramps-Intel-xxxxx.dmg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Gramps-Arm-xxxxx.dmg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
You can see related issues at [https://gramps-project.org/bugs/search.php?tag_string=GraphView bug tracker].&lt;br /&gt;
* {{bug|8054#c44291}} - print options.&lt;br /&gt;
* {{bug|9806}} - Subprocess on [GraphView] can generate a memory issue.&lt;br /&gt;
* {{bug|8054}} - Better label positioning in Graphview.&lt;br /&gt;
* [https://gramps-project.org/bugs/view.php?id=8964 8964: Enable filter on GraphView] Feature Request.&lt;br /&gt;
* [https://github.com/gramps-project/addons-source/pull/459 &amp;amp;#91;GraphView&amp;amp;#93; add custom avatars #459].&lt;br /&gt;
**[https://gramps.discourse.group/t/customizable-avatars-for-graphview/696 Themed avatar discussion].&lt;br /&gt;
* {{bug|14120}} - GraphView configuration for PortableApp installers. This has been [https://portableapps.com/comment/263547#comment-263547 reported to the PortableApps team].&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Addon:AvatarGenerator]] - allows you to add and remove one or several images for a selected set of filtered people. &lt;br /&gt;
&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Views]]&lt;br /&gt;
[[Category:Prerequisites|G]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=129796</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=129796"/>
		<updated>2026-01-30T06:48:52Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Remove hyperlink so commands are easier to copy in HTTPS protocol section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
{{man note|More upto date information:|* https://github.com/gramps-project/addons-source/blob/maintenance/gramps{{Stable_branch}}/CONTRIBUTING.md&amp;lt;br&amp;gt;&lt;br /&gt;
* https://github.com/gramps-project/addons-source/blob/maintenance/gramps{{Stable_branch}}/MAINTAINERS.md}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- sync with https://gramps-project.org/wiki/index.php?title=Addon_list_legend&amp;amp;action=edit&amp;amp;section=2 --&amp;gt; &lt;br /&gt;
* '''Importer''' (IMPORT) - adds additional file format import options to Gramps&lt;br /&gt;
* '''Exporter''' (EXPORT) - adds additional file format export options to Gramps&lt;br /&gt;
* '''[[Gramps_Glossary#gramplet|Gramplet]]''' (GRAMPLET) - adds a new interactive interface section to a Gramps view mode, which can be activated by right-clicking on the dashboard View or from the menu of the Sidebar/Bottombar in the other view categories. &lt;br /&gt;
* '''Gramps [[Gramps_Glossary#viewmode|View ''(mode)'']]''' (VIEW) - adds a new view mode to the list of views available within a [[Gramps_Glossary#view|View Category]]&lt;br /&gt;
* '''[[Map_Services|Map Service]]''' (MAPSERVICE) - adds new mapping options to Gramps&lt;br /&gt;
* '''Plugin lib''' (GENERAL) - libraries that are present giving extra functionality. Can add, replace and or modifies builtin Gramps options.&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_8#Quick_Views|Quickreport'''/'''Quickview]]''' (QUICKREPORT) - a view that you can run by right-clicking on object, or if a person quickview, then through the Quick View Gramplet&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_1|Report]]''' (REPORT) - adds a new output report / includes '''Website''' - output a static genealogy website based on your Gramps Family Tree data.&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Filters#Add_Rule_dialog|Rule]]''' (RULE) - adds new [[Gramps_Glossary#filter|filter]] rules. {{new|5.1}}&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Tools|Tool]]''' (TOOL) - adds a utility that helps process data from your family tree.&lt;br /&gt;
* '''Doc creator''' (DOCGEN)&lt;br /&gt;
* '''Relationships''' (RECALC)&lt;br /&gt;
* '''Sidebar''' (SIDEBAR)&lt;br /&gt;
* '''[[Database_Backends|Database]]''' (DATABASE) - add support for another database backend. {{new|5.0}}&lt;br /&gt;
* '''Thumbnailer''' (THUMBNAILER) {{new|5.2}}&lt;br /&gt;
* '''Citation formatter''' (CITE) {{new|5.2}}&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_the_addon|Announce it on the Gramps Forum]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the maintenance/gramps{{Stable_branch}} git branch, as the default is master branch for the developmental pre-release. (Currently gramps 6.1, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure, with the code for each addon in its own folder:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons addons] git repository holds built versions of the addons for each release of Gramps, and has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps42 /gramps42]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps50 /gramps50]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps51 /gramps51]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps52 /gramps52]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps{{Stable_branch}} /gramps{{Stable_branch}}]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also [https://help.github.com/articles/generating-an-ssh-key/  Connecting to GitHub with SSH] will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that all three git repositories local locations are put into the same base directory and named with the repository names in order for the make.py script commands to work as shown. From the base directory, run the following commands to create a copy of each repository. If you want to use SSH;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you want to use the HTTPS protocol:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/addons-source.git&amp;lt;/nowiki&amp;gt; addons-source&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/addons.git&amp;lt;/nowiki&amp;gt; addons&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; gramps&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps{{Stable_branch}} maintenance branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps{{Stable_branch}} origin/maintenance/gramps{{Stable_branch}}&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps61 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other prerequisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets development]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps{{Stable_branch}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' builtin configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.  The natural location for &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; files would be in the directory in which the addon is installed. (Using the main &amp;lt;code&amp;gt;gramps.ini&amp;lt;/code&amp;gt; file for addon preferences could potentially lead to a conflict between addons.) Other locations and file formats are possible. [https://gramps.discourse.group/t/add-option-for-boolean-options-in-gramplet/6371/19 The Gramps architect recommends leaving this decision to the addon developer].&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps{{Stable_branch}} build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps{{Stable_branch}} compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;6.0&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] values include: TOOL, GRAMPLET, REPORT, QUICKVIEW (formerly QUICKREPORT), IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, RELCALC, SIDEBAR, DATABASE, RULE, THUMBNAILER, and CITE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and addon '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Be sure to include attributes for author name(s) and email(s) in the form of an array of comma-separated strings. &lt;br /&gt;
&lt;br /&gt;
There is an additional set of attributes, '''maintainers''' and '''maintainers_email'''. {{new|5.2}} If you, the author, are also the maintainer it will be identical to the author attributes, but you may also designate a maintainer, in which case the maintainer will become the primary point of contact.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '6.0',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         maintainers = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         maintainers_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation in the [https://github.com/gramps-project/gramps/blob/3f0db9303f29811b43325c30149c8844c7ce24b6/gramps/gen/plug/_pluginreg.py#L23 master/gramps/gen/plug/_pluginreg.py] comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are ([https://github.com/gramps-project/gramps/blob/892fc270592095192947097d22a72834d5c70447/gramps/gen/plug/_pluginreg.py#L141-L149 gen/plug/_pluginreg.py]):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
CATEGORY_TREE       = 6&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ, CATEGORY_TREE]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '6.0',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '6.0',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '6.0',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List the Prerequistes your addon depends on ==&lt;br /&gt;
&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;depends_on = [&amp;quot;libwebconnect&amp;quot;],&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is a list of plug-in identifier's from other gpr files. This example will ensure that [[Addon:Web_Connect_Pack#Prerequisites|libwebconnect]] is loaded before your addon. If that ID can't be found, or you have a cycle (circular import), then your addons won't be loaded. The Gramps architect summarizes: &amp;quot;The depends_on list is used to specify other plugins which the plugin depends on. These will be installed automatically.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
example code used in the Addon:Web_Connect_Pack that references libwebconnect Prerequistes [https://github.com/gramps-project/addons-source/blob/1304b65a7d758bfe17339c26260473ac3e9c4061/RUWebConnectPack/RUWebPack.gpr.py#L17 RUWebPack.gpr.py#L17]&lt;br /&gt;
&lt;br /&gt;
This means that common Prerequisites can be shared between addons. So that code can be maintained in its own gpr/addon file instead of synchronizing the maintenance of multiple copies across various silos.&lt;br /&gt;
&lt;br /&gt;
Additional requirements properties were implemented in the [[Gramplets_development#Register_Options|Registration Options]] to specify prerequisites for plug-ins: [https://github.com/gramps-project/gramps/blob/0f8d4ecd429431b4df64910962f8764af9ff1766/gramps/gen/plug/_pluginreg.py#L689-L719 requires_mod (modules), requires_gi (GObject introspection) and requires_exe (executable).] {{new|5.2}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[] for addon prerequistes have a look at converting them to use &amp;quot;depends_on = &amp;quot;  like in the following addons&lt;br /&gt;
https://github.com/gramps-project/addons-source/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
https://github.com/gramps-project/gramps/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
&lt;br /&gt;
which can be a comma separated list for multiple dependencies/prerequisites (so that addons that share prerequisites import the same library?) (maybe move spell check into an addon etc? tip of the day... possibilities...)&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
mentioned in the following&lt;br /&gt;
https://sourceforge.net/p/gramps/mailman/message/27070037/&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
which is a list of id's from other gpr files. This example will ensure that libwebconnect is loaded before your plugin. If it can't be found, or you have a cycle, then your plugin won't be loaded.&lt;br /&gt;
&lt;br /&gt;
If it is a common function, perhaps libhtml is the right place to put it, and you can put a depends_on on that.&lt;br /&gt;
&lt;br /&gt;
-Doug''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
example output is on terminal only:&lt;br /&gt;
&lt;br /&gt;
Cannot resolve the following plugin dependencies:&lt;br /&gt;
   Plugin 'UK Web Connect Pack' requires: ['libwebconnect']&lt;br /&gt;
&lt;br /&gt;
[](feature)  For plugins/addons if prerequisites not available display a page stating why/what is missing that includes the addon description and a url to the support page.&lt;br /&gt;
&lt;br /&gt;
[] Gramps CLI info &amp;quot;gramps -v&amp;quot; needs a section that list third-party addons with version numbers and if prerequisites have been met.&lt;br /&gt;
&lt;br /&gt;
[]update the Addon:Prerequisites Checker Gramplet to test for your Prerequisites.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your addon inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps{{Stable_branch}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man tip|From Gramps 6.x translations can be done on Weblate. This is experimental. Initial testing has appeared successful, but please let us know if you notice any problems. The Weblate Addons component contains aggregated translations for every addon.|https://hosted.weblate.org/projects/gramps-project/addons/}}&amp;lt;!-- https://gramps-project.org/bugs/view.php?id=13646#c68218 Nick Hall &amp;quot;Weblate is set up to translate the gramps{{Stable_branch}} branch. Changes to gramps52 must still use the old manual process.&amp;quot; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps{{Stable_branch}} build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps61 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file. Include the Addon folder name in each line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Addon/README.md&lt;br /&gt;
Addon/extra_dir/*&lt;br /&gt;
Addon/help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps{{Stable_branch}}/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps61/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps{{Stable_branch}} or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps{{Stable_branch}} listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps61 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps{{Stable_branch}}/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps61/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[6.0_Addons]] or if the addon is meant for a future release [[6.1_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Addon list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce the addon ==&lt;br /&gt;
Join the [[Contact#Forum|Gramps Forum]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
{{man tip|When submitting an update the patch part of the version number  MAJOR.MINOR.PATCH  is updated during the addon build process e.g. 1.1.3  to 1.1.4|This means when your plugin has become part of the default gramps addons there is no need to run `make` yourself as it is part of the regular addon build process. You can find this step in [https://github.com/gramps-project/addons-source/blob/master/make.py#L125 addons-source/make.py].[https://gramps.discourse.group/t/should-addons-pr-include-version-number-update/2591]}}&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many Gramps developers that do support addons in various ways (translations, triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
* [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L55 PluginData in _pluginreg.py]&lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]].&lt;br /&gt;
&lt;br /&gt;
= Addon Development Tutorials and Samples =&lt;br /&gt;
&lt;br /&gt;
* [[Gramplets development|Develop an Addon Gramplet]] (add a [https://gramps.discourse.group/t/looking-for-an-example-of-a-gramplet-with-a-custom-filter-configuration-option/5967 custom filtering option])&lt;br /&gt;
* [[Develop_an_Addon_Rule|Develop an Addon Rule]] for custom filters&lt;br /&gt;
* [[Develop_an_Addon_Tool|Develop an Addon Tool]]&lt;br /&gt;
* [[Quick_Views|Develop an Addon Quick View]]&lt;br /&gt;
* Develop an Addon Report ([[Report-writing_tutorial|tutorial]], [https://gramps.discourse.group/t/sample-report-for-new-developers/3046 samples])&lt;br /&gt;
* [[Adapt_a_builtin_Report|Adapt a builtin Report]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons|*]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Brief_introduction_to_Git&amp;diff=129795</id>
		<title>Brief introduction to Git</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Brief_introduction_to_Git&amp;diff=129795"/>
		<updated>2026-01-30T06:42:50Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: SSH isn't required; link to Git's download instructions; minor re-wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|The development source code of Gramps is stored in the Git repository at GitHub.|https://github.com/gramps-project/gramps/}}&lt;br /&gt;
The Gramps project uses the [https://en.wikipedia.org/wiki/Git Git] version control system to help synchronize changes to source code from various developers, tracking changes, managing releases, etc. You are probably here because you want to do one of two things with Git; either:&lt;br /&gt;
* Download the latest maintenance source version or the development version, or else &lt;br /&gt;
* [[Brief_introduction_to_Git#Send_your_contribution_without_rights_to_push|Submit a Pull Request (PR)]] with the changes (if you don't have write access) or upload your changes (if you have write access to the repository).&lt;br /&gt;
&lt;br /&gt;
== Install Git on your system ==&lt;br /&gt;
Follow steps on Git's web site to [https://git-scm.com/install/ install Git], then [[#Configure_Git_settings|configure your Git settings]].&lt;br /&gt;
===Linux===&lt;br /&gt;
* Debian/Ubuntu: &amp;lt;code&amp;gt;sudo apt-get install git&amp;lt;/code&amp;gt;&lt;br /&gt;
* Fedora: &amp;lt;code&amp;gt;yum install git-core&amp;lt;/code&amp;gt;&lt;br /&gt;
===Microsoft-Windows===&lt;br /&gt;
* Microsoft-Windows: Download git from here https://git-scm.com/download/win&lt;br /&gt;
&lt;br /&gt;
===Apple Mac OS X===&lt;br /&gt;
* '''Mac OS X (Intel)''': Download git from here https://git-scm.com/download/mac&lt;br /&gt;
* '''Mac OS X (PPC)''': Although the git download is called '&amp;lt;code&amp;gt;[https://sourceforge.net/projects/git-osx-installer/files/ git-2.xx.x-intel-universal-mavericks.dmg]&amp;lt;/code&amp;gt;', implying that this is a universal binary, in fact only the installer is universal, the binary to be installed in actually intel only. On a PPC you will need to build git manually. Follow the instructions here: http://jnorthr.wordpress.com/2013/03/29/building-a-git-client-1-8-2-on-apple-imac-ppc-osx-10-5-8/. I think you will also need some additional tools like 'msgfmt'. I don't think this is installed by the Apple development tool Xcode, but fortunately I have it either via fink which I installed some time ago, or via MacPorts which I installed more recently.&lt;br /&gt;
&lt;br /&gt;
: Mac OS X (PPC) Eclipse. If you are using Eclipse on a PPC, then there may be missing components for installing the latest version of EGit, depending on your version of Eclipse. If you have the Helios version of Eclipse, then you will not be able to install the latest EGit because you will get ''requires 'org.eclipse.team.core 3.6.100' but it could not be found''. Installing EGit version 2.0 from http://download.eclipse.org/egit/updates-2.0 should work if you uncheck the EGit Import Support feature when selecting what to install. You will obviously lose the Import Support feature. See [http://stackoverflow.com/questions/15281273/dependency-fail-installing-egit-on-eclipse-indigo here]. You will probably need to do ''git config core.filemode false'' to get round [https://bugs.eclipse.org/bugs/show_bug.cgi?id=307560 this bug] as suggested [http://stackoverflow.com/questions/1257592/how-do-i-remove-files-saying-old-mode-100755-new-mode-100644-from-unstaged-cha here].&lt;br /&gt;
&lt;br /&gt;
If you use Eclipse then will need to locally ignore the Eclipse files as suggested at section 4.2 [https://www.vogella.com/tutorials/EclipseGit/article.html#create-gitignore-file here].&lt;br /&gt;
&lt;br /&gt;
 cd ~/&lt;br /&gt;
 touch .gitignore&lt;br /&gt;
 echo &amp;quot;.metadata&amp;quot; &amp;gt;&amp;gt; .gitignore&lt;br /&gt;
 echo &amp;quot;.project&amp;quot; &amp;gt;&amp;gt; .gitignore&lt;br /&gt;
 echo &amp;quot;.pydevproject&amp;quot; &amp;gt;&amp;gt; .gitignore&lt;br /&gt;
 echo &amp;quot;windows&amp;quot; &amp;gt;&amp;gt; .gitignore&lt;br /&gt;
&lt;br /&gt;
=== Configure Git settings ===&lt;br /&gt;
&lt;br /&gt;
Git includes your name and email address in commits.  To configure them, use the following commands: &lt;br /&gt;
 git config --global user.name &amp;quot;John Smith&amp;quot;&lt;br /&gt;
 git config --global user.email john@example.com&lt;br /&gt;
&lt;br /&gt;
Git will automatically convert line endings for you.  Use the following settings:&lt;br /&gt;
 git config --global core.autocrlf true  # Windows&lt;br /&gt;
 git config --global core.autocrlf input  # Linux/Mac&lt;br /&gt;
&lt;br /&gt;
Git can invoke your favorite editor for commit messages, rebasing etc.&lt;br /&gt;
 git config --global core.editor &amp;quot;'C:\Program Files (x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin&amp;quot;  # Windows&lt;br /&gt;
 git config --global core.editor &amp;quot;vim&amp;quot;  # Linux&lt;br /&gt;
&lt;br /&gt;
== Obtaining a copy of the Gramps repository ==&lt;br /&gt;
&lt;br /&gt;
The description below is for a single working folder at &amp;lt;code&amp;gt;~/Gramps&amp;lt;/code&amp;gt;.  If you are working on a plugin, the folder name should be &amp;lt;code&amp;gt;addons-source&amp;lt;/code&amp;gt; at the &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/addons-source.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using HTTPS Protocol===&lt;br /&gt;
To obtain a copy of the Gramps repository, type the following in the command line (doesn't require a GitHub account):&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; Gramps&lt;br /&gt;
&lt;br /&gt;
You should see the downloading progress reported in your terminal.&lt;br /&gt;
&lt;br /&gt;
===Using SSH Protocol===&lt;br /&gt;
If you have a GitHub account, use you can ssh if you wish, or continue to use HTTPS protocol with your GitHub credentials or a Personal Access Token:&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;git@github.com:gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; Gramps&lt;br /&gt;
&lt;br /&gt;
You will need a [https://help.github.com/articles/generating-ssh-keys/ SSH Key] in order to authenticate using this method. '''Before you accept any host keys, make sure you [https://help.github.com/articles/what-are-github-s-ssh-key-fingerprints/ verify the SSH fingerprint]''' of github.com.&lt;br /&gt;
&lt;br /&gt;
You can check your connection by:&lt;br /&gt;
 ssh -T git@github.com&lt;br /&gt;
which should return:&lt;br /&gt;
 Hi &amp;lt;name&amp;gt;! You've successfully authenticated, but GitHub does not provide shell access.&lt;br /&gt;
&lt;br /&gt;
Once the clone is complete, you have a local copy of the Gramps code with Git configured to use this as the 'origin'.  You can see this by:&lt;br /&gt;
 git remote -v&lt;br /&gt;
which should return:&lt;br /&gt;
 origin &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; (fetch)&lt;br /&gt;
 origin &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; (push)&lt;br /&gt;
&lt;br /&gt;
If you have 'push rights' to the Gramps repository, (members of the 'developers' group have this), then you are good to go.  If not, then you will have to establish your own github account and use that for a place to publish your contributions.  This is not needed until (or unless) you desire to contribute more than a simple patch to Gramps.&lt;br /&gt;
&lt;br /&gt;
You should sign up for an account on https://github.com.  GitHub is free to use for public and open source projects like Gramps.&lt;br /&gt;
You should create a repository on github that can receive your pushed contributions.  The examples below assume that is also called 'gramps'.  See https://help.github.com/articles/creating-a-new-repository/&lt;br /&gt;
&lt;br /&gt;
Once you have that set up, you should set up a second remote tied to your local repository.&lt;br /&gt;
My personal arrangement is to change the name of the original tie to the remote Gramps github repository to 'upstream' and make the tie to my personal github repository 'origin':&lt;br /&gt;
 git remote set-url --push upstream &amp;lt;nowiki&amp;gt;cannot_push&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 git remote set-url --fetch upstream &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 git remote set-url --push origin &amp;lt;nowiki&amp;gt;https://github.com/my-name/gramps.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 git remote set-url --fetch origin &amp;lt;nowiki&amp;gt;https://github.com/my-name/gramps.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
When done, you can check the results:&lt;br /&gt;
 git remote -v&lt;br /&gt;
which should return:&lt;br /&gt;
 origin &amp;lt;nowiki&amp;gt;https://github.com/my-name/gramps.git&amp;lt;/nowiki&amp;gt; (fetch)&lt;br /&gt;
 origin &amp;lt;nowiki&amp;gt;https://github.com/my-name/gramps.git&amp;lt;/nowiki&amp;gt; (push)&lt;br /&gt;
 upstream &amp;lt;nowiki&amp;gt;https://github.com/gramps-project/gramps.git&amp;lt;/nowiki&amp;gt; (fetch)&lt;br /&gt;
 upstream &amp;lt;nowiki&amp;gt;cannot_push&amp;lt;/nowiki&amp;gt; (push)&lt;br /&gt;
&lt;br /&gt;
== Branches  ==&lt;br /&gt;
Branches are the particular group of code sources associated with a Gramps version, enhancement, bug fix etc.&lt;br /&gt;
When making changes to Gramps, it is important to understand where you are starting from (which version of Gramps) and what you are trying to do.  &lt;br /&gt;
&lt;br /&gt;
=== Types of branches ===&lt;br /&gt;
When you clone the Gramps repository, a branch called ''master'' will be created for you. This contains the latest development version of Gramps. Gramps maintains different branches in several categories:&lt;br /&gt;
&lt;br /&gt;
* ''master'' - There is only one ''master'' branch. All new feature development happens in the ''master'' branch. New releases never come from the ''master'' branch.&lt;br /&gt;
&lt;br /&gt;
* ''maintenance'' - There are many maintenance branches, though usually only one or two are active. A maintenance branch is created from the ''master'' branch when all the features for a release are complete. New features are not committed to maintenance branches. Releases only come from active maintenance branches; a branch is no longer active when no further releases are planned for it. Inactive branches should not have any changes committed to them. The purpose of maintenance branches is to allow the line of code to stabilize while new features are added in the ''master'' branch. In order to prevent regressions (fixed bugs reoccurring in later releases) the current maintenance branch is regularly merged into the ''master'' branch.&lt;br /&gt;
&lt;br /&gt;
* ''geps'' - These are meant for development of [[Portal:Enhancement_Proposals|Gramps Enhancement Proposals]]. Most of the time GEPS are developed in the ''master'' branch. Occasionally a GEP will require extensive reworking or long periods when the code base is ususable. In these cases a branch in ''geps'' can be used as a temporary development area. Once the hard work is done the change should be merged into the trunk and the ''geps'' branch should be removed. ''geps'' branches should follow the naming convention ''gep-&amp;lt;###&amp;gt;-&amp;lt;descriptive text&amp;gt;'' e.g. ''gep-013-server''. Please read the [[#Working with development branches]] section for help with managing these branches.&lt;br /&gt;
&lt;br /&gt;
Tags are created for each Gramps release. The first two digits of the Gramps version number are reserved to indicate the maintenance branch the code came from. The last digit indicates the revision from that maintenance branch. For example, 5.0.4 would indicate the 5th release from the 5.0 branch (5.0.0, 5.0.1, 5.0.2, 5.0.3, 5.0.4).&lt;br /&gt;
&lt;br /&gt;
Here is a hypothetical example:&lt;br /&gt;
Imagine that the current version of Gramps is 8.3.2. A new series of features has been added in the ''master'' branch and are ready for release. A new maintenance branch is created from the ''master'' branch named 8.4 (or possibly 9.0 depending on the nature of the new features). New features continue to be added in the ''master'' branch that will not be included in the 8.4 series of releases, but will be included in the 8.5 series. Bug fixes continue to occur in the 8.4 branch until the code is deemed worthy of release. At that time, a release is tagged from the 8.4 maintenance branch and named 8.4.0. Some time after the release of 8.4.0, some bugs are found and fixed in the 8.4 maintenance branch. Those bug fixes are released as 8.4.1.&lt;br /&gt;
&lt;br /&gt;
== Stable version ==&lt;br /&gt;
&lt;br /&gt;
There are several versions of the Gramps source code in Git. The development branch for small changes and bug fixes is&lt;br /&gt;
 ''maintenance/gramps{{Stable_branch}}''&lt;br /&gt;
&lt;br /&gt;
By default, the remote server you cloned the Gramps repository from is called ''origin'', unless you changed the setup as described above.  In that case it is ''upstream''.&lt;br /&gt;
&lt;br /&gt;
To see a list of branches on the server, type:&lt;br /&gt;
&lt;br /&gt;
 git remote show upstream&lt;br /&gt;
&lt;br /&gt;
To create a local branch which tracks a branch on the server, use:&lt;br /&gt;
&lt;br /&gt;
 git checkout -b gramps{{Stable_branch}} upstream/maintenance/gramps{{Stable_branch}}&lt;br /&gt;
&lt;br /&gt;
{{man warn|1=Warning|2=This sets the name of the local branch to &amp;quot;gramps{{Stable_branch}}&amp;quot; (not &amp;quot;maintenance/gramps{{Stable_branch}}&amp;quot;). This may cause problems when you come to &amp;quot;push&amp;quot; your changes back to the server, depending on the &amp;quot;push.default&amp;quot; configuration settings (see below). You can change the name of the local branch by &amp;quot;git branch -m old new&amp;quot; i.e.&lt;br /&gt;
 git branch -m gramps{{Stable_branch}} maintenance/gramps{{Stable_branch}}}}&lt;br /&gt;
&lt;br /&gt;
This is known as a &amp;quot;tracking&amp;quot; branch.&lt;br /&gt;
&lt;br /&gt;
To list the available branches, type:&lt;br /&gt;
&lt;br /&gt;
 git branch&lt;br /&gt;
&lt;br /&gt;
The current branch is marked by an asterisk.&lt;br /&gt;
&lt;br /&gt;
To switch to another branch, type:&lt;br /&gt;
&lt;br /&gt;
 git checkout &amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To look at any stable release version, and create a new local branch off of it, type:&lt;br /&gt;
&lt;br /&gt;
 git checkout &amp;lt;tag&amp;gt; -b &amp;lt;new_local_branch_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following configuration option simplifies pushing a branch back to the server:&lt;br /&gt;
&lt;br /&gt;
 git config --global push.default upstream&lt;br /&gt;
&lt;br /&gt;
You can then use:&lt;br /&gt;
&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
{{man warn|1=Warning|2=This will push committed changes from '''all''' local branches, not just the one that is currently checked-out. If you want to ensure that only one branch is pushed, then use:&lt;br /&gt;
 git push origin gramps{{Stable_branch}}:maintenance/gramps{{Stable_branch}}}}&lt;br /&gt;
&lt;br /&gt;
While it is certainly possible to do your contributions directly in the particular branch you start from, whether it be 'master' 'maintenance/gramps{{Stable_branch}}' or something else, it is more usual to create a branch of your own for each significant change.  That way you can work on each separately, and change from one to the other without getting the changes intermixed.&lt;br /&gt;
&lt;br /&gt;
For example if you are creating a new report you might want to call the branch 'gen-report'.  If you are basing this off of the 'master' branch, then you would start by:&lt;br /&gt;
 git checkout master         # this ensures your work is based on master branch&lt;br /&gt;
 git checkout -b gen-report  # this creates a new branch 'gen-report' based on master but separate.&lt;br /&gt;
You can create many such branches and switch between them with 'git checkout &amp;lt;yourbranch&amp;gt;' as long as you save your work via 'commit' (described below) before making the switch.&lt;br /&gt;
&lt;br /&gt;
===Alternative approach===&lt;br /&gt;
For an alternative approach see [[Brief_introduction_to_Git#Multiple_Working_Folders|Multiple Working Folders]].&lt;br /&gt;
&lt;br /&gt;
== Basic Work Flow ==&lt;br /&gt;
&lt;br /&gt;
The basic work flow after you've checked out the repository is update, develop, commit, update again, push.&lt;br /&gt;
To update the current checked out Gramps branch (master in this case) from Gramps github, run&lt;br /&gt;
&lt;br /&gt;
 git pull --rebase upstream master&lt;br /&gt;
If you are working on a branch of your own creation ('mybranch'), based off of master, and currently have 'mybranch' checked out, I prefer to run&lt;br /&gt;
 git fetch upstream           # copies the latest stuff from Gramps on github&lt;br /&gt;
 git rebase upstream/master   # shift my work to be 'on top' of other peoples work&lt;br /&gt;
&lt;br /&gt;
As a general rule ''always'' use &amp;lt;tt&amp;gt;git pull --rebase&amp;lt;/tt&amp;gt; to avoid creating unnecessary merge commits. Note that one must have no uncommitted edits on that branch when running &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The differences between &amp;quot;git pull&amp;quot; and git pull --rebase&amp;quot; is explained well [http://stackoverflow.com/a/3357174/2615612 here].&lt;br /&gt;
&lt;br /&gt;
You make your changes next with your preferred editor, debugging the code locally.&lt;br /&gt;
&lt;br /&gt;
To see exactly what you have changed from the original (master in this case):&lt;br /&gt;
 git diff master&lt;br /&gt;
To see changes since your last commit:&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
To review your change files before a commit, type:&lt;br /&gt;
&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
To stage and commit your changes locally, use the following commands:&lt;br /&gt;
&lt;br /&gt;
 git add *    # the '*' adds every changed file to the stage, or you can specify a single file&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
Which will bring up the default $EDITOR (or the editor you setup with 'git config' above) to create a commit message. If you are fixing a bug, the first line of the commit message should be the bug number and title, otherwise a brief statement of purpose. Skip a line and describe what you did.&lt;br /&gt;
&lt;br /&gt;
* All developers should read Gramps [[Committing policies]]&lt;br /&gt;
&lt;br /&gt;
If the commit is a minor change that can be described entirely in the subject, you can instead use:&lt;br /&gt;
&lt;br /&gt;
 git commit -am &amp;quot;message describing the nature of the change&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Try to keep your commits digestible and understandable. A large changeset can be broken into several commits that &amp;quot;tell a story&amp;quot; about how the changeset moves the program from its old behavior to its new one.&lt;br /&gt;
&lt;br /&gt;
To push your changes to the Gramps repository, you need to have cloned the Gramps source code with ssh, and have push access to the Gramps repository (the Gramps admins can give you this, [[Contact|Brian Matherly or Nick Hall]]). If you don't have push access continue in the next section below.  First update again to make sure that you can fast-forward the repository, then push:&lt;br /&gt;
&lt;br /&gt;
 git pull --rebase&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
If someone else has made changes that interfere with yours, you will get a conflict error when you pull. You will have to resolve that conflict and re-commit (you can use &amp;lt;tt&amp;gt;git commit --amend&amp;lt;/tt&amp;gt; if it affects only the last ''unpushed'' commit) before git will push successfully.&lt;br /&gt;
&lt;br /&gt;
Since uploading is a potentially dangerous operation, most people do not obtain write access to the git repository. You can use one of two approaches to this, either make a 'patch' (useful for small bug fixes), or you can make a 'Pull Request' (PR).&lt;br /&gt;
&lt;br /&gt;
See the [[Brief_introduction_to_Git#Making_a_patchfile|make a patchfile]] or [[Brief_introduction_to_Git#Making_a_PR|Making a PR]] sections for details.&lt;br /&gt;
&lt;br /&gt;
:Also see:  [[Getting started with Gramps master]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Making a patchfile ===&lt;br /&gt;
When dealing with a patch, you create a new bug on the [https://www.gramps-project.org/bugs bug tracker] and attach a patch to it.&lt;br /&gt;
 &lt;br /&gt;
The [https://www.gramps-project.org/bugs bug tracker] has a drop down at the top right to allow a choice among the projects under the Gramps Bugtracker; the default project shown is '''All Projects'''.  Choose the project '''Gramps''' and submit an issue.&lt;br /&gt;
&lt;br /&gt;
A patchfile is a text file with your changes which can be sent by email to somebody, or posted/uploaded to the bug tracker (against a bug you are fixing or a feature request which you are solving for instance), etc...&lt;br /&gt;
&lt;br /&gt;
These instructions tell how to make a patchfile against the ''master'' branch, so that your changes are added to the next major release of Gramps. (To make a patchfile against a branch the process is similar, with some slight changes.)&lt;br /&gt;
&lt;br /&gt;
First create a new branch to work in:&lt;br /&gt;
&lt;br /&gt;
 git checkout -b fix&lt;br /&gt;
&lt;br /&gt;
Then use your favorite editor to change whatever file(s) you want.  Add the files you have changed to the staging area and commit them.&lt;br /&gt;
&lt;br /&gt;
Obtain the latest changes from the server.&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git pull --rebase&lt;br /&gt;
&lt;br /&gt;
Next, rebase your fix again the ''master'' branch.  This will ensure that your patch will apply cleanly.&lt;br /&gt;
&lt;br /&gt;
 git rebase master fix&lt;br /&gt;
&lt;br /&gt;
This will leave you in the fix branch.&lt;br /&gt;
&lt;br /&gt;
Finally, create a patchfile, using:&lt;br /&gt;
&lt;br /&gt;
 git format-patch master --stdout &amp;gt; fix.patch&lt;br /&gt;
&lt;br /&gt;
You now have a patchfile that can be sent by email, or attached to a bug report.  The patch can be applied using the 'git apply' command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Making a PR&amp;quot;&amp;gt;&lt;br /&gt;
=== Making a Pull Request (PR) on Github ===&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If your changes or submission is more substantial, (or you will be making lots of them), you are encouraged to use the PR (Pull Request) method of making submissions.  PRs allow the developers to easily see your proposed changes, download them and test them outside of the main code base, and see the results of automated testing.  Github also has a comments area for each PR that allows you to describe in detail what you are trying to achieve, and for others to respond to your work.&lt;br /&gt;
&lt;br /&gt;
To make a PR, you must first 'push' your work to a publicly view-able repository.  We will continue to assume that github is used for this, and that you have your own account set up with a 'gramps' (or 'addons-source') repository as your remote 'origin', as was described earlier.&lt;br /&gt;
&lt;br /&gt;
Again, to minimize the chance of collisions with other peoples work;&lt;br /&gt;
 git checkout mybranch        # unless you are already there&lt;br /&gt;
 git fetch upstream           # copies the latest stuff from Gramps on github&lt;br /&gt;
 git rebase upstream/master   # shift my work to be 'on top' of other peoples work&lt;br /&gt;
If you have done multiple commits while working on you code and they don't really make sense separately or contain intermediate attempts that are not reflected in the final result, you should probably clean up your work.  There are several ways to do this, but I like to use the 'interactive rebase'.  Start with:&lt;br /&gt;
 git log&lt;br /&gt;
which will list all the commits starting with the most recent.  The list is potentially enormous, but you probably will only need to look at the first screen or so.  (Type 'q' to quit)  An example log is shown:&lt;br /&gt;
 commit defcda798145769f89189b95b202d5d0067f59c1&lt;br /&gt;
 Author: prculley &amp;lt;paulxxxx@gmail.com&amp;gt;&lt;br /&gt;
 Date:   Sat Dec 8 11:08:48 2016 -0600&lt;br /&gt;
    messed up and need to fix this&lt;br /&gt;
 commit 2359633198ef50072d2bb6ca25f923718fab02d8&lt;br /&gt;
 Author: prculley &amp;lt;paulxxxx@gmail.com&amp;gt;&lt;br /&gt;
 Date:   Wed Dec 7 11:52:21 2016 -0600&lt;br /&gt;
    bug 8333; fix merge issue with Person Tree View&lt;br /&gt;
 commit 5ad32042c6f808918cbbf540091e52e4ac4a9b28&lt;br /&gt;
 Author: Paul Franklin &amp;lt;pfxxxx@gmail.com&amp;gt;&lt;br /&gt;
 Date:   Wed Dec 21 22:24:48 2016 -0800&lt;br /&gt;
    move two methods down slightly (to better check a forthcoming change)&lt;br /&gt;
Find the first commit ''after'' your own commits and copy (at least) the first 5-6 characters of the long hash string.&lt;br /&gt;
Then do an interactive rebase;&lt;br /&gt;
 git rebase -i 5ad320&lt;br /&gt;
Something like the following should appear in your editor with your commits at the top:&lt;br /&gt;
 pick 2359633 bug 8333; fix merge issue with Person Tree View&lt;br /&gt;
 pick defcda7 messed up and need to fix this&lt;br /&gt;
 #&lt;br /&gt;
 # Rebase 5ad3204..defcda7 onto 5ad3204 (2 command(s))&lt;br /&gt;
 #&lt;br /&gt;
 # Commands:&lt;br /&gt;
 # p, pick = use commit&lt;br /&gt;
 # r, reword = use commit, but edit the commit message&lt;br /&gt;
 # e, edit = use commit, but stop for amending&lt;br /&gt;
 # s, squash = use commit, but meld into previous commit&lt;br /&gt;
 # f, fixup = like &amp;quot;squash&amp;quot;, but discard this commit's log message&lt;br /&gt;
 # x, exec = run command (the rest of the line) using shell&lt;br /&gt;
 # d, drop = remove commit&lt;br /&gt;
 #&lt;br /&gt;
 # These lines can be re-ordered; they are executed from top to bottom.&lt;br /&gt;
 #&lt;br /&gt;
 # If you remove a line here THAT COMMIT WILL BE LOST.&lt;br /&gt;
 #&lt;br /&gt;
 # However, if you remove everything, the rebase will be aborted.&lt;br /&gt;
 #&lt;br /&gt;
 # Note that empty commits are commented out&lt;br /&gt;
In the example above, I want to merge the two commits into a single one, and keep only the original commit message.  So I use the 'f' option on the second pick (change the 'pick defcda7' to 'f defcda7'), save the file and exit the editor.&lt;br /&gt;
&lt;br /&gt;
Once that is complete, you can finally push the results to github at your own account:&lt;br /&gt;
 git push origin mybranch&lt;br /&gt;
&lt;br /&gt;
The next stop is at github itself.  Grab your web browser and navigate to your account and your repository and the 'branches' tab &amp;lt;nowiki&amp;gt;https://github.com/yourname/gramps/branches&amp;lt;/nowiki&amp;gt;.  You should see your newly 'pushed' branch ('mybranch') listed with a 'New Pull Request' button on the right.&lt;br /&gt;
&lt;br /&gt;
You can then fill out the PR form. You might have to select the Gramps 'base' branch you are basing on if it is different than 'master', this will be evident if you see &amp;quot;Can’t automatically merge&amp;quot;. Add any comments you have on your work.  And push the 'Create Pull Request' button.&lt;br /&gt;
&lt;br /&gt;
====Send your contribution without rights to push====&lt;br /&gt;
&lt;br /&gt;
You can [https://help.github.com/articles/fork-a-repo/ fork] the Gramps repository and create a [https://help.github.com/articles/using-pull-requests/ pull request]. Otherwise check it into Git if you obtained the [[#Obtaining_a_copy_of_the_Gramps_repository|permission to do push]].&lt;br /&gt;
&lt;br /&gt;
Since syncing a fork can create unwanted commits, you may need to [https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request rebase] your pull request first. Remember to replace edx and master with the actual names of the remote repository (upstream) and the branch you're working on.&lt;br /&gt;
&lt;br /&gt;
* [[Brief_introduction_to_Git#Making_a_Pull_Request_.28PR.29_on_Github|Making a Pull Request (PR) on Github]]&lt;br /&gt;
&lt;br /&gt;
====To PR or not to PR====&lt;br /&gt;
&lt;br /&gt;
Note from Nick Hall - 27 Feb 2024&lt;br /&gt;
&lt;br /&gt;
Generally pull requests are preferred, but there are a few exceptions:&lt;br /&gt;
&lt;br /&gt;
* Translations. Before Weblate, a translation maintainer was allowed to commit translation updates directly without a PR. This is still the case for addons. The reason behind this was that it was unlikely that the PR would be reviewed.&lt;br /&gt;
* Package maintenance. We allow package maintainers to make changes in the directory related to the package that they maintain.&lt;br /&gt;
* Releases. PRs are not required for commits relating to a release.&lt;br /&gt;
* Branch merges. I don’t make a PR when merging bug fixes from a maintenance branch into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Working with development branches ==&lt;br /&gt;
&lt;br /&gt;
Creating branches with Git is quick and easy.&lt;br /&gt;
 &lt;br /&gt;
Here is a quick crib sheet:&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch ===&lt;br /&gt;
&lt;br /&gt;
To create a branch from the ''master'' branch:&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git branch gep-014-fab-feature&lt;br /&gt;
&lt;br /&gt;
To make this branch available on the server use:&lt;br /&gt;
&lt;br /&gt;
 git push origin gep-014-fab-feature&lt;br /&gt;
&lt;br /&gt;
=== Merging changes from the branch back into the ''master'' branch ===&lt;br /&gt;
&lt;br /&gt;
When you are ready to merge your changes back into the ''master'' branch:&lt;br /&gt;
&lt;br /&gt;
 git rebase master&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git merge gep-014-fab-feature&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
=== Removing branches ===&lt;br /&gt;
&lt;br /&gt;
It is important that branches are removed once they have been merged into the trunk or have been abandoned. To remove a branch:&lt;br /&gt;
&lt;br /&gt;
 git branch -d gep-014-fab-feature&lt;br /&gt;
&lt;br /&gt;
To remove a branch from the server, use:&lt;br /&gt;
&lt;br /&gt;
 git push origin :gep-014-fab-feature&lt;br /&gt;
&lt;br /&gt;
The developers reserve the right to remove branches that have been dormant for more than 1 year.&lt;br /&gt;
&lt;br /&gt;
=== Applying a fix to another branch ===&lt;br /&gt;
&lt;br /&gt;
If you write a fix for an old maintenance branch, you may need to also apply it to the current maintenance branch.&lt;br /&gt;
&lt;br /&gt;
To apply a commit from the gramps42 branch to the gramps50 branch:&lt;br /&gt;
 git checkout gramps50&lt;br /&gt;
 git cherry-pick fix&lt;br /&gt;
&lt;br /&gt;
Then you may have to fix things that could not be applied due to conflicts. The patch program would mark the conflicts with the &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;, ======, and &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; signs. You will then need to push your changes.&lt;br /&gt;
&lt;br /&gt;
If you apply a small fix that applies cleanly to another branch, it can be done like this (assuming you've just committed the fix to gramps42 in a single commit):&lt;br /&gt;
 git checkout gramps50&lt;br /&gt;
 git diff gramps42^ gramps42 | git apply&lt;br /&gt;
If `git apply' fails, nothing will be changed in the working copy, and you can try to resolve the conflicts by cherry-picking, or manually saving the diff result, using the &amp;quot;patch&amp;quot; program, and resolving the conflicts.&lt;br /&gt;
&lt;br /&gt;
=== Searching in a specific branch ===&lt;br /&gt;
The GUI search in GitHub only indexes the active branch in the code base.  If you want to search for a string in a specific branch, use Git instead of the GUI.&lt;br /&gt;
&lt;br /&gt;
Using issue {{bug|13345}} as an example, the following examples show how to search for a term in various branches. The output shows that v5.1.3 introduced a change related to that string:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; git grep &amp;quot;Default Person&amp;quot; master&lt;br /&gt;
 master:NEWS:* Change GUI references to ‘Home Person’ instead of ‘Default Person’&lt;br /&gt;
 master:po/pl.po:#~ “active person to the Default Person.”&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; git grep &amp;quot;Default Person&amp;quot; v5.2.3&lt;br /&gt;
 v5.2.3:NEWS:* Change GUI references to ‘Home Person’ instead of ‘Default Person’&lt;br /&gt;
 v5.2.3:po/pl.po:#~ “active person to the Default Person.”&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; git grep &amp;quot;Default Person&amp;quot; v5.1.6&lt;br /&gt;
 v5.1.6:NEWS:* Change GUI references to ‘Home Person’ instead of ‘Default Person’&lt;br /&gt;
 v5.1.6:po/pl.po:#~ “active person to the Default Person.”&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; git grep &amp;quot;Default Person&amp;quot; v5.1.2&lt;br /&gt;
 v5.1.2:po/pl.po:#~ “active person to the Default Person.”&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; git grep &amp;quot;Default Person&amp;quot; v5.1.3&lt;br /&gt;
 v5.1.3:NEWS:* Change GUI references to ‘Home Person’ instead of ‘Default Person’&lt;br /&gt;
 v5.1.3:po/pl.po:#~ “active person to the Default Person.”&lt;br /&gt;
&lt;br /&gt;
There are several options you can use with the grep command which you can see by adding “–help”.&lt;br /&gt;
&lt;br /&gt;
=== Workflow ===&lt;br /&gt;
&lt;br /&gt;
Before switching to another branch it is useful to remove untracked files created by the build process. You can do this with the following command:&lt;br /&gt;
&lt;br /&gt;
 git clean -dxf&lt;br /&gt;
&lt;br /&gt;
==  Useful Tips ==&lt;br /&gt;
&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
&lt;br /&gt;
Git has excellent man pages.  You can view the manual page for a Git command, by using one of the following:&lt;br /&gt;
&lt;br /&gt;
 git help &amp;lt;verb&amp;gt;&lt;br /&gt;
 git &amp;lt;verb&amp;gt; --help&lt;br /&gt;
 man git-&amp;lt;verb&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to get help on the 'git log' command, type:&lt;br /&gt;
&lt;br /&gt;
 git help log&lt;br /&gt;
&lt;br /&gt;
=== Configuration settings ===&lt;br /&gt;
&lt;br /&gt;
You can set your default editor with:&lt;br /&gt;
&lt;br /&gt;
 git config --global core.editor &amp;lt;editor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable colored command line output, use:&lt;br /&gt;
&lt;br /&gt;
 git config --global color.ui auto&lt;br /&gt;
&lt;br /&gt;
=== Saving uncommitted work while you do something in another branch ===&lt;br /&gt;
Sometimes you are not ready to commit your work but you still want to do work in another branch.&lt;br /&gt;
You may want to read up on:&lt;br /&gt;
 git worktree  # used to have another copy of the repository in another directory of your machine.&lt;br /&gt;
 git stash     # used to temporarily 'stash' uncommitted work on a 'stack'&lt;br /&gt;
 git stash pop # used to 'pop' the latest stashed item (can also be used to move uncommitted files to another branch if you forgot to switch before editing&lt;br /&gt;
 git stash -p  # interactive selection of stash items (if you want to stash some uncommitted work, but not other)&lt;br /&gt;
&lt;br /&gt;
=== Checking out someone else's PR to test ===&lt;br /&gt;
On the github page for the PR, next to the 'Merge Pull Request' button, is a hotlink for 'command line instructions'; it gives the actual 'git checkout' line for this.&lt;br /&gt;
&lt;br /&gt;
=== Making merges (when there are rebase conflicts) easier ===&lt;br /&gt;
A tool which shows a 3-way merge can be helpful in determining what needs to be done.  First configure git for the tool of choice (kdiff3 for windows shown here):&lt;br /&gt;
 git config --global merge.tool kdiff3&lt;br /&gt;
 git config --global mergetool.kdiff3.cmd &amp;quot;C:/Program Files/KDiff3/kdiff3.exe&amp;quot;  # Windows&lt;br /&gt;
 git config --global --add mergetool.kdiff3.trustExitCode false&lt;br /&gt;
Then when a merge conflict comes up you can:&lt;br /&gt;
 git mergetool&lt;br /&gt;
=== Some procedural recommendations ===&lt;br /&gt;
&lt;br /&gt;
# Always do &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt; before pushing changes to the server. If necessary get advice about handling conflicts.&lt;br /&gt;
# Always do &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; and look for staged files that are unexpected or unintended. This is a *very important* sanity check. &lt;br /&gt;
&lt;br /&gt;
;And here are a couple of incidental suggestions&lt;br /&gt;
&lt;br /&gt;
* Avoid grouping unrelated changes; better to divide into separate commits for the following reasons: a better log entry; easier troubleshooting/reverting. (and probably more).&lt;br /&gt;
&lt;br /&gt;
* Similar to above, it may be better to make small incremental changes than one big one (if possible). Interim changes should not introduce breakage, of course. For instance, if you change code in gramps/ and do associated translation changes in po/, you might want to commit the changes in po/ in a commit following the commit(s) with the changes in gramps/.&lt;br /&gt;
&lt;br /&gt;
* logs are important -- please give some thought to the log message. All developers should read the [[Committing policies]].&lt;br /&gt;
&lt;br /&gt;
=== Browse Git ===&lt;br /&gt;
&lt;br /&gt;
An alternative to the command line tools to view the Git repository is the [https://github.com/gramps-project/gramps online interface].&lt;br /&gt;
&lt;br /&gt;
== Multiple Working Folders ==&lt;br /&gt;
{{man note|Multiple Working Folders|This type of setup is uncommon.}}&lt;br /&gt;
Using a single working folder as described above entails context switching when developing across multiple branches. For example:&lt;br /&gt;
* develop and test changes on the gramps41 branch,&lt;br /&gt;
* commit or stash the changes,&lt;br /&gt;
* clean to remove untracked files created by the development process,&lt;br /&gt;
* checkout the master 'branch',&lt;br /&gt;
* build (python setup.py build),&lt;br /&gt;
* cherry pick the changes from the gramps41 branch into the master 'branch',&lt;br /&gt;
* test and if necessary develop the changes to master,&lt;br /&gt;
* commit or stash the changes.&lt;br /&gt;
&lt;br /&gt;
If the changes are all OK, then they can pushed to the GitHub repository.&lt;br /&gt;
&lt;br /&gt;
An alternative is to clone the GitHub repository for each branch, but although git saves local disk space by using hard links for locally cloned repositories, keeping the local repositories in sync is complex.&lt;br /&gt;
&lt;br /&gt;
The problem is well explained [https://www.finik.net/2010/10/24/multiple-working-folders-with-single-git-repository/ here] as is the solution, which is to create copies of the working directories only. &lt;br /&gt;
&lt;br /&gt;
This can be done using either the builtin &amp;lt;code&amp;gt;git worktree&amp;lt;/code&amp;gt; command since Git 2.5.0 or by a script that is in the git 'contrib' directory [http://nuclearsquid.com/writings/git-new-workdir/ git-new-workdir] for older versions of Git. Note that &amp;lt;code&amp;gt;git worktree&amp;lt;/code&amp;gt; supports windows out of the box.&lt;br /&gt;
&lt;br /&gt;
===git-new-workdir===&lt;br /&gt;
&lt;br /&gt;
Assuming that the directory structure would be:&lt;br /&gt;
 ~&lt;br /&gt;
 +-Gramps &lt;br /&gt;
   +-repository&lt;br /&gt;
     +-.git&lt;br /&gt;
       +- etc&lt;br /&gt;
   +-gramps34&lt;br /&gt;
   +-gramps40&lt;br /&gt;
   +-gramps41&lt;br /&gt;
   +-gramps42&lt;br /&gt;
   +-gramps50&lt;br /&gt;
   +-gramps51&lt;br /&gt;
   +-gramps52&lt;br /&gt;
   +-master&lt;br /&gt;
&lt;br /&gt;
The approach would be:&lt;br /&gt;
* clone from the GitHub repository:&lt;br /&gt;
&lt;br /&gt;
 mkdir Gramps&lt;br /&gt;
 cd Gramps&lt;br /&gt;
 mkdir repository&lt;br /&gt;
 cd repository&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git&lt;br /&gt;
&lt;br /&gt;
* then create the various working copies:&lt;br /&gt;
&lt;br /&gt;
 # git-new-workdir path/to/repository   path/to/new/workingdir   branch&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps34        maintenance/gramps34&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps40        maintenance/gramps40&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps41        maintenance/gramps41&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps42        maintenance/gramps42&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps50        maintenance/gramps50&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps51        maintenance/gramps51&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/gramps52        maintenance/gramps52&lt;br /&gt;
 git-new-workdir   ~/Gramps/repository  ~/Gramps/master          master&lt;br /&gt;
&lt;br /&gt;
You will then need to build the source, but this only needs to be done once, and the 'clean' step is not needed. See [[Getting_started_with_Gramps_development#Run_Gramps_from_the_source| Run from source]] and [[Running_a_development_version_of_Gramps| running]] which describes the process for 'gramps 3.4 and before' as well as after. For example:&lt;br /&gt;
&lt;br /&gt;
 cd ~/Gramps/gramps41&lt;br /&gt;
 python setup.py build&lt;br /&gt;
&lt;br /&gt;
===git worktree===&lt;br /&gt;
&lt;br /&gt;
{{stub}}&amp;lt;!--test and expand this--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although from Git 2.5 (Q2 2015) a replacement for contrib/workdir/git-new-workdir was [http://stackoverflow.com/questions/6270193/multiple-working-directories-with-git/30185564#30185564 builtin] to git, it is recommended that you use the 'recipe' above instead of the builtin, in order to ensure that the repository is in the right place, and in view of the warning below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARNING. Using the builtin 'git worktree' may not be supported by Eclipse (as at Dec 2017), see [https://bugs.eclipse.org/bugs/show_bug.cgi?id=477475 Bug 477475 - git 2.5 worktree support].&lt;br /&gt;
&lt;br /&gt;
== git2cl ==&lt;br /&gt;
The Gramps project does not keep a ChangeLog file under source control. All change history is captured by git automatically when it is committed. A ChangeLog file is generated from the git commit logs before each release using [[Brief_introduction_to_SVN#How_to_use_git2cl|git2cl]]. Developers should take care to make useful commit log messages when committing changes to git. Please read the [[Committing policies]] for details.&lt;br /&gt;
&lt;br /&gt;
=== How to use git2cl ===&lt;br /&gt;
&lt;br /&gt;
Starting with Gramps 3.0.0, we no longer have a &amp;lt;tt&amp;gt;ChangeLog&amp;lt;/tt&amp;gt; file.  &lt;br /&gt;
&lt;br /&gt;
Instead, the list of changes is generated automatically using the standard &amp;lt;tt&amp;gt;git2cl&amp;lt;/tt&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;git2cl&amp;lt;/tt&amp;gt; is not included in the base installation of Git.  With a Debian-based distro such as Ubuntu, you can get &amp;lt;tt&amp;gt;git2cl&amp;lt;/tt&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install git2cl&lt;br /&gt;
&lt;br /&gt;
There typically are two &amp;lt;tt&amp;gt;ChangeLog&amp;lt;/tt&amp;gt; files needed for releases; one in the main directory, and one in the &amp;lt;tt&amp;gt;po&amp;lt;/tt&amp;gt; directory.  You can generate these files with the following commands:&lt;br /&gt;
&lt;br /&gt;
 git log gramps-4.0.1.. --pretty --numstat --summary --no-merges | git2cl &amp;gt; ChangeLog&lt;br /&gt;
 git log gramps-4.0.1.. --pretty --numstat --summary --no-merges -- po | git2cl &amp;gt; po/ChangeLog&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
*[http://git-scm.com/ Git]&lt;br /&gt;
*[http://git-scm.com/book Git Book]&lt;br /&gt;
*[https://help.github.com/articles/generating-ssh-keys/ GitHub SSH Keys]&lt;br /&gt;
*[https://help.github.com/articles/what-are-github-s-ssh-key-fingerprints/ GitHub SSH Key Fingerprints]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General|B]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:MediaBrowserGramplet&amp;diff=121696</id>
		<title>Addon:MediaBrowserGramplet</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:MediaBrowserGramplet&amp;diff=121696"/>
		<updated>2025-08-20T19:11:26Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Incorrect help URL fixed with bug 13959&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party addon}}&lt;br /&gt;
[[File:MediaBrowserGramplet-detached-example-51.png|right|thumb|450px|Media &amp;quot;Browser Gramplet&amp;quot; - detached - example]]&lt;br /&gt;
The Media {{man label|Browser Gramplet}} addon shows details of a person linked media objects.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Appears under the name '''Browser''' Gramplet in the context menu to '''Add a gramplet'''&lt;br /&gt;
* gramplet can be added to the following categories: People, Relationships, Charts, Geography&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
* Github code [https://github.com/gramps-project/addons-source/tree/master/MediaBrowser MediaBrowser]&lt;br /&gt;
&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Media]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=108738</id>
		<title>Gramps for Windows with MSYS2</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=108738"/>
		<updated>2024-12-07T18:55:15Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Actually remove WinXP reference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man warn|1=Warning|2=Do not open your existing databases with the master branch, it might destroy your data, and will make it impossible to use the data in the stable version {{stable_branch}}. To try it out, export your database to a gramps xml file, eg &amp;lt;code&amp;gt;test_master.gramps&amp;lt;/code&amp;gt;, create a new family tree in the master branch, and import this xml file.&amp;lt;br&amp;gt;Alternatively you can [[Gramps_for_Windows_with_MSYS2#Keep_your_GRAMPSHOME_separate|Keep your GRAMPSHOME separate]]}}&lt;br /&gt;
&lt;br /&gt;
How to use MSYS2 to run latest Gramps development version from source in 64-bit Windows.&lt;br /&gt;
&lt;br /&gt;
==Install MSYS2==&lt;br /&gt;
&lt;br /&gt;
From the MSYS2 home page https://www.msys2.org/ download the latest MSYS2 64-bit installer( msys2-x86_64-YYYYMMDD.exe ) from [https://repo.msys2.org/distrib/x86_64/ https://repo.msys2.org/distrib/x86_64/] and run it.&lt;br /&gt;
&lt;br /&gt;
Install it in short path like &amp;lt;code&amp;gt;C:\msys64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of install select to run mingw64 shell eg: use the '''MSYS2 MINGW64''' shortcut.&lt;br /&gt;
&lt;br /&gt;
===Update MSYS2===&lt;br /&gt;
First keep running the following command(multiple times) until it has updated the list of packages and updated all core packages nothing else to do: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -Syuu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If core packages are updated you must close the mingw64 shell (forcefully with close button, not just typing exit on it) and then restart the mingw64 shell from the shortcut. Following a core update, run the update command again to update non-core packages.&lt;br /&gt;
&lt;br /&gt;
===Install Gramps dependencies===&lt;br /&gt;
Start mingw64 shell and use '''pacman''' package manager to download and install Gramps dependencies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-bsddb3 mingw-w64-x86_64-gexiv2 mingw-w64-x86_64-ghostscript mingw-w64-x86_64-python3-cairo mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-icu mingw-w64-x86_64-iso-codes mingw-w64-x86_64-hunspell mingw-w64-x86_64-hunspell-en mingw-w64-x86_64-enchant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To handle the following warning '''No intltool or version &amp;lt; 0.25.0, build_intl is aborting''' during the build later, install:&lt;br /&gt;
  pacman -S perl-XML-Parser&lt;br /&gt;
  pacman -S intltool&lt;br /&gt;
&lt;br /&gt;
You will also need the following to run the test:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-lxml&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-jsonschema&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Some additional (optional) items needed for certain addons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-gtkspell3&lt;br /&gt;
pacman -S mingw-w64-x86_64-geocode-glib&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-pillow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Git and Gcc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S msys/git&lt;br /&gt;
pacman -S msys/gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Genealogical Symbols preferences tab needs Python Fontconfig version 0.5 so we need to build it.&lt;br /&gt;
From a suitable build directory (I use ~/build)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Vayn/python-fontconfig.git&lt;br /&gt;
cd python-fontconfig/&lt;br /&gt;
git checkout e1b1751f52167184e0c&lt;br /&gt;
python3 setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Graphviz. To run the Graph View addon also install goocanvas.&lt;br /&gt;
(If you run into a problem try the alternate instructions to install [[Gramps_for_Windows_with_MSYS2#Issue|Graphviz]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
pacman -S mingw-w64-x86_64-goocanvas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install osmgpsmap for the Geography Views with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Gramps==&lt;br /&gt;
===Prepare source===&lt;br /&gt;
Create directory to store Gramps source in and go to it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/grampsdev&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download source===&lt;br /&gt;
Download Gramps master branch from source repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
git remote add -t master -f origin https://github.com/gramps-project/gramps.git&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check which Gramps version is used&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git describe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
it should return something like:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
v5.0.0-alpha1-1024-g0919763f1&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===Setup source===&lt;br /&gt;
Before using Gramps you must set-it up.&lt;br /&gt;
&amp;lt;br&amp;gt;You just use '''setup build''' command not '''install''' one&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 setup.py build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Run Gramps==&lt;br /&gt;
Start mingw64 shell and go to directory where Gramps source reside&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Use python3 to start Gramps&lt;br /&gt;
&amp;lt;br&amp;gt;To check gramps version use &amp;quot;v&amp;quot; flag&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should return something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Settings:&lt;br /&gt;
----------------&lt;br /&gt;
 python    : 3.5.3&lt;br /&gt;
 gramps    : 5.0.0-alpha1-0919763f1&lt;br /&gt;
 gtk++     : 3.22.9&lt;br /&gt;
 pygobject : 3.22.0&lt;br /&gt;
 pango     : 1.40.3&lt;br /&gt;
 cairo     : 1.15.4&lt;br /&gt;
 pycairo   : 1.1.10&lt;br /&gt;
 osmgpsmap : 1.0&lt;br /&gt;
 GExiv2    : 0.10&lt;br /&gt;
 ICU       : 57.1&lt;br /&gt;
 PyICU     : 1.9.3&lt;br /&gt;
 o.s.      : win32&lt;br /&gt;
&lt;br /&gt;
Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : Graphviz not in system PATH&lt;br /&gt;
 Ghostscr. : 9.20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run Gramps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Building and updating MSYS2/MinGW packages==&lt;br /&gt;
===Install build tools===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed --noconfirm base-devel mingw-w64-x86_64-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[https://github.com/Alexpux/MINGW-packages MINGW-packages recipes] are on GitHub so you can use git to clone it. If instead you want to access recipe one by one you can download it with Subversion so install it first&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S subversion&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We need a place to download and build from source code so we will create folder called &amp;quot;build&amp;quot; inside our home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To prevent pacman to upgrade packages we rebuilt for our needs we can assign them to group '''gramps_fixed''' and add them to IgnoreGroup list.&lt;br /&gt;
Open in text editor file ''etc/pacman.conf'' (C:\MSYS2\etc\pacman.conf) and add line ''IgnoreGroup = gramps_fixed'' to ''options'' section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[options]&lt;br /&gt;
IgnoreGroup = gramps_fixed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===db===&lt;br /&gt;
GrampsAIO uses Oracle Berkeley DB version 6.0.30 but MSYS2 have it at version 6.0.19 and most probably never update it to a newer version.&lt;br /&gt;
&amp;lt;br&amp;gt;Gramps will ask permission to downgrade database version at import of any family tree created with GrampsAIO bundle. To prevent that build right version of DB.&lt;br /&gt;
&amp;lt;br&amp;gt;''Hard way'' (it can take some time to finish)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-db&lt;br /&gt;
cd mingw-w64-db&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''The easy way doesn't work anymore!  This is because the recent versions of Python have changed and we have to rebuild.'''&lt;br /&gt;
&amp;lt;br&amp;gt;Start ''msys2 shell'' and type (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bsddb3===&lt;br /&gt;
As db version is changed then we have to rebuild Python bindings for Oracle Berkeley DB&lt;br /&gt;
&amp;lt;br&amp;gt;From ''msys2 shell'' (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Or hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-python-bsddb3&lt;br /&gt;
cd mingw-w64-python-bsddb3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gtk3===&lt;br /&gt;
[https://www.gtk.org/ GTK+] since version 3.20 drag-and-drop code has been rearchitected to move the drag cancel animation and most input handling into GDK, thereby dropping most of the platform-dependent code out of GTK (MSYS2 version of GTK is currently 3.22.10). This change is not yet present in Windows port of code so we have to use older GTK version 3.18 where it still works.&lt;br /&gt;
&amp;lt;br&amp;gt;Latest in gtk-3.18 branch is gtk-3.18.9 (previous versions of this branch have working dnd but have other bugs) so we build that.&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard Way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-gtk3&lt;br /&gt;
cd mingw-w64-gtk3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===graphviz===&lt;br /&gt;
&lt;br /&gt;
As of 2019.09.17 package mingw-w64-osm-gps-map is available so all you have to do is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Previously Graphviz was in MSYS2 MINGW-packages git repository but was not build-able at that time (2017-03-26) so it is not available via pacman.&lt;br /&gt;
We build latest version from Graphviz git repository by manually patching code in process so we can't yet provide PKGBUILD&lt;br /&gt;
* Easy way&lt;br /&gt;
As we use simple archive not real packages we need to make care that dependencies are satisfied&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed mingw-w64-x86_64-cairo mingw-w64-x86_64-devil mingw-w64-x86_64-expat mingw-w64-x86_64-freetype mingw-w64-x86_64-glib2 mingw-w64-x86_64-gtk2 mingw-w64-x86_64-gtkglext mingw-w64-x86_64-fontconfig mingw-w64-x86_64-freeglut mingw-w64-x86_64-libglade mingw-w64-x86_64-libgd mingw-w64-x86_64-libpng mingw-w64-x86_64-libsystre mingw-w64-x86_64-pango mingw-w64-x86_64-poppler mingw-w64-x86_64-zlib mingw-w64-x86_64-libtool&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Next we download prebuilt archive and extract it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/win64_graphviz_20170323.1842.tar.xz&lt;br /&gt;
tar xfv win64_graphviz_20170323.1842.tar.xz -C /&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
After successful install we first need to configure it (from mingw64 shell)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If no error is displayed everything is working fine and Graphviz registered their plugins.&lt;br /&gt;
We can check version with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -V&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
winpty dot -v&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
libdir = &amp;quot;C:\MSYS2\mingw64\bin&amp;quot;&lt;br /&gt;
Activated plugin library: libgvplugin_dot_layout-6.dll&lt;br /&gt;
Using layout: dot:dot_layout&lt;br /&gt;
Activated plugin library: libgvplugin_core-6.dll&lt;br /&gt;
Using render: dot:core&lt;br /&gt;
Using device: dot:dot:core&lt;br /&gt;
The plugin configuration file: C:\MSYS2\mingw64\bin\config6&lt;br /&gt;
was successfully loaded.&lt;br /&gt;
    render      :  cairo dot fig gd map pic pov ps svg tk vml vrml xdot&lt;br /&gt;
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi&lt;br /&gt;
    textlayout  :  textlayout&lt;br /&gt;
    device      :  bmp canon cmap cmapx cmapx_np dot eps fig gd gd2 gif gv ico imap &lt;br /&gt;
                   imap_np ismap jpe jpeg jpg pdf pic plain plain-ext png pov ps ps2&lt;br /&gt;
                   svg svgz tga tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4&lt;br /&gt;
    loadimage   :  (lib) bmp eps gd gd2 gif ico jpe jpeg jpg pdf png ps svg xbm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way (TODO)&lt;br /&gt;
====pygraphviz====&lt;br /&gt;
Needed for NetworkChart report (Third-party addon)&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way&lt;br /&gt;
download https://gramps-project.org/wiki/images/2/2b/Pygraphviz-1.4rc1.zip  [[:File:Pygraphviz-1.4rc1.zip|(source here)]]&lt;br /&gt;
&lt;br /&gt;
Unzip it into &amp;lt;code&amp;gt;~/build/pygraphviz-1.4rc1/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build/pygraphviz-1.4rc1&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-0.0-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also networkx package&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-networkx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also pydotplus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip3 install pydotplus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osmgpsmap===&lt;br /&gt;
As of 2019.02.08 package mingw-w64-osm-gps-map is available so all you have to do is &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Start '''msys2 shell''' (always build package recipes from msys2 shell)&lt;br /&gt;
Hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/Alexpux/MINGW-packages/trunk/mingw-w64-osm-gps-map&lt;br /&gt;
cd mingw-w64-osm-gps-map&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-osm-gps-map-1.1.0-2-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Issue==&lt;br /&gt;
===Graphviz===&lt;br /&gt;
* No Graphviz see: [https://github.com/Alexpux/MINGW-packages/issues/737 MSYS2:Package request: graphviz] &lt;br /&gt;
** Marked as WIP see: https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-graphviz&lt;br /&gt;
&lt;br /&gt;
====Alternate method using Windows version of Graphviz====&lt;br /&gt;
Tested alternate method to use Windows version of Graphviz[http://felsin9.de/nnis/ghc-vis/installing-windows/]&lt;br /&gt;
{{man warn|Warning it is not advised for users to mix various libraries like the following it is a direct way to dll hell.|This way Gramps will use graphviz libs instead of MSYS2 ones and they are older and in much way incompatible with rest of Gramps dependencies.&amp;lt;br&amp;gt; until Graphviz becomes available from MSYS2 directly this is an alternate method.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Download the current GraphViz ZIP archive from https://www.graphviz.org/download/ and extract it to C:\graphviz, so that it directly contains the directories bin, lib, share and so on.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the msys2 prompt type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 'export PATH=/c/graphviz/bin:$PATH' &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&lt;br /&gt;
 python3 Gramps.py -v&lt;br /&gt;
&lt;br /&gt;
and Graphviz will be listed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : 2.38&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Python pip==&lt;br /&gt;
To install a working version of pip use the following steps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mkdir ~/scripts&lt;br /&gt;
cd ~/scripts&lt;br /&gt;
curl -O 'https://bootstrap.pypa.io/get-pip.py'&lt;br /&gt;
./get-pip.py&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Test that it works:&lt;br /&gt;
&lt;br /&gt;
  pip3 --version&lt;br /&gt;
&lt;br /&gt;
If that succeeds you can now remove the installation script if wanted:&lt;br /&gt;
 &lt;br /&gt;
  rm get-pip.py&lt;br /&gt;
&lt;br /&gt;
==Keep your [[Gramps_{{man version}}_Wiki_Manual_-_Command_Line#GRAMPSHOME|GRAMPSHOME]] separate==&lt;br /&gt;
To keep your test family trees separate from your personal family trees you may want to use your MSYS2 home directory which you can set from mingw64 shell either:&lt;br /&gt;
&lt;br /&gt;
On each run like:&lt;br /&gt;
&lt;br /&gt;
   GRAMPSHOME=~ python3 Gramps.py&lt;br /&gt;
&lt;br /&gt;
If you want it persistent:&lt;br /&gt;
&lt;br /&gt;
   echo 'export GRAMPSHOME=~' &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
   source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Running a development version of Gramps]]&lt;br /&gt;
* [https://sourceforge.net/p/gramps/mailman/message/35346200/ Gramps on WSL (Win10/Ubuntu 14.04/VcXsvr)]&lt;br /&gt;
&lt;br /&gt;
[[Category:GEPS|M]]&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=108737</id>
		<title>Gramps for Windows with MSYS2</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=108737"/>
		<updated>2024-12-07T18:54:28Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Remove obsolete references to 32-bit build and Windows XP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man warn|1=Warning|2=Do not open your existing databases with the master branch, it might destroy your data, and will make it impossible to use the data in the stable version {{stable_branch}}. To try it out, export your database to a gramps xml file, eg &amp;lt;code&amp;gt;test_master.gramps&amp;lt;/code&amp;gt;, create a new family tree in the master branch, and import this xml file.&amp;lt;br&amp;gt;Alternatively you can [[Gramps_for_Windows_with_MSYS2#Keep_your_GRAMPSHOME_separate|Keep your GRAMPSHOME separate]]}}&lt;br /&gt;
&lt;br /&gt;
How to use MSYS2 to run latest Gramps development version from source in 64-bit Windows.&lt;br /&gt;
&lt;br /&gt;
==Install MSYS2==&lt;br /&gt;
&lt;br /&gt;
{{man note|Installation restrictions|MSYS2 can't be installed on [https://en.wikipedia.org/wiki/File_Allocation_Table FAT* formatted disk partitions].&amp;lt;br&amp;gt;Current MSYS2 can't be installed on Windows XP anymore.}}&lt;br /&gt;
&lt;br /&gt;
From the MSYS2 home page https://www.msys2.org/ download the latest MSYS2 64-bit installer( msys2-x86_64-YYYYMMDD.exe ) from [https://repo.msys2.org/distrib/x86_64/ https://repo.msys2.org/distrib/x86_64/] and run it.&lt;br /&gt;
&lt;br /&gt;
Install it in short path like &amp;lt;code&amp;gt;C:\msys64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of install select to run mingw64 shell eg: use the '''MSYS2 MINGW64''' shortcut.&lt;br /&gt;
&lt;br /&gt;
===Update MSYS2===&lt;br /&gt;
First keep running the following command(multiple times) until it has updated the list of packages and updated all core packages nothing else to do: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -Syuu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If core packages are updated you must close the mingw64 shell (forcefully with close button, not just typing exit on it) and then restart the mingw64 shell from the shortcut. Following a core update, run the update command again to update non-core packages.&lt;br /&gt;
&lt;br /&gt;
===Install Gramps dependencies===&lt;br /&gt;
Start mingw64 shell and use '''pacman''' package manager to download and install Gramps dependencies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-bsddb3 mingw-w64-x86_64-gexiv2 mingw-w64-x86_64-ghostscript mingw-w64-x86_64-python3-cairo mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-icu mingw-w64-x86_64-iso-codes mingw-w64-x86_64-hunspell mingw-w64-x86_64-hunspell-en mingw-w64-x86_64-enchant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To handle the following warning '''No intltool or version &amp;lt; 0.25.0, build_intl is aborting''' during the build later, install:&lt;br /&gt;
  pacman -S perl-XML-Parser&lt;br /&gt;
  pacman -S intltool&lt;br /&gt;
&lt;br /&gt;
You will also need the following to run the test:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-lxml&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-jsonschema&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Some additional (optional) items needed for certain addons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-gtkspell3&lt;br /&gt;
pacman -S mingw-w64-x86_64-geocode-glib&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-pillow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Git and Gcc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S msys/git&lt;br /&gt;
pacman -S msys/gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Genealogical Symbols preferences tab needs Python Fontconfig version 0.5 so we need to build it.&lt;br /&gt;
From a suitable build directory (I use ~/build)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Vayn/python-fontconfig.git&lt;br /&gt;
cd python-fontconfig/&lt;br /&gt;
git checkout e1b1751f52167184e0c&lt;br /&gt;
python3 setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Graphviz. To run the Graph View addon also install goocanvas.&lt;br /&gt;
(If you run into a problem try the alternate instructions to install [[Gramps_for_Windows_with_MSYS2#Issue|Graphviz]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
pacman -S mingw-w64-x86_64-goocanvas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install osmgpsmap for the Geography Views with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Gramps==&lt;br /&gt;
===Prepare source===&lt;br /&gt;
Create directory to store Gramps source in and go to it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/grampsdev&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download source===&lt;br /&gt;
Download Gramps master branch from source repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
git remote add -t master -f origin https://github.com/gramps-project/gramps.git&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check which Gramps version is used&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git describe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
it should return something like:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
v5.0.0-alpha1-1024-g0919763f1&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===Setup source===&lt;br /&gt;
Before using Gramps you must set-it up.&lt;br /&gt;
&amp;lt;br&amp;gt;You just use '''setup build''' command not '''install''' one&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 setup.py build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Run Gramps==&lt;br /&gt;
Start mingw64 shell and go to directory where Gramps source reside&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Use python3 to start Gramps&lt;br /&gt;
&amp;lt;br&amp;gt;To check gramps version use &amp;quot;v&amp;quot; flag&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should return something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Settings:&lt;br /&gt;
----------------&lt;br /&gt;
 python    : 3.5.3&lt;br /&gt;
 gramps    : 5.0.0-alpha1-0919763f1&lt;br /&gt;
 gtk++     : 3.22.9&lt;br /&gt;
 pygobject : 3.22.0&lt;br /&gt;
 pango     : 1.40.3&lt;br /&gt;
 cairo     : 1.15.4&lt;br /&gt;
 pycairo   : 1.1.10&lt;br /&gt;
 osmgpsmap : 1.0&lt;br /&gt;
 GExiv2    : 0.10&lt;br /&gt;
 ICU       : 57.1&lt;br /&gt;
 PyICU     : 1.9.3&lt;br /&gt;
 o.s.      : win32&lt;br /&gt;
&lt;br /&gt;
Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : Graphviz not in system PATH&lt;br /&gt;
 Ghostscr. : 9.20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run Gramps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Building and updating MSYS2/MinGW packages==&lt;br /&gt;
===Install build tools===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed --noconfirm base-devel mingw-w64-x86_64-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[https://github.com/Alexpux/MINGW-packages MINGW-packages recipes] are on GitHub so you can use git to clone it. If instead you want to access recipe one by one you can download it with Subversion so install it first&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S subversion&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We need a place to download and build from source code so we will create folder called &amp;quot;build&amp;quot; inside our home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To prevent pacman to upgrade packages we rebuilt for our needs we can assign them to group '''gramps_fixed''' and add them to IgnoreGroup list.&lt;br /&gt;
Open in text editor file ''etc/pacman.conf'' (C:\MSYS2\etc\pacman.conf) and add line ''IgnoreGroup = gramps_fixed'' to ''options'' section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[options]&lt;br /&gt;
IgnoreGroup = gramps_fixed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===db===&lt;br /&gt;
GrampsAIO uses Oracle Berkeley DB version 6.0.30 but MSYS2 have it at version 6.0.19 and most probably never update it to a newer version.&lt;br /&gt;
&amp;lt;br&amp;gt;Gramps will ask permission to downgrade database version at import of any family tree created with GrampsAIO bundle. To prevent that build right version of DB.&lt;br /&gt;
&amp;lt;br&amp;gt;''Hard way'' (it can take some time to finish)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-db&lt;br /&gt;
cd mingw-w64-db&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''The easy way doesn't work anymore!  This is because the recent versions of Python have changed and we have to rebuild.'''&lt;br /&gt;
&amp;lt;br&amp;gt;Start ''msys2 shell'' and type (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bsddb3===&lt;br /&gt;
As db version is changed then we have to rebuild Python bindings for Oracle Berkeley DB&lt;br /&gt;
&amp;lt;br&amp;gt;From ''msys2 shell'' (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Or hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-python-bsddb3&lt;br /&gt;
cd mingw-w64-python-bsddb3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gtk3===&lt;br /&gt;
[https://www.gtk.org/ GTK+] since version 3.20 drag-and-drop code has been rearchitected to move the drag cancel animation and most input handling into GDK, thereby dropping most of the platform-dependent code out of GTK (MSYS2 version of GTK is currently 3.22.10). This change is not yet present in Windows port of code so we have to use older GTK version 3.18 where it still works.&lt;br /&gt;
&amp;lt;br&amp;gt;Latest in gtk-3.18 branch is gtk-3.18.9 (previous versions of this branch have working dnd but have other bugs) so we build that.&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard Way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-gtk3&lt;br /&gt;
cd mingw-w64-gtk3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===graphviz===&lt;br /&gt;
&lt;br /&gt;
As of 2019.09.17 package mingw-w64-osm-gps-map is available so all you have to do is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Previously Graphviz was in MSYS2 MINGW-packages git repository but was not build-able at that time (2017-03-26) so it is not available via pacman.&lt;br /&gt;
We build latest version from Graphviz git repository by manually patching code in process so we can't yet provide PKGBUILD&lt;br /&gt;
* Easy way&lt;br /&gt;
As we use simple archive not real packages we need to make care that dependencies are satisfied&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed mingw-w64-x86_64-cairo mingw-w64-x86_64-devil mingw-w64-x86_64-expat mingw-w64-x86_64-freetype mingw-w64-x86_64-glib2 mingw-w64-x86_64-gtk2 mingw-w64-x86_64-gtkglext mingw-w64-x86_64-fontconfig mingw-w64-x86_64-freeglut mingw-w64-x86_64-libglade mingw-w64-x86_64-libgd mingw-w64-x86_64-libpng mingw-w64-x86_64-libsystre mingw-w64-x86_64-pango mingw-w64-x86_64-poppler mingw-w64-x86_64-zlib mingw-w64-x86_64-libtool&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Next we download prebuilt archive and extract it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/win64_graphviz_20170323.1842.tar.xz&lt;br /&gt;
tar xfv win64_graphviz_20170323.1842.tar.xz -C /&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
After successful install we first need to configure it (from mingw64 shell)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If no error is displayed everything is working fine and Graphviz registered their plugins.&lt;br /&gt;
We can check version with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -V&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
winpty dot -v&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
libdir = &amp;quot;C:\MSYS2\mingw64\bin&amp;quot;&lt;br /&gt;
Activated plugin library: libgvplugin_dot_layout-6.dll&lt;br /&gt;
Using layout: dot:dot_layout&lt;br /&gt;
Activated plugin library: libgvplugin_core-6.dll&lt;br /&gt;
Using render: dot:core&lt;br /&gt;
Using device: dot:dot:core&lt;br /&gt;
The plugin configuration file: C:\MSYS2\mingw64\bin\config6&lt;br /&gt;
was successfully loaded.&lt;br /&gt;
    render      :  cairo dot fig gd map pic pov ps svg tk vml vrml xdot&lt;br /&gt;
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi&lt;br /&gt;
    textlayout  :  textlayout&lt;br /&gt;
    device      :  bmp canon cmap cmapx cmapx_np dot eps fig gd gd2 gif gv ico imap &lt;br /&gt;
                   imap_np ismap jpe jpeg jpg pdf pic plain plain-ext png pov ps ps2&lt;br /&gt;
                   svg svgz tga tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4&lt;br /&gt;
    loadimage   :  (lib) bmp eps gd gd2 gif ico jpe jpeg jpg pdf png ps svg xbm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way (TODO)&lt;br /&gt;
====pygraphviz====&lt;br /&gt;
Needed for NetworkChart report (Third-party addon)&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way&lt;br /&gt;
download https://gramps-project.org/wiki/images/2/2b/Pygraphviz-1.4rc1.zip  [[:File:Pygraphviz-1.4rc1.zip|(source here)]]&lt;br /&gt;
&lt;br /&gt;
Unzip it into &amp;lt;code&amp;gt;~/build/pygraphviz-1.4rc1/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build/pygraphviz-1.4rc1&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-0.0-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also networkx package&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-networkx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also pydotplus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip3 install pydotplus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osmgpsmap===&lt;br /&gt;
As of 2019.02.08 package mingw-w64-osm-gps-map is available so all you have to do is &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Start '''msys2 shell''' (always build package recipes from msys2 shell)&lt;br /&gt;
Hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/Alexpux/MINGW-packages/trunk/mingw-w64-osm-gps-map&lt;br /&gt;
cd mingw-w64-osm-gps-map&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-osm-gps-map-1.1.0-2-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Issue==&lt;br /&gt;
===Graphviz===&lt;br /&gt;
* No Graphviz see: [https://github.com/Alexpux/MINGW-packages/issues/737 MSYS2:Package request: graphviz] &lt;br /&gt;
** Marked as WIP see: https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-graphviz&lt;br /&gt;
&lt;br /&gt;
====Alternate method using Windows version of Graphviz====&lt;br /&gt;
Tested alternate method to use Windows version of Graphviz[http://felsin9.de/nnis/ghc-vis/installing-windows/]&lt;br /&gt;
{{man warn|Warning it is not advised for users to mix various libraries like the following it is a direct way to dll hell.|This way Gramps will use graphviz libs instead of MSYS2 ones and they are older and in much way incompatible with rest of Gramps dependencies.&amp;lt;br&amp;gt; until Graphviz becomes available from MSYS2 directly this is an alternate method.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Download the current GraphViz ZIP archive from https://www.graphviz.org/download/ and extract it to C:\graphviz, so that it directly contains the directories bin, lib, share and so on.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the msys2 prompt type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 'export PATH=/c/graphviz/bin:$PATH' &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&lt;br /&gt;
 python3 Gramps.py -v&lt;br /&gt;
&lt;br /&gt;
and Graphviz will be listed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : 2.38&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Python pip==&lt;br /&gt;
To install a working version of pip use the following steps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mkdir ~/scripts&lt;br /&gt;
cd ~/scripts&lt;br /&gt;
curl -O 'https://bootstrap.pypa.io/get-pip.py'&lt;br /&gt;
./get-pip.py&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Test that it works:&lt;br /&gt;
&lt;br /&gt;
  pip3 --version&lt;br /&gt;
&lt;br /&gt;
If that succeeds you can now remove the installation script if wanted:&lt;br /&gt;
 &lt;br /&gt;
  rm get-pip.py&lt;br /&gt;
&lt;br /&gt;
==Keep your [[Gramps_{{man version}}_Wiki_Manual_-_Command_Line#GRAMPSHOME|GRAMPSHOME]] separate==&lt;br /&gt;
To keep your test family trees separate from your personal family trees you may want to use your MSYS2 home directory which you can set from mingw64 shell either:&lt;br /&gt;
&lt;br /&gt;
On each run like:&lt;br /&gt;
&lt;br /&gt;
   GRAMPSHOME=~ python3 Gramps.py&lt;br /&gt;
&lt;br /&gt;
If you want it persistent:&lt;br /&gt;
&lt;br /&gt;
   echo 'export GRAMPSHOME=~' &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
   source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Running a development version of Gramps]]&lt;br /&gt;
* [https://sourceforge.net/p/gramps/mailman/message/35346200/ Gramps on WSL (Win10/Ubuntu 14.04/VcXsvr)]&lt;br /&gt;
&lt;br /&gt;
[[Category:GEPS|M]]&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=107294</id>
		<title>Programming guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=107294"/>
		<updated>2024-11-07T03:57:05Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Clarify that pylint is not enforced by CI, while still encouraging its use. Remove parentheses for simplicity and emphasis.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a multi-programmer environment, it is important to follow common coding guidelines to make sure the code remains maintainable. &lt;br /&gt;
&lt;br /&gt;
== Coding style ==&lt;br /&gt;
&lt;br /&gt;
=== PEP8 ===&lt;br /&gt;
* Write [https://www.python.org/dev/peps/pep-0008/ PEP 8] compatible code! This is important to have a consistent, readable codebase.&lt;br /&gt;
** it is not explicit in PEP8, but we like a space after a comma&lt;br /&gt;
&lt;br /&gt;
=== Tabs ===&lt;br /&gt;
* Do not use TABs. Use space characters. In Gramps we use 4 spaces for indentation. This does not mean you must set your TAB stops to 4. TABs and indents are not the same thing. Most editors have a configuration option to set indentation and TAB stops. Be careful to just set the '''indentation''' to 4, which automatically means it has to be '''spaces'''. TABs are still necessary, in Makefiles for example, and they '''have to''' be equivalent to 8 spaces, '''always'''. To summarize:&lt;br /&gt;
** uses spaces, no TABs&lt;br /&gt;
** indentation is 4&lt;br /&gt;
** TAB stops (if any) are at position 9,17,25,... (first column is 1)&lt;br /&gt;
&lt;br /&gt;
=== Members names ===&lt;br /&gt;
* Private class functions (functions that cannot be called outside the class) should be preceded with two underscores. &lt;br /&gt;
* Protected functions (functions that can only be called by the class or derived classes) should be preceded with one underscore.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __private_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
 &lt;br /&gt;
def _protected_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&lt;br /&gt;
Names of callbacks should be prefixed by 'cb_'.  For example, &amp;lt;code&amp;gt;cb_my_callback&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; does not check that arguments are used when methods are named in this way.  This is useful to avoid the &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; warning:  'W0613: Unused argument &amp;lt;arg&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
=== Imports ===&lt;br /&gt;
The top module is called gramps, and it has following submodules:&lt;br /&gt;
* gen&lt;br /&gt;
* cli&lt;br /&gt;
* gui&lt;br /&gt;
* plugins&lt;br /&gt;
The other dirs should not contain code, or are for testing.&lt;br /&gt;
&lt;br /&gt;
Within a submodule, only relative imports are allowed of the own submodule (so starting with . or with a module of the own directory), and absolute imports of other submodules (so starting with &amp;lt;code&amp;gt;gramps.&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{man note|Important:|files in the gen submodule are '''not''' allowed to import files from the other submodules. So &amp;lt;code&amp;gt;gen&amp;lt;/code&amp;gt; should be self-contained.}}&lt;br /&gt;
&lt;br /&gt;
== Class headers ==&lt;br /&gt;
* Each class should have a simple header to help mark it in the file. This is not used for documentation - it is used to help find the class when multiple classes exist in the same file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
#&lt;br /&gt;
# MyClass&lt;br /&gt;
#&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
* Python provides a docstrings to document classes and functions. If the class is a class used by others (such as the [http://www.gramps-project.org/docs/gen/gen_lib.html#module-gen.lib gen lib] classes), the docstrings should follow the restructuredtext ([http://docutils.sourceforge.net/docs/user/rst/quickstart.html#structure rst]) format. This allows us to extract [http://www.gramps-project.org/docs/ API] documentation [[Devhelp#See_also|using Sphinx]], a documentation generator for Python code.&lt;br /&gt;
&lt;br /&gt;
* Aside from adding doc strings to classes and functions, also the api generating rst files must be edited so as to extract the documentation. These files are in the [https://github.com/gramps-project/gramps/tree/master/docs docs directory], for info read the [https://github.com/gramps-project/gramps/blob/master/docs/README.txt /docs/README.txt] file.&lt;br /&gt;
&lt;br /&gt;
:More info&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/markup/ Sphinx for python]&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/rest.html doc with Sphinx]&lt;br /&gt;
&lt;br /&gt;
Classes that are not core reusable classes do not have to follow this format (although we encourage you do), but should be documented using docstrings.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    MyClass is a sample class.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    def my_function(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        The my_function task serves no purpose whatsoever.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black ==&lt;br /&gt;
Gramps CI checks for code formatting compliance using [https://github.com/psf/black Black]. When a PR fails the check, code which requires changes is shown in the Checks tab in the Lint panel. You may update the code manually to make it pass, or integrate Black formatter with your preferred editor to ensure that the check will pass. When using Black locally, use the same version as the CI system to ensure formatting consistency.&lt;br /&gt;
&lt;br /&gt;
== Pylint ==&lt;br /&gt;
* Run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; on your code before checking in. &lt;br /&gt;
* New files shall have a Pylint score of 9 or higher, but not enforced by CI tools as Black formatting is.&lt;br /&gt;
* Any changes to existing files with a Pylint score lower than 9 shall not reduce the Pylint score. It is expected that over time, this policy will cause all files to eventually have a score of 9 or higher.&lt;br /&gt;
&lt;br /&gt;
Note that you must run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt; directory. If import errors still occur, add a PYTHONPATH. Example usage:&lt;br /&gt;
  me@laptop:~/programs/master/src$ PYTHONPATH=plugins/lib/ pylint --reports=y plugins/mapservices/googlemap.py&lt;br /&gt;
Set reports to '''n''' to have less output. Information on the meaning of codes can be found here:&lt;br /&gt;
* [http://pylint-messages.wikidot.com/all-codes All codes, PyLint 1.1.0] Messages: and what they're trying to tell you&lt;br /&gt;
* [https://pylint.readthedocs.io/en/stable/user_guide/messages Pylint current stable] documentation - now generally has a bit more detail that the older version&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Maintain good code hygiene by following coding guidelines and running code analysis and formatting tools locally&lt;br /&gt;
&lt;br /&gt;
* Always develop with [[Coding_for_translation|language translation]] in mind &lt;br /&gt;
&lt;br /&gt;
* Reduce dependencies (imports) between files.&lt;br /&gt;
&lt;br /&gt;
* Think on [[Accessibility]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramplets_development&amp;diff=106286</id>
		<title>Gramplets development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramplets_development&amp;diff=106286"/>
		<updated>2024-10-07T13:50:34Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{languages|Gramplets}}--&amp;gt;&lt;br /&gt;
{{man tip|This section contains technical details about programming Gramplets and is intended for Developers.|'''If you are interested in using Gramplets, please see the [[Gramps_{{man version}}_Wiki_Manual_-_Gramplets|user manual section on gramplets]]'''.}}&lt;br /&gt;
&lt;br /&gt;
A '''Gramplet''' is a [[Addon_list_legend#Type|type of Gramps plugin]]. Gramplets are mini-views designed to be composited with other Gramplets or Views to create a way to see your Family Tree that is just right for you. In fact, Gramplets can be made to do just about anything that you want.&lt;br /&gt;
&lt;br /&gt;
[[File:DashboardCategory-DashboardView-default-gramplets-52.png|450px|thumb|right|Default Gramplets on Dashboard - With Example Family Tree Open]]&lt;br /&gt;
[[File:Dashboard-category-view-first-open-no-family-tree-loaded-52.png|450px|thumb|right|Default Gramplets on Dashboard - No Family Tree Loaded]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Gramplet Interface =&lt;br /&gt;
&lt;br /&gt;
Gramplet only operate after being added to a view. Add (or remove and restore) to the [[Gramps_{{man version}}_Wiki_Manual_-_Main_Window#Bottombar_and_Sidebar|sidebar or bottombar]] of a view by clicking the {{man button|&amp;amp;or;}} (''Down Arrowhead'' button) also known as the '''Gramplet Bar Menu''' at the far top right of the bars titles, and then using one of the options from the drop-down menu. In the Dashboard view, this menu is accessed by right-clicking in-between gramplets in the main view.&lt;br /&gt;
&lt;br /&gt;
Gramplet can dramatically degrade the performance of Gramps. Some Gramplets consume huge amounts of memory, processor power and move a lot of data through storage. Don't keep a Gramplet active when it isn't being used!&lt;br /&gt;
&lt;br /&gt;
When the view is not active or Gramplet tab is not the foremost in the splitbar, the Gramplet is inactive. A detached (undocked) Gramplet is always active.&lt;br /&gt;
&lt;br /&gt;
The user interface for a Gramplet is left completely to the discretion of the developer. Detach/undock a Gramplet to reveal the &amp;quot;Help&amp;quot; button. Explore the Configure options after adding a Gramplet.&lt;br /&gt;
&lt;br /&gt;
== Are Gramplets and 'plug-ins' the same thing? ==&lt;br /&gt;
There are many [[Addon_list_legend#Type|types of plugins]]. The 6 most common are:&lt;br /&gt;
&lt;br /&gt;
# '''Reports''': output for printing or display&lt;br /&gt;
# '''Tools''': a method for processing data&lt;br /&gt;
# '''Quick View''': a list of details based on the current object&lt;br /&gt;
# '''Importer''': reads a file into your current tree&lt;br /&gt;
# '''Exporter''': writes a file from your current tree&lt;br /&gt;
# '''Gramplets''': interactive views for moving, analysing, displaying, etc.&lt;br /&gt;
&lt;br /&gt;
There are two plugin directories: a global/system one, and a private/personal one.  You can easily create a plugin by simply putting a file in plugins folder of your [[Gramps_{{man version}}_Wiki_Manual_-_User_Directory|User Directory]] (usually in ''&amp;lt;code&amp;gt;.gramps/grampsxx/plugins/gramplet/&amp;lt;/code&amp;gt;'' ).&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
In teaching programming, a common &amp;quot;first program&amp;quot; is to write a program that says &amp;quot;Hello World&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Let us jump right in and take a look at such a gramplet named ''HelloWorld.py'':&lt;br /&gt;
&lt;br /&gt;
Create a python file named ''HelloWorld.py'' and add the following content:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: HelloWorld.py&lt;br /&gt;
def init(gui):&lt;br /&gt;
    gui.set_text(&amp;quot;Hello world!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And create another python file named ''HelloWorld.gpr.py'' with the following content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: HelloWorld.gpr.py&lt;br /&gt;
register(GRAMPLET,&lt;br /&gt;
         id=&amp;quot;Hello World Gramplet&amp;quot;, &lt;br /&gt;
         name=_(&amp;quot;Hello World Gramplet&amp;quot;),&lt;br /&gt;
         description = _(&amp;quot;a program that says 'Hello World'&amp;quot;),&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         version=&amp;quot;0.0.1&amp;quot;,&lt;br /&gt;
         fname=&amp;quot;HelloWorld.py&amp;quot;,&lt;br /&gt;
         height = 20,&lt;br /&gt;
         gramplet = 'init',&lt;br /&gt;
         gramplet_title=_(&amp;quot;Sample Gramplet&amp;quot;),&lt;br /&gt;
         gramps_target_version=&amp;quot;5.2&amp;quot;,&lt;br /&gt;
         help_url=&amp;quot;Sample Gramplet&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can read more about the gpr.py file in [[Addons_development#Create_a_Gramps_Plugin_Registration_file|Addons development]] and the [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py source code implementation].&lt;br /&gt;
&lt;br /&gt;
If you place these files in '''your personal [[Gramps_{{man version}}_Wiki_Manual_-_User_Directory|user plugins directory]]''' (usually in ''.gramps/grampsxx/plugins/gramplet/'' ), and then restart Gramps, you will be able to create this Gramplet. On the '''Dashboard Category View''', right-click in an open area and select the &amp;quot;Hello World Gramplet&amp;quot;. You should then see:&lt;br /&gt;
&lt;br /&gt;
[[File:HelloWorldGramplet-example-shown-embeded-on-DashboardCategory-52.png|thumb|450px|left|Hello World Gramplet - example (shown embedded on Dashboard Category View / Context menu &amp;quot;Add a gramplet&amp;quot; also shown)]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Explanation ===&lt;br /&gt;
&lt;br /&gt;
The main work of a Gramplet is performed in a function, or a class. In this very simple example, a function &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt; is defined that takes a single argument, &amp;lt;code&amp;gt;gui&amp;lt;/code&amp;gt;. The function simply sets the gui's text area to be &amp;quot;Hello World!&amp;quot;, and that's it. It does this just once, and never changes.&lt;br /&gt;
&lt;br /&gt;
Before a plugin can be used, it needs to be &amp;quot;registered&amp;quot;. You call the register function with a number of named-arguments. There are a number of named-arguments that you can provide, including: name, height, content, title, expand, state, and data. We will explore those in detail, below.&lt;br /&gt;
&lt;br /&gt;
== Hello World, with Class ==&lt;br /&gt;
&lt;br /&gt;
Here is the same functionality again, but this time as a class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: HelloWorld2.py&lt;br /&gt;
from gramps.gen.plug import Gramplet&lt;br /&gt;
&lt;br /&gt;
class HelloWorldGramplet(Gramplet):&lt;br /&gt;
    def init(self):&lt;br /&gt;
        self.set_text(&amp;quot;Hello world!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: HelloWorld2.gpr.py&lt;br /&gt;
register(GRAMPLET,&lt;br /&gt;
         id=&amp;quot;Hello World2 Gramplet&amp;quot;, &lt;br /&gt;
         name=_(&amp;quot;Hello World2 Gramplet&amp;quot;),&lt;br /&gt;
         description = _(&amp;quot;a program that says 'Hello World'&amp;quot;),&lt;br /&gt;
         version=&amp;quot;0.0.1&amp;quot;,&lt;br /&gt;
         gramps_target_version=&amp;quot;5.2&amp;quot;,&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname=&amp;quot;HelloWorld2.py&amp;quot;,&lt;br /&gt;
         height = 20, &lt;br /&gt;
         gramplet = 'HelloWorldGramplet',&lt;br /&gt;
         gramplet_title=_(&amp;quot;Sample Gramplet&amp;quot;),&lt;br /&gt;
         help_url=&amp;quot;5.2_Addons#Addon_List&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the '''recommended method''' of creating a Gramplet. The following details describe the properties and methods of this class.&lt;br /&gt;
&lt;br /&gt;
== Register Options ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;GRAMPLET&amp;lt;/code&amp;gt;''': the first argument is the keyword GRAMPLET&lt;br /&gt;
* '''&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;''': the identifying name of the gramplet, unique among all plugins&lt;br /&gt;
* '''&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;''': the translated gramplet's name&lt;br /&gt;
* '''&amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;''': the minimum (or maximum) height of the gramplet in normal mode&lt;br /&gt;
* '''&amp;lt;code&amp;gt;fname&amp;lt;/code&amp;gt;''': the name of your gramplet file&lt;br /&gt;
* '''&amp;lt;code&amp;gt;gramplet&amp;lt;/code&amp;gt;''': the name of the function or class in fname that creates the gramplet&lt;br /&gt;
* '''&amp;lt;code&amp;gt;gramplet_title&amp;lt;/code&amp;gt;''': the default gramplet title; user changeable in ''Configure View''&lt;br /&gt;
* '''&amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;''': STABLE or UNSTABLE for Gramps 5.1 version. EXPERIMENTAL, BETA {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;audience&amp;lt;/code&amp;gt;''': ALL, DEVELOPER, EXPERT {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;''': a string with 2 dots (such as &amp;quot;1.23.14&amp;quot;) representing the version number&lt;br /&gt;
* '''&amp;lt;code&amp;gt;gramps_target_version&amp;lt;/code&amp;gt;''': a string with 2 dots representing the version of Gramps for which this gramplet was written. Only gramplets matching the installed version will be available for installation. &lt;br /&gt;
&lt;br /&gt;
At the bare minimum, you need to have the above 11 options when registering your Gramplets.&lt;br /&gt;
&lt;br /&gt;
Optionally, you are encouraged to use the following, if known:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;detached_width&amp;lt;/code&amp;gt;''': the size in pixels of the minimum and default detached height&lt;br /&gt;
* '''&amp;lt;code&amp;gt;detached_height&amp;lt;/code&amp;gt;''': the size in pixels of the minimum and default detached height&lt;br /&gt;
* '''&amp;lt;code&amp;gt;expand&amp;lt;/code&amp;gt;''': whether or not the Gramplet should expand to fill the column, if it can&lt;br /&gt;
* '''&amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;''': a description of the Gramplet&lt;br /&gt;
* '''&amp;lt;code&amp;gt;authors&amp;lt;/code&amp;gt;''': List (comma separated strings) of authors of the plugin, default=[] &lt;br /&gt;
* '''&amp;lt;code&amp;gt;authors_email&amp;lt;/code&amp;gt;''':  List of emails of the authors (in the same order as the '''&amp;lt;code&amp;gt;authors&amp;lt;/code&amp;gt;''' list) of the plugin, default=[]&lt;br /&gt;
* '''&amp;lt;code&amp;gt;maintainers&amp;lt;/code&amp;gt;''': List of maintainers of the plugin, default=[] {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;maintainers_email&amp;lt;/code&amp;gt;''': List of emails of the maintainers (in the same order as the '''&amp;lt;code&amp;gt;maintainers&amp;lt;/code&amp;gt;''' list) of the plugin, default=[] {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;requires_mod&amp;lt;/code&amp;gt;''': specifies python modules that the addon requires. If you want to allow Gramps to try to install a module using pip, then it should be pure python. {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;requires_gi&amp;lt;/code&amp;gt;''': specifies GObject introspection modules that are required. Gramps cannot install these {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;requires_exe&amp;lt;/code&amp;gt;''': specifies executables that must be present in the PATH. Again, the user must install these themselves {{new|5.2.0}} &lt;br /&gt;
* '''&amp;lt;code&amp;gt;help_url&amp;lt;/code&amp;gt;''': the title of the wiki page that describes the plugin. &amp;lt;br /&amp;gt;If the help_url starts with &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; (or the secure &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt; {{new|5.2.0}}) then that fully qualified URL will be used as is. Otherwise, the paths will be interpreted as relative to &amp;lt;code&amp;gt;http&amp;amp;#58;//gramps-project.org/wiki/index.php?title=&amp;lt;/code&amp;gt; base URL. The base URL will be prepended to the '''help_url''' and may get a language extension (such as &amp;lt;code&amp;gt;/nl&amp;lt;/code&amp;gt; ) appended at the end, if the operating language is one of '''nl''' '''fr''' '''sq''' '''mk''' '''de''' '''fi''' '''ru''' '''sk'''. You should '''''not''''' use the &amp;lt;code&amp;gt;_(&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt; translate function around the '''&amp;lt;code&amp;gt;help_url&amp;lt;/code&amp;gt;''' string, unless you specifically intend to create web pages named with the translated string.&lt;br /&gt;
&lt;br /&gt;
== Core Methods ==&lt;br /&gt;
&lt;br /&gt;
The class-based gramplet utilizes the following methods:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt;''': run once, on construction&lt;br /&gt;
* '''&amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;''': run once per update&lt;br /&gt;
* '''&amp;lt;code&amp;gt;update()&amp;lt;/code&amp;gt;''': don't change this, it calls main&lt;br /&gt;
* '''&amp;lt;code&amp;gt;active_changed()&amp;lt;/code&amp;gt;''': run when active-changed is triggered&lt;br /&gt;
* '''&amp;lt;code&amp;gt;db_changed()&amp;lt;/code&amp;gt;''': run when db-changed is triggered&lt;br /&gt;
* '''&amp;lt;code&amp;gt;set_tooltip(TEXT)&amp;lt;/code&amp;gt;''' - tooltip for gramplet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Don't call main directly; use the update method.&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;code&amp;gt;db_changed&amp;lt;/code&amp;gt; method, you should connect all of the signals that will trigger an update. That typically looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def db_changed(self):&lt;br /&gt;
        self.dbstate.db.connect('person-add', self.update)&lt;br /&gt;
        self.dbstate.db.connect('person-delete', self.update)&lt;br /&gt;
        self.dbstate.db.connect('person-update', self.update)&lt;br /&gt;
        self.dbstate.db.connect('family-add', self.update)&lt;br /&gt;
        self.dbstate.db.connect('family-delete', self.update)&lt;br /&gt;
        self.dbstate.db.connect('family-update', self.update)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The method &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; can be written as a normal Python method, or it can be written to run nicely in parallel with other Gramps code. To make it run nicely in parallel, you should issue a '''&amp;lt;code&amp;gt;yield True&amp;lt;/code&amp;gt;''' every once in a while. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def main(self):&lt;br /&gt;
        for i in range(5000):&lt;br /&gt;
            if i % 500 == 0:&lt;br /&gt;
                yield True&lt;br /&gt;
        yield False&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The '''True''' means that there is more to do; '''False''' means that there is nothing left to do.&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [https://github.com/gramps-project/gramps/blob/d84282c496385ffc874d90a692f7d2628d314be7/gramps/gui/displaystate.py#L422 '''&amp;lt;code&amp;gt;DisplayState(Callback)&amp;lt;/code&amp;gt;'''] class for additional signals. (Including Custom Filters, Gramplet display and other updates.)&lt;br /&gt;
&lt;br /&gt;
== Textual Output Methods ==&lt;br /&gt;
&lt;br /&gt;
The most common kinds of Gramplets are text-based. There are a number of methods to assist with handling this text.&lt;br /&gt;
&lt;br /&gt;
* '''set_text(TEXT)''' - clear and set text to TEXT&lt;br /&gt;
* '''append_text(TEXT, scroll_to=POSITION)''' &lt;br /&gt;
** POSITION is 'begin' (top), 'end' (bottom) or 'start' (start of append)&lt;br /&gt;
* '''clear_text()''' - clears all text&lt;br /&gt;
* '''set_use_markup(BOOLEAN-VALUE)'''&lt;br /&gt;
* '''render_text(TEXT)''' - for use with A, B, I, U, and TT tags&lt;br /&gt;
** A for creating links; use tag '''HREF=&amp;quot;url&amp;quot;''' for URLs, and '''WIKI=&amp;quot;name&amp;quot;''' for pages on the wiki&lt;br /&gt;
** B for bold&lt;br /&gt;
** I for italics&lt;br /&gt;
** U for underlined&lt;br /&gt;
** TT for a fixed-width, typewriter font&lt;br /&gt;
* '''link(TEXT, LINK-TYPE, DATA)''' - &lt;br /&gt;
** TEXT can be any text&lt;br /&gt;
** LINK-TYPE is: &lt;br /&gt;
*** 'Person' - and DATA is a person handle&lt;br /&gt;
*** 'PersonList' - and DATA is a list of handles&lt;br /&gt;
*** 'Family' - and DATA is a family handle&lt;br /&gt;
*** 'Surname' - and DATA is a person&lt;br /&gt;
*** 'Given' - &lt;br /&gt;
*** 'Filter' - and DATA is either:&lt;br /&gt;
**** 'all people' -&lt;br /&gt;
**** 'males' - all males&lt;br /&gt;
**** 'females' - all females&lt;br /&gt;
**** 'people with unknown gender' - people marked as unknown&lt;br /&gt;
**** 'people with incomplete names' - people who have a missing surname or given name&lt;br /&gt;
**** 'people with missing birth dates' - people who have missing birth dates&lt;br /&gt;
**** 'disconnected people' - people with no parents and no children&lt;br /&gt;
**** 'all families' - all families&lt;br /&gt;
**** 'unique surnames' - list of all unique surnames&lt;br /&gt;
**** 'people with media' - people who have media&lt;br /&gt;
**** 'media references' - all of the media&lt;br /&gt;
**** 'unique media' - &lt;br /&gt;
**** 'missing media' - media for which the file does not exist&lt;br /&gt;
**** 'media by size' - &lt;br /&gt;
**** 'list of people'- &lt;br /&gt;
*** 'URL' - and DATA is a URL&lt;br /&gt;
*** 'WIKI' - and DATA is a wiki page&lt;br /&gt;
*** 'Attribute' - and DATA is an attribute (eg, 'Nickname')&lt;br /&gt;
* '''no_wrap()''' - turn word wrap off DEPRECATED &lt;br /&gt;
* '''set_wrap(BOOL)''' - change word wrap&lt;br /&gt;
&lt;br /&gt;
=== Using Tags ===&lt;br /&gt;
&lt;br /&gt;
Tags are the manner in which you format the text.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   tag = self.gui.buffer.create_tag(&amp;quot;fixed&amp;quot;)&lt;br /&gt;
   tag.set_property(&amp;quot;font&amp;quot;, &amp;quot;Courier 8&amp;quot;)&lt;br /&gt;
   ...&lt;br /&gt;
   start, end = self.gui.buffer.get_bounds()&lt;br /&gt;
   self.gui.buffer.apply_tag_by_name(&amp;quot;fixed&amp;quot;, start, end)&lt;br /&gt;
   self.append_text(&amp;quot;&amp;quot;, scroll_to=&amp;quot;begin&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GUI Interface==&lt;br /&gt;
* [[Gramplets_development#Widget_Gramplet_example|Widget Gramplet example]]&lt;br /&gt;
* [[Gramplets_development#Cairo_Clock_Example|Cairo Clock Example]]&lt;br /&gt;
{{stub}}&lt;br /&gt;
&lt;br /&gt;
===Widget Gramplet example===&lt;br /&gt;
Occasionally, you might have to dive down to the graphical objects that compose a Gramplet.&lt;br /&gt;
&lt;br /&gt;
* gui&lt;br /&gt;
** gui.buffer&lt;br /&gt;
** gui.textview&lt;br /&gt;
** '''gui.get_container_widget()'''&lt;br /&gt;
&lt;br /&gt;
If you wanted to put an arbitrary gtk object into the main area of a Gramplet, then you need to replace the standard textview object with your own. Here is the basic structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: Widget.py&lt;br /&gt;
from gettext import gettext as _&lt;br /&gt;
from gramps.gen.plug import Gramplet&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
class WidgetGramplet(Gramplet):&lt;br /&gt;
    def init(self):&lt;br /&gt;
        self.gui.WIDGET = ### Some Widget Constructor ###&lt;br /&gt;
        self.gui.get_container_widget().remove(self.gui.textview)&lt;br /&gt;
        self.gui.get_container_widget().add_with_viewport(self.gui.WIDGET)&lt;br /&gt;
        self.gui.WIDGET.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: Widget.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GRAMPLET,&lt;br /&gt;
         id= &amp;quot;Widget Gramplet&amp;quot;,&lt;br /&gt;
         name=_(&amp;quot;Widget Gramplet&amp;quot;),&lt;br /&gt;
         description = _(&amp;quot;Widget Gramplet example&amp;quot;),&lt;br /&gt;
         authors = [&amp;quot;John Smith&amp;quot;,&amp;quot;Sam Jones&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;jsmith@example.com&amp;quot;,&amp;quot;user@noemail.invalid&amp;quot;],&lt;br /&gt;
         height=100,&lt;br /&gt;
         expand=False,&lt;br /&gt;
         gramplet = 'WidgetGramplet',&lt;br /&gt;
         gramplet_title=_(&amp;quot;Widget&amp;quot;),&lt;br /&gt;
         version = '0.0.1',&lt;br /&gt;
         gramps_target_version = &amp;quot;5.2&amp;quot;,&lt;br /&gt;
         fname=&amp;quot;Widget.py&amp;quot;,&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gramps 3.x and older====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: Widget.py&lt;br /&gt;
from gettext import gettext as _&lt;br /&gt;
from gramps.gen.plug import Gramplet&lt;br /&gt;
import gtk&lt;br /&gt;
&lt;br /&gt;
class WidgetGramplet(Gramplet):&lt;br /&gt;
    def init(self):&lt;br /&gt;
        self.gui.WIDGET = ### Some Widget Constructor ###&lt;br /&gt;
        self.gui.get_container_widget().remove(self.gui.textview)&lt;br /&gt;
        self.gui.get_container_widget().add_with_viewport(self.gui.WIDGET)&lt;br /&gt;
        self.gui.WIDGET.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# File: Widget.gpr.py&lt;br /&gt;
register(GRAMPLET, &lt;br /&gt;
         id= &amp;quot;Widget Gramplet&amp;quot;, &lt;br /&gt;
         name=_(&amp;quot;Widget Gramplet&amp;quot;), &lt;br /&gt;
         height=100,&lt;br /&gt;
         expand=False,&lt;br /&gt;
         fname=&amp;quot;Widget.py&amp;quot;,&lt;br /&gt;
         gramplet = &amp;quot;WidgetGramplet&amp;quot;,&lt;br /&gt;
         gramps_target_version = &amp;quot;3.4&amp;quot;,&lt;br /&gt;
         gramplet_title=_(&amp;quot;Widget&amp;quot;),&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Cairo Clock Example===&lt;br /&gt;
&lt;br /&gt;
[[File:ClockGramplet-addon-example-50.png|thumb|400px|right|Clock Gramplet - shown detached (Gramps 5.0.0)]]&lt;br /&gt;
&lt;br /&gt;
In fact, with Python, GTK, and cairo, you can make your own widgets that do pretty much anything and look very nice. &lt;br /&gt;
&lt;br /&gt;
Here is an example adding a Cairo Clock (which really keeps time)&lt;br /&gt;
* With GTK+3 &amp;amp; Gramps 5.1&lt;br /&gt;
** Github code: [https://github.com/gramps-project/addons-source/tree/maintenance/gramps51/ClockGramplet ClockGramplet]&lt;br /&gt;
** Manual Download: [https://github.com/gramps-project/addons/blob/master/gramps51/download/ClockGramplet.addon.tgz?raw=true ClockGramplet.addon.tgz]&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== GUI Options ==&lt;br /&gt;
&lt;br /&gt;
* '''add_option(OPTION)'''&lt;br /&gt;
** OPTION is one of the menu options in [https://github.com/gramps-project/gramps/tree/master/gramps/gen/plug/menu gramps/gen/plug/menu] eg:&lt;br /&gt;
*** NumberOption&lt;br /&gt;
*** EnumeratedListOption&lt;br /&gt;
*** StringOption&lt;br /&gt;
*** ColorOption&lt;br /&gt;
*** TextOption &lt;br /&gt;
*** BooleanOption&lt;br /&gt;
*** FilterOption&lt;br /&gt;
*** PersonOption&lt;br /&gt;
*** FamilyOption&lt;br /&gt;
*** NoteOption&lt;br /&gt;
*** MediaOption&lt;br /&gt;
*** PersonListOption&lt;br /&gt;
*** PlaceListOption&lt;br /&gt;
*** SurnameColorOption&lt;br /&gt;
*** DestinationOption&lt;br /&gt;
*** StyleOption&lt;br /&gt;
*** BooleanListOption&lt;br /&gt;
* '''build_options()'''&lt;br /&gt;
* '''save_options()'''&lt;br /&gt;
* '''get_option_widget(TEXT)'''&lt;br /&gt;
* '''get_option(TEXT)'''&lt;br /&gt;
&lt;br /&gt;
== Predefined Properties ==&lt;br /&gt;
&lt;br /&gt;
There are a number of preset properties:&lt;br /&gt;
&lt;br /&gt;
* dbstate&lt;br /&gt;
** dbstate.db&lt;br /&gt;
*** dbstate.db.connect(SIGNAL, METHOD)&lt;br /&gt;
*** dbstate.db.get_person_from_handle(HANDLE)&lt;br /&gt;
*** dbstate.get_active_person()&lt;br /&gt;
* uistate&lt;br /&gt;
&lt;br /&gt;
== Persistence ==&lt;br /&gt;
&lt;br /&gt;
* gui&lt;br /&gt;
** gui.data&lt;br /&gt;
* '''on_load()'''&lt;br /&gt;
* '''on_save()'''&lt;br /&gt;
* '''save_text_to_data()'''&lt;br /&gt;
* '''load_data_to_text()'''&lt;br /&gt;
&lt;br /&gt;
== Advanced Settings ==&lt;br /&gt;
&lt;br /&gt;
* '''force_update''': set True to have the gramplet update, even when minimized&lt;br /&gt;
&lt;br /&gt;
Calling the update() method of a gramplet causes its main() method to be called repeatedly in the background until it returns False.&lt;br /&gt;
&lt;br /&gt;
Most gramplets will contain a main() method that runs quickly and always returns False.&lt;br /&gt;
&lt;br /&gt;
Gramplets that have more intensive processing will use the main() method as a generator which will be run multiple times in the background. It will return True until it has finished processing then it will return False.&lt;br /&gt;
&lt;br /&gt;
This background task can be controlled with the pause() and resume() methods. Additionally there is an interrupt() method which will cancel execution of the background task, and update_all() which will run the entire task in the foreground immediately.&lt;br /&gt;
&lt;br /&gt;
A background task will continue to run '''even if the gramplet is no longer active'''.&lt;br /&gt;
&lt;br /&gt;
Gramplets that should be updated in response to changes in the database should connect to the appropriate signals.&lt;br /&gt;
&lt;br /&gt;
Gramplets such as a news gramplet could be updated by adding a refresh button or running the update() method at regular intervals.&lt;br /&gt;
&lt;br /&gt;
== Learning More ==&lt;br /&gt;
&lt;br /&gt;
To learn more about writing a Gramplet, it is suggested to look at the existing Gramplets. You can see a complete list of the Gramplet source code here:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gramps-project/gramps/tree/master/gramps/plugins/gramplet Gramps Master (development fork) Gramplets]&lt;br /&gt;
* '''[https://github.com/gramps-project/gramps/tree/maintenance/gramps52/gramps/plugins/gramplet Gramps 5.2 Gramplets]'''&lt;br /&gt;
* [https://github.com/gramps-project/gramps/tree/maintenance/gramps51/gramps/plugins/gramplet Gramps 5.1 Gramplets]&lt;br /&gt;
* [https://github.com/gramps-project/gramps/tree/maintenance/gramps50/gramps/plugins/gramplet Gramps 5.0 Gramplets]&lt;br /&gt;
* [https://github.com/gramps-project/gramps/tree/maintenance/gramps42/gramps/plugins/gramplet Gramps 4.2 Gramplets]&lt;br /&gt;
* [https://github.com/gramps-project/gramps/tree/maintenance/gramps34/src/plugins Gramps 3.4 Gramplets]&lt;br /&gt;
&lt;br /&gt;
Click on a filename, to view the source code of that Gramplet.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_gramplet.py master/gramps/gen/plug/_gramplet.py] - Base class for non-graphical gramplet code.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [https://www.gramps-project.org/docs/gen/gen_utils.html?module-gramps.gen.utils.callback#gramps.gen.utils.callman.CallbackManager CallbackManager] - a key tool that enables event handling and function execution based on specific triggers or events of a tree database. &lt;br /&gt;
* [https://www.gramps-project.org/docs/gen/gen_utils.html?highlight=signals#module-gramps.gen.utils.callback Callback] in &amp;lt;code&amp;gt;signals#module-gramps.gen.utils&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Addons development]] - for Gramps 4.2 and later&lt;br /&gt;
** [[Addons development old]] - for Gramps 3.2 to 4.1&lt;br /&gt;
* [[Writing a plugin]] - for Gramps version 3.2 and earlier&lt;br /&gt;
* Discourse support forum : [https://gramps.discourse.group/t/how-can-i-make-a-gpr-py-registration-that-is-compatible-with-4-x-and-5-2/5290 How can I make a .gpr.py registration that is compatible with 4.x and 5,2]&lt;br /&gt;
&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category: Plugins]]&lt;br /&gt;
[[Category:Gramplets]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Category:GEPS&amp;diff=104825</id>
		<title>Category:GEPS</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Category:GEPS&amp;diff=104825"/>
		<updated>2024-08-15T22:02:21Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: GEPs should not have an apostrophe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''G'''ramps '''E'''nhancement '''P'''roposal'''s''' (GEPS). This should be a complex/detailed description of a way to make Gramps better.&lt;br /&gt;
&lt;br /&gt;
:Here they are listed in numerical order:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
  |+ Gramps Enhancement Proposals (GEPS) - Summary&lt;br /&gt;
|-&lt;br /&gt;
! GEPS - Title&lt;br /&gt;
! Proposed&lt;br /&gt;
! Status&lt;br /&gt;
! Released&lt;br /&gt;
! Note&lt;br /&gt;
! Revision Control&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 001: Relationship type event link]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 002: RelationView Expand and Collapse]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 003: Computed Ages and Probably Alive]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 004: My Gramps and Gadgets]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Called &amp;quot;[[Gramplets|Gramplets View]]&amp;quot;&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 005: Enhanced Plugin Interface]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;See [[GEPS 014: Plugin registration and management]]&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 006: Better Place handling]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.2&amp;lt;br /&amp;gt;Gramps 3.3&amp;lt;br /&amp;gt;Gramps 4.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Place tree view.&amp;lt;br /&amp;gt;Locality field added to location.&amp;lt;br /&amp;gt;Hierarchical place structure.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 007: Report Reorganization]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2007&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 008: File Organization]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2008&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 4.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 009: Import Export Merge]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2008&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 010: Relational Backend]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Withdrawn'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Related to [[GEPS 013: Gramps Webapp]], [[GEPS 032: Database Backend API]]&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 011: Tagging]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2008&amp;lt;br /&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.3&amp;lt;br /&amp;gt;Gramps 4.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Tagging of people, families, media and notes only.&amp;lt;br /&amp;gt;Tagging extended to all primary objects.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 012: Ecosystem definition]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 013: Gramps Webapp]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;See prototype [http://gramps-connect.org/ gramps-connect.org]&amp;lt;br&amp;gt;You can log into the site, as a:&amp;lt;br&amp;gt;superuser (id=admin, password=gramps)&amp;lt;br&amp;gt;or a regular user (id=admin1, password=gramps)&amp;lt;br&amp;gt;or just view as an anonymous user.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;Current code is now in [https://github.com/gramps-project/gramps/tree/master/gramps/webapp master]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 014: Plugin registration and management]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.2.x&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 015: Repository Research Support]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 016: Enhancing Gramps Processing Speed]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 017: Flexible gen.lib Interface]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2009&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Withdrawn'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;After building a prototype, it was found to be too slow for general use. Instead, caching BSDDB serialized data seems an easier approach.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 018: Evidence style sources]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;[https://github.com/gramps-project/gramps/tree/geps/gep-018-evidence-style GIT]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 019: Improved Sidebar and Split Views]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.3&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 020: Plugin Extensions]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 021: Additional Name Fields]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.3&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;[https://github.com/gramps-project/gramps/tree/geps/gep-021-name/ GIT]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 022: Narrative Website Refactor]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 023: Storing data from large sources]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.4&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;Code merged into trunk [http://gramps.1791082.n4.nabble.com/GEPS023-merged-into-trunk-td4157519.html] &amp;lt;!--[https://github.com/gramps-project/gramps/tree/geps/gep-023-large-sources GIT] --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 024: Natural transcription of Records]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2010&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;?&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 025: Geography]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2011&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 3.3&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;-&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;[http://svn.code.sf.net/p/gramps/code/branches/geps/gep-025-name/ SVN]?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 026: Replace 'make' for Gramps build]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 4.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Move Gramps away from using Makefiles and to using setup.py and/or DistUtils[http://sourceforge.net/mailarchive/message.php?msg_id=28984484][http://sourceforge.net/mailarchive/message.php?msg_id=28969888][http://sourceforge.net/mailarchive/message.php?msg_id=27984817]{{bug|2621}}&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;[http://svn.code.sf.net/p/gramps/code/branches/geps/gep-026-replace-make/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 027: Gender as an Entry Field]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt; Proposal to make gender selection be decided in an ComboBoxEntry field, to allow for options outside of male, female or unknown&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 028: Media Management]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt; Proposal to make Gramps do more to help media management&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 029: GTK3-GObject introspection Conversion]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;4.0.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Conversion to the new version of GTK using the new python bindings based on introspection.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;[http://svn.code.sf.net/p/gramps/code/branches/geps/gep-029-gtk3/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 030: New Visualization Techniques]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In Progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;'''Fan chart'''(Gramps 4.0)&amp;lt;br&amp;gt;'''Descendant Fan View'''(Gramps 4.0)&amp;lt;br&amp;gt;'''2-Way Fan View''' (Gramps 5.0)&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Discussion of new visualization techniques for possible inclusion in Gramps. &lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 031: Python 3 support]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2012&amp;lt;br&amp;gt;2015&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&amp;lt;br&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;4.0.0&amp;lt;br&amp;gt;4.2.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Added support for Python 3.&amp;lt;br&amp;gt;Moved to Python 3 only (Python 2 support dropped)&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 032: Database Backend API]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2013&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 5.0&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Plug-in replacements for BSDDB. This allows the use of other databases as a backend.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 033: Abstract Database API]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2014&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In Progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Working on for Gramps 4.1&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;http://sourceforge.net/u/nick-h/gramps/ci/master/tree/&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 034: Improve usability]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2014&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;This GEPS is about changes that would significantly improve the user friendliness of Gramps.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 035: Attach family events to individuals]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2014&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 036: Extended Alternative Place Name Handling]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2015&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 4.2&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Citations not added to place names.&lt;br /&gt;
| &amp;lt;!-- SVN          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 037: Support GEDCOM X]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2015&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;GEDCOM X is a set of open specifications for exchanging the genealogical data essential to the genealogical research process.&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 038: Enhanced Transaction Log]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2015&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Exploration of enhancing a persistent transaction log.&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 039: Genealogical symbols in gramps]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2015&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 5.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Exploration of the possibility to use genealogical symbols in gramps (gui, reports, ...)&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;[https://github.com/gramps-project/gramps/tree/geps/gep-039-genealogical-symbols GIT]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 040: Persona Support]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2016&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Exploration of supporting the persona concept in Gramps&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 041: New Selector]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2016&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Exploring and reviewing current base selector&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 042: Multi-user record locking and editing]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2016&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;Explore ability to lock rows, and separate views from editors&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 043: Improving GEDCOM support for Places]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2017&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In Progress''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Working on for Gramps 5.2.0 (master branch)&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 044: Replace Deprecated Gtk.UIManager]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2018&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;'''Finished'''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Gramps 5.1&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;[[GEPS 045: Place Model Enhancements]]&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;2019&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;''In discussion''&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;Working on for Gramps 5.2.0 (master branch)&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;!-- GEPS - Title --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Proposed     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Status       --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Released     --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- Note         --&amp;gt;&lt;br /&gt;
| &amp;lt;!-- GIT          --&amp;gt;&lt;br /&gt;
|-|}&lt;br /&gt;
&lt;br /&gt;
==Disruptive GEPs==&lt;br /&gt;
&lt;br /&gt;
If a GEP is disruptive, a specific branch is used to develop it. See the ''Brief introduction to Git'' for detailed instructions on [[Brief_introduction_to_Git#Creating_a_branch|creating a branch]].&lt;br /&gt;
&lt;br /&gt;
==Reference==&lt;br /&gt;
*[http://sourceforge.net/p/gramps/mailman/message/12554507/ GEPs: Gramps Enhancement Proposals], Jan 19, 2007, By Douglas S. Blank (Original discussion to form GEPs based on an &amp;quot;idea stolen and adapted from Python&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Roadmap]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:NoteCleanupTool&amp;diff=104726</id>
		<title>Addon:NoteCleanupTool</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:NoteCleanupTool&amp;diff=104726"/>
		<updated>2024-07-28T18:06:25Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
&lt;br /&gt;
[[File:Note_Cleanup_Tool.png|thumb|right|450px|Note Cleanup Tool - example window]]&lt;br /&gt;
&lt;br /&gt;
==What is it For?==&lt;br /&gt;
&lt;br /&gt;
The '''Note Cleanup Tool''' searches your database for notes that contain &amp;quot;HTML tags&amp;quot; and cleans it up.  &amp;quot;HTML tags&amp;quot; have meaning to web browsers and other applications, but look like garbage to most people.  &lt;br /&gt;
&lt;br /&gt;
The cleanup consists of converting the &amp;quot;HTML tags&amp;quot; to what the Gramps folks call &amp;quot;Styled text&amp;quot; which displays nicely within Gramps and in the various reports that Gramps can generate.&lt;br /&gt;
&lt;br /&gt;
The tool also searches for &amp;quot;links&amp;quot; to web sites and sets them to &amp;quot;Styled Text Links&amp;quot;, so that they work properly in reports such as the Gramps ''Narrative Web Site''.&lt;br /&gt;
&lt;br /&gt;
'''Examples of notes that needs cleaning'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;amp;amp;lt;i&amp;amp;amp;gt;Selected U.S. Naturalization Records&amp;amp;amp;lt;/i&amp;amp;amp;gt;. &lt;br /&gt;
 Washington D.C.: National Archives and Records Administration. &lt;br /&gt;
 &amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;lt;a href=&amp;amp;amp;quot;/search/dbextra.aspx?dbid=1629&amp;amp;amp;quot;&amp;amp;amp;gt;&lt;br /&gt;
 View Full Source Citations&amp;amp;amp;lt;/a&amp;amp;amp;gt;.&amp;amp;amp;lt;/p&amp;amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
 United States of America, Bureau of the Census. &amp;lt;i&amp;gt;Fifteenth Census of the United States, 1930&amp;lt;/i&amp;gt;. &lt;br /&gt;
 Washington, D.C.: National Archives and Records Administration, 1930. T626, 2,667 rolls.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first note contains some text with ''italics'' as well as a link to a web site.  The cleaned note is shown in the lower right pane of the image on the cleanup tool above.&lt;br /&gt;
The second dirty note is much simpler, it only contains a bit of ''italics'' text; the tool will remove the &amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; and &amp;lt;/i&amp;gt;&amp;lt;/nowiki&amp;gt; and convert the text in between to ''italics''.&lt;br /&gt;
&lt;br /&gt;
===Where do the &amp;quot;dirty&amp;quot; notes come from?===&lt;br /&gt;
&lt;br /&gt;
The author of this plugin has a lot of data that was imported from http://ancestry.com via GEDCOM.  It seems that the ancestry.com software doesn't always do a great job of converting their web pages to notes for GEDCOM export.&lt;br /&gt;
The popular '''Family Tree Maker''' software, in conjunction with ancestry.com also seems to have a lot of these &amp;quot;dirty&amp;quot; notes in their GEDCOM exports.&lt;br /&gt;
There are probably other ways that dirty notes get into our data, but this tool can help clean it up.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
* Once this plugin has been installed &lt;br /&gt;
* Select Menu {{man menu|Tools -&amp;gt; Utilities -&amp;gt; Note Cleanup...}}&lt;br /&gt;
&lt;br /&gt;
{{man warn|Warning|Proceeding with this tool may make unexpected changes to your data.  While it is possible to '''Undo''' the changes made by this tool, it may be easier to recover from a backup.}}&lt;br /&gt;
&lt;br /&gt;
* The dialog that pops up when you start the tool provides a warning and a short review of the tool usage.  Clicking {{man button|Close}} will dismiss the dialog but does nothing else.&lt;br /&gt;
* At this point the tool window with three main panes and some buttons should be visible.&lt;br /&gt;
* If you want to perform a quick test to see what this tool does, you can press the {{man button|Generate Test Notes}} button.  ''This is best performed on a test database, since it actually adds some test notes to the active database.''&lt;br /&gt;
* Otherwise you can perform a scan of your data by pressing the {{man button|Search}} button.  This does not make '''any''' changes to your data, only performs the search and fills the panes if any dirty notes are found.&lt;br /&gt;
** The left pane will contain lists of the results of the search.  If nothing appears here, then none of your data is dirty, or any dirty notes already have been edited and styled.  There may be up to three lists in the left pane.  A list will only be present if there are notes found in that category.&lt;br /&gt;
*** The '''Cleaned Notes''' list contains notes that have been edited in some way, and may have ''styles'' applied.  This includes converting any web links to a ''styled'' link.&lt;br /&gt;
*** The '''Links Only''' list contains notes that have not been edited (no textual changes at all) but have had links converted to ''styled''.&lt;br /&gt;
*** The '''Issues''' list contains notes that ''may'' have been edited in some way, but contain ''HTML tags'' that the tool does not recognize.&lt;br /&gt;
** The top right pane will show the original unedited text of a note that is selected in the left pane.  This cannot be changed.&lt;br /&gt;
** The lower right pane will show the proposed changes to the note.  If the user wants to make additional changes, they can be made directly in the pane.  The editing toolbar directly above the lower left pane can be used to make or correct style changes as well.  This toolbar is an abbreviated version of the normal Gramps Note editor toolbar and each icon works the same.  Any changes made here are preserved within the tool, but will not affect your data until the {{man button|Save All}} button is pressed (see next below).&lt;br /&gt;
* When you have reviewed all the changes made, either by the tool, or manually, you can save your work using the {{man button|Save All}} button.  Your data is '''not''' changed until you press this button, but when you do, all the changes are committed to your database.&lt;br /&gt;
* If you do not want any changes to be made to your data, or you are done with the tool, you can simply press the {{man button|Close}} button.&lt;br /&gt;
* If you want a record of notes that have been found in the search, you can use the {{man button|Export}} button to save a listing to a text file.&lt;br /&gt;
&lt;br /&gt;
==Some Notes==&lt;br /&gt;
&lt;br /&gt;
* If any '''Issues''' are found, the unrecognized &amp;quot;HTML tag&amp;quot; ''will'' be marked up with a {{man menu|yellow highlight}}.  The user may want to manually edit each of these in some way.  When done, the highlight can be removed by selecting the highlighted region and pressing the &amp;quot;Clear Markup&amp;quot; toolbar button (last button on the right).&lt;br /&gt;
* Pressing the {{man button|Search}} button at any time will scan your data again, discarding any proposed automatic or manual changes and producing new lists.&lt;br /&gt;
* Double Clicking on a note in a left pane list will bring up the standard Gramps Note Editor.  Any changes in that editor followed by pressing the {{man button|OK}} button '''will''' update your database immediately.  However, if you later press the {{man button|Save All}} button in the still open Note Cleanup Tool, that data will be overwritten by the Note Cleanup Tool.&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
* {{bug|12880}} NoteCleanup addon causes error with links in Complete Individual Report when opening ODT file in Libre Office&lt;br /&gt;
&lt;br /&gt;
* All Notes-related issues [https://gramps-project.org/bugs/search.php?project_id=8&amp;amp;sticky=on&amp;amp;sort=last_updated&amp;amp;dir=DESC&amp;amp;hide_status=90&amp;amp;tag_string=notes&amp;amp;match_type=0 tagged notes] on the Gramps Bug Tracker.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:GenealogyTree&amp;diff=104474</id>
		<title>Addon:GenealogyTree</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:GenealogyTree&amp;diff=104474"/>
		<updated>2024-07-12T15:21:04Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Fix typo in package name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
[[File:Menu-trees-gramps50.png|450px|right|thumb|Main menu showing all four reports for Addon:GenealogyTree]]&lt;br /&gt;
The '''GenealogyTree''' addon creates professional looking trees for the active person in the [[Addon:GenealogyTree#Prerequisites|LaTeX genealogytree (the Pedigree and genealogical tree diagrams package)]] file format. The following reports are available:&lt;br /&gt;
* {{man label|[[Addon:GenealogyTree#Ancestor_tree|Ancestor Tree]]}}&lt;br /&gt;
* {{man label|[[Addon:GenealogyTree#Descendant_tree|Descendant Tree]]}}&lt;br /&gt;
* {{man label|[[Addon:GenealogyTree#Grandparent_tree|Grandparent Tree]]}}&lt;br /&gt;
* {{man label|[[Addon:GenealogyTree#Sandclock_tree|Sandclock Tree]]}}&lt;br /&gt;
* {{man label|[[Addon:GenealogyTree#Sandclock Tree for a Family|Sandclock Tree for a Family]]}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
From the menu select {{man menu|Reports &amp;gt; Trees &amp;gt; [Xxxxx] Tree...}} where [Xxxxx] is one of the available reports.&lt;br /&gt;
&lt;br /&gt;
{{man tip|For a large family tree|Make sure to select a large enough paper size in the {{man label|Paper Options}} tab as the reports [[Addon:GenealogyTree#Issues|currently]] do not scale well.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Output is to {{man label|[https://www.latex-project.org/ LaTeX File]}}(&amp;lt;code&amp;gt;*.tex&amp;lt;/code&amp;gt;) by default.  This format is generally intended for print production and may not be suitable for ''viewing'' the resulting tree chart.  Installing an [[Addon:GenealogyTree#Prerequisites|additional program]] to automatically convert to a &amp;lt;code&amp;gt;.pdf&amp;lt;/code&amp;gt; format file is highly recommended.&lt;br /&gt;
&lt;br /&gt;
See [[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_4#Common_options|Common options]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Legend to Symbols===&lt;br /&gt;
##found on page 230 of GenealogyTree documentation pdf##&lt;br /&gt;
Legend to symbols used on chart.&lt;br /&gt;
&lt;br /&gt;
* = born, (*) born out of wedlock, +* = stillborn, *+ = died on the birthday, &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tree examples ==&lt;br /&gt;
Example output for each tree report.&lt;br /&gt;
{{-}}&lt;br /&gt;
===Ancestor tree===&lt;br /&gt;
[[File:GenealogyTree-Addon-AncestorTree-example-50.png|450px|right|thumb|Ancestor tree - example for Addon:GenealogyTree]]&lt;br /&gt;
&lt;br /&gt;
Creates a tree chart showing the ancestors of the active person.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===Descendant tree===&lt;br /&gt;
[[File:GenealogyTree-Addon-descendant-example-50.png|450px|right|thumb|Descendant tree - example for Addon:GenealogyTree]]&lt;br /&gt;
&lt;br /&gt;
Creates a tree chart showing the descendants of the active person.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===Grandparent tree===&lt;br /&gt;
[[File:GenealogyTree-grandparent-example-50.png|450px|right|thumb|Grandparent tree - example for Addon:GenealogyTree]]&lt;br /&gt;
Creates a Grandparent tree for the selected person.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===Sandclock tree===&lt;br /&gt;
[[File:GenealogyTree-Addon-sandclock-example-51.png|450px|right|thumb|Sandclock tree - example for Addon:GenealogyTree]]&lt;br /&gt;
Creates a Sandclock tree for the selected person.&lt;br /&gt;
&lt;br /&gt;
A sandclock connects ancestors and descendants starting from a single proband (active person).&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===Sandclock Tree for a Family===&lt;br /&gt;
[[File:GenealogyTree-Addon-sandclock_family-example-51.png|450px|right|thumb|Sandclock Tree for a Family - example for Addon:GenealogyTree]]&lt;br /&gt;
Creates a Sandclock tree for the selected family.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Output is only to {{man label|[[Output_formats#LaTeX|LaTex]] File}} (&amp;lt;code&amp;gt;*.tex&amp;lt;/code&amp;gt;) which by default is displayed as plain text with layout annotation in the preferred Text viewing application for your OS unless you have installed a LaTex helper application.  The following prerequisite &amp;quot;helper&amp;quot; applications will interpret the layout annotation to view the fully formatted LaTex(*.tex) file or automatically convert it to a &amp;lt;code&amp;gt;pdf&amp;lt;/code&amp;gt; file:&lt;br /&gt;
* [https://www.tug.org/texlive/ texlive] including the &amp;lt;code&amp;gt;textlive-pictures&amp;lt;/code&amp;gt; package which contains [https://ctan.org/pkg/genealogytree LaTeX genealogytree] (the Pedigree and genealogical tree diagrams package)&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;texlive-pictures&amp;lt;/code&amp;gt; package contains &amp;lt;code&amp;gt;genealogytree&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;texlive-fonts-extra&amp;lt;/code&amp;gt; package is required for non-latin fonts.&lt;br /&gt;
&lt;br /&gt;
See specific instructions for your operating system.&lt;br /&gt;
* [[Addon:GenealogyTree#Linux|Linux]]&lt;br /&gt;
* [[Addon:GenealogyTree#Apple MacOS|Apple MacOS]]&lt;br /&gt;
* [[Addon:GenealogyTree#Microsoft Windows|Microsoft Windows]]&lt;br /&gt;
&lt;br /&gt;
===Linux===&lt;br /&gt;
&lt;br /&gt;
====Debian/Ubuntu====&lt;br /&gt;
&lt;br /&gt;
* TeX support, at least  'texlive-base', 'texlive-binaries', 'tex-common', 'luatex' packages&lt;br /&gt;
* for internal PDF output file format needs LaTex support (e.g., 'texlive-latex-base' package)&lt;br /&gt;
* for genealogytree needs 'texlive-pictures' package &lt;br /&gt;
or download and install '[https://www.ctan.org/pkg/genealogytree genealogytree]' for the last version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ mkdir -p ~/texmf/tex/latex/genealogytree&amp;lt;/code&amp;gt;&lt;br /&gt;
or ''/var/lib/texmf'', ''/usr/local/share/texmf''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ cp ./genealogytree/* ~/texmf/tex/latex/genealogytree&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ texhash ~/texmf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Same for '[https://www.ctan.org/pkg/tcolorbox tcolorbox]', and maybe&lt;br /&gt;
for fonts : '[https://www.ctan.org/pkg/libertine libertines]', '[https://www.ctan.org/pkg/mweights mweights], etc ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ cp ~/texmf/tex/latex/libertine/map/libertine.map ~/.texmf-var/fonts/map/pdftex/updmap/pdftex.map&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ updmap --enable Map=~/texmf/tex/latex/libertine/map/libertine.map&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ sudo mktexlsr&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ sudo updmap-sys --enable Map=~/texmf/tex/latex/libertine/map/libertine.map&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* need 'texlive-latex-extra' (for xkeyval) and 'latex-tools' (for [https://github.com/T-F-S/csvsimple/issues/1 shellesc]) or install the base [http://mirrors.ctan.org/macros/latex/base.zip]!&lt;br /&gt;
* can also update '[https://www.ctan.org/pkg/pdftexcmds pdftexcmds]' and '[https://www.ctan.org/pkg/pgf pgf]'&lt;br /&gt;
&lt;br /&gt;
{{stub}}&lt;br /&gt;
&lt;br /&gt;
===Apple MacOS===&lt;br /&gt;
Install the MacTeX distribution. &lt;br /&gt;
* https://www.tug.org/mactex/&lt;br /&gt;
{{stub}}&lt;br /&gt;
&lt;br /&gt;
===Microsoft Windows===&lt;br /&gt;
&lt;br /&gt;
You can enable automatic output to PDF on Microsoft Windows as by default these reports only output to the LaTeX(&amp;quot;.tex&amp;quot; extension) file type which are not suitable for viewing.&lt;br /&gt;
&lt;br /&gt;
For our Microsoft Windows TeX/LaTeX environment you will use [https://miktex.org/ MiKTeX] we only need to download the basic installer from:&lt;br /&gt;
* https://miktex.org/download/&lt;br /&gt;
&lt;br /&gt;
Start the MiKTeX installer and during install:&lt;br /&gt;
* select {{man label|[ ]Install MiKTeX only for me(YOURUSERNAME)}} &lt;br /&gt;
* and change {{man label|Install missing packages on-the-fly}} to ''Yes''&lt;br /&gt;
after successful installation of MiKTeX do the following once only:&lt;br /&gt;
&lt;br /&gt;
Start the [https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/ Microsoft Windows command console prompt] (cmd.exe) and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;lualatex --version&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If that works then you are ready to have MiKTex install the additional missing packages, start Gramps and create a one of the {{man menu|Reports &amp;gt; Trees &amp;gt; [Xxxxx] Tree...}} reports and for the LaTeX(&amp;quot;.tex&amp;quot; extension). Now in the Microsoft Windows command console prompt (cmd.exe) type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;lualatex FILENAME&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where FILENAME is full pathname of &amp;lt;code&amp;gt;.tex&amp;lt;/code&amp;gt; file you previously create in Gramps. The MiKTeX package manager will then automatically download the missing  packages. When all is finished pdf file will be created in directory in which you start this command, along with two other files of the same name but with different extensions (*.log) and (*.aux) which you can ignore.&lt;br /&gt;
&lt;br /&gt;
If everything goes well you will now have an additional {{man label|Output format:}} option in Gramps to output the reports to the PDF(&amp;quot;.pdf&amp;quot; extension) format and the builtin LaTex(*.tex) format.&lt;br /&gt;
&lt;br /&gt;
The last optional step is from the Windows StartMenu run the {{man label|MiKTeX Console}} and in {{man label|Settings}} change {{man label|[ ]Always install missing packages on-the-fly}} settings to {{man label|[ ]Ask me}}(recommended) or {{man label|[ ]Never install missing packages on-the-fly}}.&lt;br /&gt;
&lt;br /&gt;
{{man tip|PDF's created automatically with lualatex|are output to the PDF Version 1.5 (Acrobat 6.0)format which has a maximum PDF page size of 200&amp;quot; x 200&amp;quot; inches (508cm x 508cm) so choose your custom paper sizes accordingly or Gramps will show the {{man label|[[Gramps_{{man version}}_Wiki_Manual_-_Error_and_Warning_Reference#Report_could_not_be_created|Report could not be created]]}} dialog}}&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* Feature request {{bug|10223}} LaTeX genealogytree reports&lt;br /&gt;
* https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/docgen/treedoc.py  (creates the *.tex file and checks for the presence of lualatex.exe on Windows or lualatex on Linux )&lt;br /&gt;
*[https://sourceforge.net/p/gramps/mailman/message/36223716/ Original instructions for installing PDF output support for Microsoft Windows]&lt;br /&gt;
* [https://ctan.org/pkg/genealogytree LaTeX genealogytree] (the Pedigree and genealogical tree diagrams package) - By Prof. Dr. Dr. Thomas F. Sturm, [http://mirrors.ctan.org/macros/latex/contrib/genealogytree/genealogytree.pdf documentation] &amp;amp; examples ([https://github.com/T-F-S/genealogytree github])- CTAN(Comprehensive TeX Archive Network) -  Pedigree and genealogical tree diagrams are proven tools to visualize genetic and relational connections between individuals. The naming (“tree”) derives from historical family diagrams. However, even the smallest family entity consisting of two parents and several children is hardly a ‘mathematical’ tree — it is a more general graph. The package provides a set of tools to typeset genealogical trees (i.e., to typeset a set of special graphs for the description of family-like structures). The package uses an autolayout algorithm which can be customized, e.g., to prioritize certain paths.&lt;br /&gt;
* Questions tagged [https://tex.stackexchange.com/questions/tagged/genealogytree genealogytree] on tex.stackexchange.com&lt;br /&gt;
&lt;br /&gt;
'''Discussions on Gramps community support forum (Discourse)'''&lt;br /&gt;
* [https://gramps.discourse.group/t/recurring-people-not-visible-on-exported-descendant-graph/4328/5 rendering of cousins marrying] and [[Addon:Family_Tree|Family Tree]] addon report as an alternative.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
See issues tagged with [https://gramps-project.org/bugs/tag_view_page.php?tag_id=294 GenealogyTree] on the bugtracker.&lt;br /&gt;
* The diagram doesn't scale to fit the page. For a large tree you will have to select a large paper size.&lt;br /&gt;
** Only the smallest value on Paper size item will be used &lt;br /&gt;
** {{bug|10512}}Sandclock tree generates one page of (possibly) a larger report&lt;br /&gt;
* {{bug|10494}} LaTeX report includes full images uncropped&lt;br /&gt;
* Help button url does not come here.&lt;br /&gt;
* No support for localized month names&lt;br /&gt;
* If you install only one of the reports the rest are installed also!&lt;br /&gt;
&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=104329</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=104329"/>
		<updated>2024-06-28T14:09:51Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Author and maintainer attributes in plugin registration files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- sync with https://gramps-project.org/wiki/index.php?title=Addon_list_legend&amp;amp;action=edit&amp;amp;section=2 --&amp;gt; &lt;br /&gt;
* '''Importer''' (IMPORT) - adds additional file format import options to Gramps&lt;br /&gt;
* '''Exporter''' (EXPORT) - adds additional file format export options to Gramps&lt;br /&gt;
* '''[[Gramps_Glossary#gramplet|Gramplet]]''' (GRAMPLET) - adds a new interactive interface section to a Gramps view mode, which can be activated by right-clicking on the dashboard View or from the menu of the Sidebar/Bottombar in the other view categories. &lt;br /&gt;
* '''Gramps [[Gramps_Glossary#viewmode|View ''(mode)'']]''' (VIEW) - adds a new view mode to the list of views available within a [[Gramps_Glossary#view|View Category]]&lt;br /&gt;
* '''[[Map_Services|Map Service]]''' (MAPSERVICE) - adds new mapping options to Gramps&lt;br /&gt;
* '''Plugin lib''' (GENERAL) - libraries that are present giving extra functionality. Can add, replace and or modifies built-in Gramps options.&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_8#Quick_Views|Quickreport'''/'''Quickview]]''' (QUICKREPORT) - a view that you can run by right-clicking on object, or if a person quickview, then through the Quick View Gramplet&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_1|Report]]''' (REPORT) - adds a new output report / includes '''Website''' - output a static genealogy website based on your Gramps Family Tree data.&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Filters#Add_Rule_dialog|Rule]]''' (RULE) - adds new [[Gramps_Glossary#filter|filter]] rules. {{new|5.1}}&lt;br /&gt;
* '''[[Gramps_{{man version}}_Wiki_Manual_-_Tools|Tool]]''' (TOOL) - adds a utility that helps process data from your family tree.&lt;br /&gt;
* '''Doc creator''' (DOCGEN)&lt;br /&gt;
* '''Relationships''' (RECALC)&lt;br /&gt;
* '''Sidebar''' (SIDEBAR)&lt;br /&gt;
* '''[[Database_Backends|Database]]''' (DATABASE) - add support for another database backend. {{new|5.0}}&lt;br /&gt;
* '''Thumbnailer''' (THUMBNAILER) {{new|5.2}}&lt;br /&gt;
* '''Citation formatter''' (CITE) {{new|5.2}}&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_the_addon|Announce it on the Gramps Forum]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the maintenance/gramps52 git branch, as the default is master branch for the developmental pre-release. (Currently gramps 5.3, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure, with the code for each addon in its own folder:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons addons] git repository holds built versions of the addons for each release of Gramps, and has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps42 /gramps42]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps50 /gramps50]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps51 /gramps51]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** [https://github.com/gramps-project/addons/tree/master/gramps52 /gramps52]&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also [https://help.github.com/articles/generating-an-ssh-key/  Connecting to GitHub with SSH] will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that all three git repositories local locations are put into the same base directory and named with the repository names in order for the make.py script commands to work as shown. From the base directory, run the following commands to create a copy of each repository. If you want to use SSH;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you want to use a web url:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone https://github.com/gramps-project/addons.git addons&lt;br /&gt;
 git clone https://github.com/gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps52 maintenance branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps52 origin/maintenance/gramps52&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps53 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other prerequisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps52&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' built-in configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps52 build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps52 compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;5.2&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] is TOOL, GRAMPLET, REPORT, QUICKVIEW, IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, or RELCALC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and addon '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Be sure to include attributes for author name(s) and email(s) in the form of an array of comma-separated strings. There is an additional set of attributes, '''maintainers''' and '''maintainers_email'''. If you, the author, are also the maintainer it will be identical to the author attributes, but you may also designate a maintainer, in which case the maintainer will become the primary point of contact.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '5.2',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         maintainers = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         maintainers_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation in the [https://github.com/gramps-project/gramps/blob/3f0db9303f29811b43325c30149c8844c7ce24b6/gramps/gen/plug/_pluginreg.py#L23 master/gramps/gen/plug/_pluginreg.py] comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are ([https://github.com/gramps-project/gramps/blob/892fc270592095192947097d22a72834d5c70447/gramps/gen/plug/_pluginreg.py#L141-L149 gen/plug/_pluginreg.py]):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
CATEGORY_TREE       = 6&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ, CATEGORY_TREE]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '5.2',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.2',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.2',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List the Prerequistes your addon depends on ==&lt;br /&gt;
&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;depends_on = [&amp;quot;libwebconnect&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is a list of id's from other gpr files. This example will ensure that [[Addon:Web_Connect_Pack#Prerequisites|libwebconnect]] is loaded before your addon. If it can't be found, or you have a cycle, then your addons won't be loaded.&lt;br /&gt;
&lt;br /&gt;
example code used in the Addon:Web_Connect_Pack that references libwebconnect Prerequistes [https://github.com/gramps-project/addons-source/blob/1304b65a7d758bfe17339c26260473ac3e9c4061/RUWebConnectPack/RUWebPack.gpr.py#L17 RUWebPack.gpr.py#L17 ]&lt;br /&gt;
&lt;br /&gt;
This means that common Prerequistes can be shared between addons and that code sits in its own gpr/addon file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[] for addon prerequistes have a look at converting them to use &amp;quot;depends_on = &amp;quot;  like in the following addons&lt;br /&gt;
https://github.com/gramps-project/addons-source/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
https://github.com/gramps-project/gramps/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
&lt;br /&gt;
which can be a comma separated list for multiple dependencies/prerequisites (so that addons that share prerequisites import the same library?) (maybe move spell check into an addon etc? tip of the day... possibilities...)&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
mentioned in the following&lt;br /&gt;
https://sourceforge.net/p/gramps/mailman/message/27070037/&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
which is a list of id's from other gpr files. This example will ensure&lt;br /&gt;
that libwebconnect is loaded before your plugin. If it can't be found,&lt;br /&gt;
or you have a cycle, then your plugin won't be loaded.&lt;br /&gt;
&lt;br /&gt;
If it is a common function, perhaps libhtml is the right place to put&lt;br /&gt;
it, and you can put a depends_on on that.&lt;br /&gt;
&lt;br /&gt;
-Doug''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
example output is on terminal only:&lt;br /&gt;
&lt;br /&gt;
Cannot resolve the following plugin dependencies:&lt;br /&gt;
   Plugin 'UK Web Connect Pack' requires: ['libwebconnect']&lt;br /&gt;
&lt;br /&gt;
[](feature)  For plugins/addons if prerequisites not available display a page stating why/what is missing that includes the addon description and a url to the support page.&lt;br /&gt;
&lt;br /&gt;
[] Gramps CLI info &amp;quot;gramps -v&amp;quot; needs a section that list third-party addons with version numbers and if prerequisites have been met.&lt;br /&gt;
&lt;br /&gt;
[]update the Addon:Prerequisites Checker Gramplet to test for your Prerequisites.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your addon inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps52&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps53 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
README.md&lt;br /&gt;
extra_dir/*&lt;br /&gt;
help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps53/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps52 or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps52 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps53 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps53/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[5.2_Addons]] or if the addon is meant for a future release [[5.3_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Addon list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce the addon ==&lt;br /&gt;
Join the [[Contact#Forum|Gramps Forum]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
{{man tip|When submitting an update the patch part of the version number  MAJOR.MINOR.PATCH  is updated during the addon build process e.g. 1.1.3  to 1.1.4|You can find this step in [https://github.com/gramps-project/addons-source/blob/master/make.py#L125 addons-source/make.py].[https://gramps.discourse.group/t/should-addons-pr-include-version-number-update/2591]}}&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many Gramps developers that do support addons in various ways (translations, triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]]. &lt;br /&gt;
= Addon Development Tutorials and Samples =&lt;br /&gt;
* [[Report-writing_tutorial|Report-writing Tutorial]]&lt;br /&gt;
* [[Quick_Views|Quick Views]]&lt;br /&gt;
* [[Gramplets|Gramplets]]&lt;br /&gt;
* [[Develop_an_Add-on_Rule|Develop an Add-on Rule]]&lt;br /&gt;
* [[Develop_an_Add-on_Tool|Develop an Add-on Tool]]&lt;br /&gt;
* [[Adapt_a_built-in_Report|Adapt a built-in Report]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Developer_policies&amp;diff=104316</id>
		<title>Developer policies</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Developer_policies&amp;diff=104316"/>
		<updated>2024-06-26T20:03:53Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add note that Black formatter checks for code formatting compliance.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document collects the different policies the Gramps developer community has adopted.&lt;br /&gt;
&lt;br /&gt;
== Coding policies ==&lt;br /&gt;
=== License ===&lt;br /&gt;
Gramps is a GPLv2 licensed application with the possibility to use a later version of the GPL (GPLv3). There are no plans at the moment to move to GPLv3 and drop GPLv2. See [[Project License]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Coding style ===&lt;br /&gt;
Follow the Gramps [[Programming guidelines]] - which mostly refer to PEP8 with a few additions. Gramps CI checks PRs for compliance using the [https://github.com/psf/black Black] formatter.&lt;br /&gt;
&lt;br /&gt;
All source files shall include conforming [[Source file headers]].&lt;br /&gt;
&lt;br /&gt;
=== GUI design ===&lt;br /&gt;
User interfaces shall conform to the agreed upon [[UI style]].&lt;br /&gt;
&lt;br /&gt;
=== Acceptable changes ===&lt;br /&gt;
You should follow the [[:Category:Developers/Roadmap|roadmap]] set out for the next release. Only minor features or new reports/gramplets/... can still be added to the roadmap after it has been made official. Add your changes to the [[:Category:Developers/Roadmap|roadmap]] (on this wiki and in the bug tracker) so others are notified what you work on. Seek approval for your changes via the ''gramps-devel'' mailing list.&lt;br /&gt;
&lt;br /&gt;
== Commit policies ==&lt;br /&gt;
=== General ===&lt;br /&gt;
Read [[Committing policies]]&lt;br /&gt;
&lt;br /&gt;
=== Becoming an official developer ===&lt;br /&gt;
The road to become an official developer is as follows: &lt;br /&gt;
* Fix bugs on the bug tracker and participate in the ''gramps-devel'' mailing list. &lt;br /&gt;
* Accept the guidance from existing developers. If you do not agree with them, you need to convince them. To do that, first consider coding what is asked for and pointing out the weakness afterward, i.e. let the code speak for you.&lt;br /&gt;
* Take up a feature request after assuring yourself (e.g. via the ''gramps-devel'' mailing list) the feature will probably be accepted by the developers. Let your code be reviewed. &lt;br /&gt;
* Once you come to the conclusion your code needs little change before commit, ask the technical architect (Nick) to send you an invitation to join the GitHub ''Developers'' team. If you have not had contact with the technical architect yet, ask one of the other developers to vouch for you.&lt;br /&gt;
* Even after you obtained commit rights, consider a review of your code by other developers by submitting a pull request or using the bug tracker (send reminder) or the ''gramps-devel'' mailing list.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=104315</id>
		<title>Programming guidelines</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Programming_guidelines&amp;diff=104315"/>
		<updated>2024-06-26T20:03:16Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add note that Black formatter checks for code formatting compliance.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a multi-programmer environment, it is important to follow common coding guidelines to make sure the code remains maintainable. &lt;br /&gt;
&lt;br /&gt;
== Coding style ==&lt;br /&gt;
&lt;br /&gt;
=== PEP8 ===&lt;br /&gt;
* Write [https://www.python.org/dev/peps/pep-0008/ PEP 8] compatible code! This is important to have a consistent, readable codebase.&lt;br /&gt;
** it is not explicit in PEP8, but we like a space after a comma&lt;br /&gt;
&lt;br /&gt;
=== Tabs ===&lt;br /&gt;
* Do not use TABs. Use space characters. In Gramps we use 4 spaces for indentation. This does not mean you must set your TAB stops to 4. TABs and indents are not the same thing. Most editors have a configuration option to set indentation and TAB stops. Be careful to just set the '''indentation''' to 4, which automatically means it has to be '''spaces'''. (TABs are still necessary, in Makefiles for example, and they '''have to''' be equivalent to 8 spaces, '''always'''.) To summarize:&lt;br /&gt;
** uses spaces, no TABs&lt;br /&gt;
** indentation is 4&lt;br /&gt;
** TAB stops (if any) are at position 9,17,25,... (first column is 1)&lt;br /&gt;
&lt;br /&gt;
=== Members names ===&lt;br /&gt;
* Private class functions (functions that cannot be called outside the class) should be preceded with two underscores. &lt;br /&gt;
* Protected functions (functions that can only be called by the class or derived classes) should be preceded with one underscore.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def __private_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
 &lt;br /&gt;
def _protected_function(self):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&lt;br /&gt;
Names of callbacks should be prefixed by 'cb_'.  For example, &amp;lt;code&amp;gt;cb_my_callback&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; does not check that arguments are used when methods are named in this way.  This is useful to avoid the &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; warning:  'W0613: Unused argument &amp;lt;arg&amp;gt;'.&lt;br /&gt;
&lt;br /&gt;
=== Imports ===&lt;br /&gt;
The top module is called gramps, and it has following submodules:&lt;br /&gt;
* gen&lt;br /&gt;
* cli&lt;br /&gt;
* gui&lt;br /&gt;
* plugins&lt;br /&gt;
The other dirs should not contain code, or are for testing.&lt;br /&gt;
&lt;br /&gt;
Within a submodule, only relative imports are allowed of the own submodule (so starting with . or with a module of the own directory), and absolute imports of other submodules (so starting with &amp;lt;code&amp;gt;gramps.&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{man note|Important:|files in the gen submodule are '''not''' allowed to import files from the other submodules. So &amp;lt;code&amp;gt;gen&amp;lt;/code&amp;gt; should be self-contained.}}&lt;br /&gt;
&lt;br /&gt;
== Class headers ==&lt;br /&gt;
* Each class should have a simple header to help mark it in the file. This is not used for documentation - it is used to help find the class when multiple classes exist in the same file.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
#&lt;br /&gt;
# MyClass&lt;br /&gt;
#&lt;br /&gt;
#------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
* Python provides a docstrings to document classes and functions. If the class is a class used by others (such as the [http://www.gramps-project.org/docs/gen/gen_lib.html#module-gen.lib gen lib] classes), the docstrings should follow the restructuredtext ([http://docutils.sourceforge.net/docs/user/rst/quickstart.html#structure rst]) format. This allows us to extract [http://www.gramps-project.org/docs/ API] documentation using sphinx. &lt;br /&gt;
&lt;br /&gt;
* Apart from adding doc strings to classes and functions, also the api generating rst files must be edited so as to extract the documentation. These files are in the [https://github.com/gramps-project/gramps/tree/master/docs docs directory], for info read the [https://github.com/gramps-project/gramps/blob/master/docs/README.txt /docs/README.txt] file.&lt;br /&gt;
&lt;br /&gt;
:More info&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/markup/ Sphinx for python]&lt;br /&gt;
:* [http://www.sphinx-doc.org/en/stable/rest.html doc with sphinx]&lt;br /&gt;
&lt;br /&gt;
Classes that are not core reusable classes do not have to follow this format (although we encourage you do), but should be documented using docstrings.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    MyClass is a sample class.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    def my_function(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        The my_function task serves no purpose whatsoever.&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black ==&lt;br /&gt;
Gramps CI checks for code formatting compliance using [https://github.com/psf/black Black]. When a PR fails the check, code which requires changes is shown in the Checks tab in the Lint panel. You may update the code manually to make it pass, or integrate Black formatter with your preferred editor to ensure that the check will pass. When using Black locally, use the same version as the CI system to ensure formatting consistency.&lt;br /&gt;
&lt;br /&gt;
== Pylint ==&lt;br /&gt;
* Run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; on your code before checking in. &lt;br /&gt;
* New files shall have a Pylint score of 9 or higher. New files will not be accepted if they have a Pylint score lower than 9.&lt;br /&gt;
* Any changes to existing files with a Pylint score lower than 9 shall not reduce the Pylint score. It is expected that over time, this policy will cause all files to eventually have a score of 9 or higher.&lt;br /&gt;
&lt;br /&gt;
Note that you must run &amp;lt;code&amp;gt;pylint&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt; directory. If import errors still occur, add a PYTHONPATH. Example usage:&lt;br /&gt;
  me@laptop:~/programs/master/src$ PYTHONPATH=plugins/lib/ pylint --include-ids=y --reports=y plugins/mapservices/googlemap.py&lt;br /&gt;
Set reports to '''n''' to have less output. Information on the meaning of codes can be found here:&lt;br /&gt;
* [http://pylint-messages.wikidot.com/all-codes All codes], PyLint Messages: and what they're trying to tell you&lt;br /&gt;
&lt;br /&gt;
== Best practices ==&lt;br /&gt;
* Always develop with [[Coding_for_translation|language translation]] in mind &lt;br /&gt;
&lt;br /&gt;
* Reduce dependencies (imports) between files.&lt;br /&gt;
&lt;br /&gt;
* Think on [[Accessibility]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101371</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101371"/>
		<updated>2024-01-21T21:19:50Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Include addon version in the bug report&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://forum.gramps-project.org/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release or a problem with functionality that only exists in the master branch, then the issue should be filed under the Gramps project.&lt;br /&gt;
&lt;br /&gt;
* For bug reports and feature requests relating to Gramps Web, see [https://www.grampsweb.org/help/ | Get Help - Gramps Web]&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification. Here's a concise guide on '''[[How to create a good bug report]]''' for Gramps which will greatly increase the chances of reproducibility and thus being fixed.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's important to know which operating system and version you are reporting an issue against. This is where you provide that information. MantisBT allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**For recording issues that ''only'' apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]), use next un-released version e.g.: 5.3.0 as shown on the [https://gramps-project.org/bugs/roadmap_page.php| MantisBT Roadmap].&lt;br /&gt;
* Addon Version&lt;br /&gt;
** If you are reporting a bug in an addon, use the Plugin Manager or Enhanced Plugin Manager to find the version of the addon and include it in the report.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful MantisBT bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ MantisBT bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]]&lt;br /&gt;
&lt;br /&gt;
MantisBT.org reports providing user-oriented (''not'' admin) documentation&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=5070 0005070]: I have written [MantisBT] quick-start documentation [.doc, .pdf, .swx] if you’re interested&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=8939 0008939]: Lifecycle model [Visio] for a report in MantisBT&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Talk:Brief_introduction_to_Git&amp;diff=101360</id>
		<title>Talk:Brief introduction to Git</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Talk:Brief_introduction_to_Git&amp;diff=101360"/>
		<updated>2024-01-18T19:22:14Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: /* Anchor for Making a PR */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anchor for Making a PR ==&lt;br /&gt;
&lt;br /&gt;
@daleathan In a prior revision the anchor for Making a PR was set to&lt;br /&gt;
&lt;br /&gt;
[ [ Brief_introduction_to_Git#Making_a_Pull_Request_.28PR.29_on_Github|Making a Pull Request (PR) on Github ] ]&lt;br /&gt;
&lt;br /&gt;
Curious, is there a particular reason for setting it to &amp;quot;#Making_a_Pull_Request_.28PR.29_on_Github&amp;quot; ? Gramps' CONTRIBUTING file ( https://github.com/gramps-project/gramps/blob/892fc270592095192947097d22a72834d5c70447/CONTRIBUTING ) expects it to be:&lt;br /&gt;
&lt;br /&gt;
https://gramps-project.org/wiki/index.php?title=Brief_introduction_to_Git#Making_a_PR&lt;br /&gt;
&lt;br /&gt;
Can we revert to the previous? Is there a way to find out if there are any references to the current anchor and replace those as well?&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101186</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101186"/>
		<updated>2023-12-29T17:05:21Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Pointer to bug reporting for Gramps Web&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://forum.gramps-project.org/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release or a problem with functionality that only exists in the master branch, then the issue should be filed under the Gramps project.&lt;br /&gt;
&lt;br /&gt;
* For bug reports and feature requests relating to Gramps Web, see [https://www.grampsweb.org/help/ | Get Help - Gramps Web]&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification. Here's a concise guide on '''[[How to create a good bug report]]''' for Gramps which will greatly increase the chances of reproducibility and thus being fixed.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. MantisBT allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**For recording issues that ''only'' apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]), use next un-released version e.g.: 5.3.0 as shown on the [https://gramps-project.org/bugs/roadmap_page.php| MantisBT Roadmap].&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful MantisBT bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ MantisBT bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]]&lt;br /&gt;
&lt;br /&gt;
MantisBT.org reports providing user-oriented (''not'' admin) documentation&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=5070 0005070]: I have written [MantisBT] quick-start documentation [.doc, .pdf, .swx] if you’re interested&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=8939 0008939]: Lifecycle model [Visio] for a report in MantisBT&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101185</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101185"/>
		<updated>2023-12-29T16:51:54Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Encourage bug reports to read the good bug reporting wiki.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://forum.gramps-project.org/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release or a problem with functionality that only exists in the master branch, then the issue should be filed under the Gramps project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification. Here's a concise guide on '''[[How to create a good bug report]]''' for Gramps which will greatly increase the chances of reproducibility and thus being fixed.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. MantisBT allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**For recording issues that ''only'' apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]), use next un-released version e.g.: 5.3.0 as shown on the [https://gramps-project.org/bugs/roadmap_page.php| MantisBT Roadmap].&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful MantisBT bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ MantisBT bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]]&lt;br /&gt;
&lt;br /&gt;
MantisBT.org reports providing user-oriented (''not'' admin) documentation&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=5070 0005070]: I have written [MantisBT] quick-start documentation [.doc, .pdf, .swx] if you’re interested&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=8939 0008939]: Lifecycle model [Visio] for a report in MantisBT&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101184</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101184"/>
		<updated>2023-12-29T16:48:52Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Remove obsolete reference to 'Gramps Master' project, and direct users to use Product Version field.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://forum.gramps-project.org/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release or a problem with functionality that only exists in the master branch, then the issue should be filed under the Gramps project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification, it may help you to read the '''[[How to create a good bug report]]''' article.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. MantisBT allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**For recording issues that ''only'' apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]), use next un-released version e.g.: 5.3.0 as shown on the [https://gramps-project.org/bugs/roadmap_page.php| MantisBT Roadmap].&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful MantisBT bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ MantisBT bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]]&lt;br /&gt;
&lt;br /&gt;
MantisBT.org reports providing user-oriented (''not'' admin) documentation&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=5070 0005070]: I have written [MantisBT] quick-start documentation [.doc, .pdf, .swx] if you’re interested&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=8939 0008939]: Lifecycle model [Visio] for a report in MantisBT&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101183</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=101183"/>
		<updated>2023-12-29T16:40:42Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Gramps BugTracker has only one project for Gramps bugs so remove obsolete reference to version-based projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://forum.gramps-project.org/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release or a problem with functionality that only exists in the master branch, then the issue should be filed under the Gramps project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification, it may help you to read the '''[[How to create a good bug report]]''' article.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. MantisBT allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**The '''Gramps Master''' project should only be used by developers and testers of the latest code. It is a place for recording issues that only apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). There is only one &amp;quot;Gramps Master&amp;quot; project because there is only one master branch in the Git repository.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful MantisBT bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ MantisBT bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]]&lt;br /&gt;
&lt;br /&gt;
MantisBT.org reports providing user-oriented (''not'' admin) documentation&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=5070 0005070]: I have written [MantisBT] quick-start documentation [.doc, .pdf, .swx] if you’re interested&lt;br /&gt;
* [https://www.mantisbt.org/bugs/view.php?id=8939 0008939]: Lifecycle model [Visio] for a report in MantisBT&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=96035</id>
		<title>Gramps for Windows with MSYS2</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_for_Windows_with_MSYS2&amp;diff=96035"/>
		<updated>2023-08-24T01:43:37Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Run second update after core packages are updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man warn|1=Warning|2=Do not open your existing databases with the master branch, it might destroy your data, and will make it impossible to use the data in the stable version {{stable_branch}}. To try it out, export your database to a gramps xml file, eg &amp;lt;code&amp;gt;test_master.gramps&amp;lt;/code&amp;gt;, create a new family tree in the master branch, and import this xml file.&amp;lt;br&amp;gt;Alternatively you can [[Gramps_for_Windows_with_MSYS2#Keep_your_GRAMPSHOME_separate|Keep your GRAMPSHOME separate]]}}&lt;br /&gt;
&lt;br /&gt;
How to use MSYS2 to run latest Gramps development version from source in 64bit Windows.&lt;br /&gt;
&lt;br /&gt;
In similar way you can build the 32bit version ([https://www.msys2.org/news/#2020-05-17-32-bit-msys2-no-longer-actively-supported 2020-05-17 - 32-bit MSYS2 no longer actively supported])&lt;br /&gt;
==Install MSYS2==&lt;br /&gt;
&lt;br /&gt;
{{man note|Installation restrictions|MSYS2 can't be installed on [https://en.wikipedia.org/wiki/File_Allocation_Table FAT* formatted disk partitions].&amp;lt;br&amp;gt;Current MSYS2 can't be installed on Windows XP anymore.}}&lt;br /&gt;
&lt;br /&gt;
From the MSYS2 home page https://www.msys2.org/ download the latest MSYS2 64bit installer( msys2-x86_64-YYYYMMDD.exe ) from [https://repo.msys2.org/distrib/x86_64/ https://repo.msys2.org/distrib/x86_64/] and run it.&lt;br /&gt;
&lt;br /&gt;
Install it in short path like &amp;lt;code&amp;gt;C:\msys64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of install select to run mingw64 shell eg: use the '''MSYS2 MinGW 64-bit''' shortcut.&lt;br /&gt;
&lt;br /&gt;
===Update MSYS2===&lt;br /&gt;
First keep running the following command(multiple times) until it has updated the list of packages and updated all core packages nothing else to do: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -Syuu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If core packages are updated you must close the mingw64 shell (forcefully with close button, not just typing exit on it) and then restart the mingw64 shell from the shortcut. Following a core update, run the update command again to update non-core packages.&lt;br /&gt;
&lt;br /&gt;
===Install Gramps dependencies===&lt;br /&gt;
Start mingw64 shell and use '''pacman''' package manager to download and install Gramps dependencies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-bsddb3 mingw-w64-x86_64-gexiv2 mingw-w64-x86_64-ghostscript mingw-w64-x86_64-python3-cairo mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-icu mingw-w64-x86_64-iso-codes mingw-w64-x86_64-hunspell mingw-w64-x86_64-hunspell-en mingw-w64-x86_64-enchant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To handle the following warning '''No intltool or version &amp;lt; 0.25.0, build_intl is aborting''' during the build later, install:&lt;br /&gt;
  pacman -S perl-XML-Parser&lt;br /&gt;
  pacman -S intltool&lt;br /&gt;
&lt;br /&gt;
You will also need the following to run the test:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-lxml&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-jsonschema&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Some additional (optional) items needed for certain addons.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-gtkspell3&lt;br /&gt;
pacman -S mingw-w64-x86_64-geocode-glib&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-pillow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Git and Gcc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S msys/git&lt;br /&gt;
pacman -S msys/gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Genealogical Symbols preferences tab needs Python Fontconfig version 0.5 so we need to build it.&lt;br /&gt;
From a suitable build directory (I use ~/build)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Vayn/python-fontconfig.git&lt;br /&gt;
cd python-fontconfig/&lt;br /&gt;
git checkout e1b1751f52167184e0c&lt;br /&gt;
python3 setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install Graphviz. To run the Graph View addon also install goocanvas.&lt;br /&gt;
(If you run into a problem try the alternate instructions to install [[Gramps_for_Windows_with_MSYS2#Issue|Graphviz]])&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
pacman -S mingw-w64-x86_64-goocanvas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install osmgpsmap for the Geography Views with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Gramps==&lt;br /&gt;
===Prepare source===&lt;br /&gt;
Create directory to store Gramps source in and go to it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/grampsdev&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download source===&lt;br /&gt;
Download Gramps master branch from source repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
git remote add -t master -f origin https://github.com/gramps-project/gramps.git&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check which Gramps version is used&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git describe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
it should return something like:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
v5.0.0-alpha1-1024-g0919763f1&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===Setup source===&lt;br /&gt;
Before using Gramps you must set-it up.&lt;br /&gt;
&amp;lt;br&amp;gt;You just use '''setup build''' command not '''install''' one&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 setup.py build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Run Gramps==&lt;br /&gt;
Start mingw64 shell and go to directory where Gramps source reside&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/grampsdev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Use python3 to start Gramps&lt;br /&gt;
&amp;lt;br&amp;gt;To check gramps version use &amp;quot;v&amp;quot; flag&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should return something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Settings:&lt;br /&gt;
----------------&lt;br /&gt;
 python    : 3.5.3&lt;br /&gt;
 gramps    : 5.0.0-alpha1-0919763f1&lt;br /&gt;
 gtk++     : 3.22.9&lt;br /&gt;
 pygobject : 3.22.0&lt;br /&gt;
 pango     : 1.40.3&lt;br /&gt;
 cairo     : 1.15.4&lt;br /&gt;
 pycairo   : 1.1.10&lt;br /&gt;
 osmgpsmap : 1.0&lt;br /&gt;
 GExiv2    : 0.10&lt;br /&gt;
 ICU       : 57.1&lt;br /&gt;
 PyICU     : 1.9.3&lt;br /&gt;
 o.s.      : win32&lt;br /&gt;
&lt;br /&gt;
Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : Graphviz not in system PATH&lt;br /&gt;
 Ghostscr. : 9.20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Run Gramps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 Gramps.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Building and updating MSYS2/MinGW packages==&lt;br /&gt;
===Install build tools===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed --noconfirm base-devel mingw-w64-x86_64-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[https://github.com/Alexpux/MINGW-packages MINGW-packages recipes] are on GitHub so you can use git to clone it. If instead you want to access recipe one by one you can download it with Subversion so install it first&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S subversion&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
We need a place to download and build from source code so we will create folder called &amp;quot;build&amp;quot; inside our home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To prevent pacman to upgrade packages we rebuilt for our needs we can assign them to group '''gramps_fixed''' and add them to IgnoreGroup list.&lt;br /&gt;
Open in text editor file ''etc/pacman.conf'' (C:\MSYS2\etc\pacman.conf) and add line ''IgnoreGroup = gramps_fixed'' to ''options'' section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[options]&lt;br /&gt;
IgnoreGroup = gramps_fixed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===db===&lt;br /&gt;
GrampsAIO uses Oracle Berkeley DB version 6.0.30 but MSYS2 have it at version 6.0.19 and most probably never update it to a newer version.&lt;br /&gt;
&amp;lt;br&amp;gt;Gramps will ask permission to downgrade database version at import of any family tree created with GrampsAIO bundle. To prevent that build right version of DB.&lt;br /&gt;
&amp;lt;br&amp;gt;''Hard way'' (it can take some time to finish)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-db&lt;br /&gt;
cd mingw-w64-db&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''The easy way doesn't work anymore!  This is because the recent versions of Python have changed and we have to rebuild.'''&lt;br /&gt;
&amp;lt;br&amp;gt;Start ''msys2 shell'' and type (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-db-6.0.30-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bsddb3===&lt;br /&gt;
As db version is changed then we have to rebuild Python bindings for Oracle Berkeley DB&lt;br /&gt;
&amp;lt;br&amp;gt;From ''msys2 shell'' (easy way):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Or hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-python-bsddb3&lt;br /&gt;
cd mingw-w64-python-bsddb3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-bsddb3-6.1.0-3.1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===gtk3===&lt;br /&gt;
[https://www.gtk.org/ GTK+] since version 3.20 drag-and-drop code has been rearchitected to move the drag cancel animation and most input handling into GDK, thereby dropping most of the platform-dependent code out of GTK (MSYS2 version of GTK is currently 3.22.10). This change is not yet present in Windows port of code so we have to use older GTK version 3.18 where it still works.&lt;br /&gt;
&amp;lt;br&amp;gt;Latest in gtk-3.18 branch is gtk-3.18.9 (previous versions of this branch have working dnd but have other bugs) so we build that.&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard Way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/bpisoj/MINGW-packages/branches/gramps5/mingw-w64-gtk3&lt;br /&gt;
cd mingw-w64-gtk3&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-gtk3-3.18.9-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===graphviz===&lt;br /&gt;
&lt;br /&gt;
As of 2019.09.17 package mingw-w64-osm-gps-map is available so all you have to do is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-graphviz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Previously Graphviz was in MSYS2 MINGW-packages git repository but was not build-able at that time (2017-03-26) so it is not available via pacman.&lt;br /&gt;
We build latest version from Graphviz git repository by manually patching code in process so we can't yet provide PKGBUILD&lt;br /&gt;
* Easy way&lt;br /&gt;
As we use simple archive not real packages we need to make care that dependencies are satisfied&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S --needed mingw-w64-x86_64-cairo mingw-w64-x86_64-devil mingw-w64-x86_64-expat mingw-w64-x86_64-freetype mingw-w64-x86_64-glib2 mingw-w64-x86_64-gtk2 mingw-w64-x86_64-gtkglext mingw-w64-x86_64-fontconfig mingw-w64-x86_64-freeglut mingw-w64-x86_64-libglade mingw-w64-x86_64-libgd mingw-w64-x86_64-libpng mingw-w64-x86_64-libsystre mingw-w64-x86_64-pango mingw-w64-x86_64-poppler mingw-w64-x86_64-zlib mingw-w64-x86_64-libtool&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Next we download prebuilt archive and extract it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/win64_graphviz_20170323.1842.tar.xz&lt;br /&gt;
tar xfv win64_graphviz_20170323.1842.tar.xz -C /&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
After successful install we first need to configure it (from mingw64 shell)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If no error is displayed everything is working fine and Graphviz registered their plugins.&lt;br /&gt;
We can check version with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dot -V&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
winpty dot -v&lt;br /&gt;
&lt;br /&gt;
dot - graphviz version 2.41.20170323.1842 (20170323.1842)&lt;br /&gt;
libdir = &amp;quot;C:\MSYS2\mingw64\bin&amp;quot;&lt;br /&gt;
Activated plugin library: libgvplugin_dot_layout-6.dll&lt;br /&gt;
Using layout: dot:dot_layout&lt;br /&gt;
Activated plugin library: libgvplugin_core-6.dll&lt;br /&gt;
Using render: dot:core&lt;br /&gt;
Using device: dot:dot:core&lt;br /&gt;
The plugin configuration file: C:\MSYS2\mingw64\bin\config6&lt;br /&gt;
was successfully loaded.&lt;br /&gt;
    render      :  cairo dot fig gd map pic pov ps svg tk vml vrml xdot&lt;br /&gt;
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi&lt;br /&gt;
    textlayout  :  textlayout&lt;br /&gt;
    device      :  bmp canon cmap cmapx cmapx_np dot eps fig gd gd2 gif gv ico imap &lt;br /&gt;
                   imap_np ismap jpe jpeg jpg pdf pic plain plain-ext png pov ps ps2&lt;br /&gt;
                   svg svgz tga tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4&lt;br /&gt;
    loadimage   :  (lib) bmp eps gd gd2 gif ico jpe jpeg jpg pdf png ps svg xbm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way (TODO)&lt;br /&gt;
====pygraphviz====&lt;br /&gt;
Needed for NetworkChart report (Third-party addon)&lt;br /&gt;
* Easy way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
wget https://github.com/bpisoj/MINGW-packages/releases/download/v5.0/mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-1-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Hard way&lt;br /&gt;
download https://gramps-project.org/wiki/images/2/2b/Pygraphviz-1.4rc1.zip  [[:File:Pygraphviz-1.4rc1.zip|(source here)]]&lt;br /&gt;
&lt;br /&gt;
Unzip it into &amp;lt;code&amp;gt;~/build/pygraphviz-1.4rc1/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build/pygraphviz-1.4rc1&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-python3-pygraphviz-1.4rc1-0.0-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also networkx package&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-python3-networkx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For NetworkChart report to work install also pydotplus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip3 install pydotplus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osmgpsmap===&lt;br /&gt;
As of 2019.02.08 package mingw-w64-osm-gps-map is available so all you have to do is &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pacman -S mingw-w64-x86_64-osm-gps-map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Start '''msys2 shell''' (always build package recipes from msys2 shell)&lt;br /&gt;
Hard way:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/build&lt;br /&gt;
svn checkout https://github.com/Alexpux/MINGW-packages/trunk/mingw-w64-osm-gps-map&lt;br /&gt;
cd mingw-w64-osm-gps-map&lt;br /&gt;
MINGW_INSTALLS=mingw64 makepkg-mingw -sLf&lt;br /&gt;
pacman -U mingw-w64-x86_64-osm-gps-map-1.1.0-2-any.pkg.tar.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Issue==&lt;br /&gt;
===Graphviz===&lt;br /&gt;
* No Graphviz see: [https://github.com/Alexpux/MINGW-packages/issues/737 MSYS2:Package request: graphviz] &lt;br /&gt;
** Marked as WIP see: https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-graphviz&lt;br /&gt;
&lt;br /&gt;
====Alternate method using Windows version of Graphviz====&lt;br /&gt;
Tested alternate method to use Windows version of Graphviz[http://felsin9.de/nnis/ghc-vis/installing-windows/]&lt;br /&gt;
{{man warn|Warning it is not advised for users to mix various libraries like the following it is a direct way to dll hell.|This way Gramps will use graphviz libs instead of MSYS2 ones and they are older and in much way incompatible with rest of Gramps dependencies.&amp;lt;br&amp;gt; until Graphviz becomes available from MSYS2 directly this is an alternate method.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Download the current GraphViz ZIP archive from https://www.graphviz.org/download/ and extract it to C:\graphviz, so that it directly contains the directories bin, lib, share and so on.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the msys2 prompt type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 'export PATH=/c/graphviz/bin:$PATH' &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then type:&lt;br /&gt;
&lt;br /&gt;
 python3 Gramps.py -v&lt;br /&gt;
&lt;br /&gt;
and Graphviz will be listed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : 2.38&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Python pip==&lt;br /&gt;
To install a working version of pip use the following steps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
mkdir ~/scripts&lt;br /&gt;
cd ~/scripts&lt;br /&gt;
curl -O 'https://bootstrap.pypa.io/get-pip.py'&lt;br /&gt;
./get-pip.py&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Test that it works:&lt;br /&gt;
&lt;br /&gt;
  pip3 --version&lt;br /&gt;
&lt;br /&gt;
If that succeeds you can now remove the installation script if wanted:&lt;br /&gt;
 &lt;br /&gt;
  rm get-pip.py&lt;br /&gt;
&lt;br /&gt;
==Keep your [[Gramps_{{man version}}_Wiki_Manual_-_Command_Line#GRAMPSHOME|GRAMPSHOME]] separate==&lt;br /&gt;
To keep your test family trees separate from your personal family trees you may want to use your MSYS2 home directory which you can set from mingw64 shell either:&lt;br /&gt;
&lt;br /&gt;
On each run like:&lt;br /&gt;
&lt;br /&gt;
   GRAMPSHOME=~ python3 Gramps.py&lt;br /&gt;
&lt;br /&gt;
If you want it persistent:&lt;br /&gt;
&lt;br /&gt;
   echo 'export GRAMPSHOME=~' &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
   source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Running a development version of Gramps]]&lt;br /&gt;
* [https://sourceforge.net/p/gramps/mailman/message/35346200/ Gramps on WSL (Win10/Ubuntu 14.04/VcXsvr)]&lt;br /&gt;
&lt;br /&gt;
[[Category:GEPS|M]]&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:NumberOfAncestorsQuickView&amp;diff=95205</id>
		<title>Addon:NumberOfAncestorsQuickView</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:NumberOfAncestorsQuickView&amp;diff=95205"/>
		<updated>2023-07-08T16:20:47Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Link to Ancestor Fill Report addon wiki which was added recently&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
&lt;br /&gt;
[[File:NumberOfAncestors-QuickView-example-51.png|thumb|right|450px|Number of Ancestors Quick View]]&lt;br /&gt;
&lt;br /&gt;
The Quick View {{man label|Number of Ancestors}} is similar to the text report [[Gramps_{{man version}}_Wiki_Manual_-_Reports_-_part_6#Number_of_Ancestors_Report|Number of Ancestors]]. For each generation of the person's ancestors it tells you the number of ancestors found, the theoretical ancestor number and how many percent of the theoretical ancestors were found. The Quick View only counts individual ancestors, therefore duplicates caused by pedigree collapse are ignored in the calculations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
You can activate the Quick View by right-clicking on a person's name in the [[Gramps_{{man version}}_Wiki_Manual_-_Categories#People_Category|People Category View]]. Then select {{man menu|Quick View &amp;gt; Number Of Ancestors}}.&lt;br /&gt;
 &lt;br /&gt;
==Tips==&lt;br /&gt;
* Quick Views can also be used as Gramplets. ([[Gramps_{{man version}}_Wiki_Manual_-_Gramplets#Quick_View|more information]])&lt;br /&gt;
* The Third-party Addon [[Addon:Ancestor_Fill_Report|Ancestor Fill Report]] calculates pedigree collapse.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Pedigree_collapse Pedigree collapse] - Wikipedia&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Output_formats&amp;diff=94705</id>
		<title>Output formats</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Output_formats&amp;diff=94705"/>
		<updated>2023-06-03T02:22:07Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Fix typo; remove extraneous empty lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Output Format: ''choose the output format:&lt;br /&gt;
&lt;br /&gt;
==CSV==&lt;br /&gt;
* &amp;lt;code&amp;gt;.csv&amp;lt;/code&amp;gt; '''Comma Separated Value''' structured text format extension&lt;br /&gt;
A comma-separated values (CSV) file is a delimited text file that uses a comma to separate values. A CSV file stores tabular data (numbers and text) in plain text.. Beginning with Gramps 5.2, the CSV import module allows selecting addiational delimiters beyond commas.&lt;br /&gt;
==D3==&lt;br /&gt;
* &amp;lt;code&amp;gt;.d3&amp;lt;/code&amp;gt; '''Data-Driven Documents''' structured text format extension&lt;br /&gt;
 &lt;br /&gt;
[https://github.com/d3/d3/wiki D3 (Data-Driven Documents)] is a JavaScript library and framework for manipulating visualization documents based on data. D3 helps you bring data to life using HTML, SVG, and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation. &lt;br /&gt;
&lt;br /&gt;
A combination of HTML (HyperText Markup Language), SVG (Scalable Vector Graphics), and CSS (Cascading Style Sheet)&lt;br /&gt;
* [https://wikipedia.org/wiki/D3.js D3.js library] - Wikipedia&lt;br /&gt;
&lt;br /&gt;
==GEDCOM==&lt;br /&gt;
* &amp;lt;code&amp;gt;.ged&amp;lt;/code&amp;gt; '''GEnealogical Data COMmunication''' genealogical data file format extension&lt;br /&gt;
de facto standard file format for data interchange between genealogy programs via [[#GEDCOM_import|import]] and export. &lt;br /&gt;
&lt;br /&gt;
'''Dialects'''&lt;br /&gt;
* &amp;lt;code&amp;gt;.ged2&amp;lt;/code&amp;gt; '''GEDCOM Extensions''' genealogical data file format extension  &lt;br /&gt;
* [http://www.pmoylan.org/pages/os2/wft.html Web Family Tree] GEDCOM &lt;br /&gt;
&lt;br /&gt;
==GeneWeb==&lt;br /&gt;
* &amp;lt;code&amp;gt;.gw&amp;lt;/code&amp;gt; '''GeneWeb''' genealogical data file format extension&lt;br /&gt;
[https://wikipedia.org/wiki/GeneWeb GeneWeb] is free open source genealogy software with an interface on a lightweight web server.&lt;br /&gt;
&lt;br /&gt;
==GIF==&lt;br /&gt;
* &amp;lt;code&amp;gt;.gif&amp;lt;/code&amp;gt; '''Graphics Interchange Format''' image file format extension&lt;br /&gt;
==Graphviz==&lt;br /&gt;
* &amp;lt;code&amp;gt;.gv&amp;lt;/code&amp;gt; '''GraphViz''' image file format extension&lt;br /&gt;
&lt;br /&gt;
[https://wikipedia.org/wiki/Graphviz Graphviz] (Graph Visualization) suite of open source software ([https://www.graphviz.org/download/ Download page])&lt;br /&gt;
&lt;br /&gt;
'''[https://wikipedia.org/wiki/DOT_(graph_description_language) DOT]''' is the graph description language of the suite GraphViz. It has a human-readable syntax that describes network data, including subgraphs and elements appearances (i.e. color, width, label).  &lt;br /&gt;
&lt;br /&gt;
'''DOT graphs''' can also be imported into [https://wikipedia.org/wiki/NetworkX NetworkX], [https://wikipedia.org/wiki/Tulip_(software) Tulip] or [http://zvtm.sourceforge.net/zgrviewer.html ZGRViewer]. &lt;br /&gt;
&lt;br /&gt;
Files are typically indicated with the &amp;lt;code&amp;gt;.gv&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.dot&amp;lt;/code&amp;gt; filename extensions. The extension [https://wikipedia.org/w/index.php?title=.gv&amp;amp;redirect=no &amp;lt;code&amp;gt;.gv&amp;lt;/code&amp;gt;] is preferred. (This avoids confusion with the extension [https://wikipedia.org/wiki/.dot &amp;lt;code&amp;gt;.dot&amp;lt;/code&amp;gt;] also used for Microsoft Word ''template'' files prior to 2007.) However, the DOT language can be converted to several object-oriented graphics formats.&lt;br /&gt;
==GRDB==&lt;br /&gt;
* &amp;lt;code&amp;gt;.grdb&amp;lt;/code&amp;gt; '''[[#GRAMPS_V2.x_database_import|GRAMPS V2.x database]]''' database file extension&lt;br /&gt;
==HTML==&lt;br /&gt;
* &amp;lt;code&amp;gt;.html&amp;lt;/code&amp;gt; '''HyperText Markup Language''' structured text format extension&lt;br /&gt;
HyperText Markup Language (HTML)&lt;br /&gt;
==JPEG==&lt;br /&gt;
* &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; '''Joint Photographic Experts Group''' image file format extension&lt;br /&gt;
==JSON==&lt;br /&gt;
* &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt; '''JavaScript Object Notation''' structured text file format extension&lt;br /&gt;
[https://www.json.org/ JavaScript Object Notation] is a lightweight data-interchange format.  &lt;br /&gt;
&lt;br /&gt;
==LaTeX==&lt;br /&gt;
* &amp;lt;code&amp;gt;.tex&amp;lt;/code&amp;gt; '''Lamport's TeX (''&amp;amp;Tau;'' tau, ''&amp;amp;epsilon;'' epsilon and ''&amp;amp;Chi;'' chi)''' structured text format extension&lt;br /&gt;
A file format to provide high-quality typesetting information describing layout and font styling of textual data. Originally designed to flexibly support the complex layout (including multi-level superscript, subscript, matrixes &amp;amp; special glyphs) of scientific formulas.&lt;br /&gt;
&lt;br /&gt;
LaTeX ''(also written L&amp;lt;sup&amp;gt;A&amp;lt;/sup&amp;gt;T&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;X)'' uses the TeX typesetting program for formatting its output, and LaTeX itself is written in the TeX macro language.&lt;br /&gt;
&lt;br /&gt;
* File extension: &amp;lt;code&amp;gt;.tex&amp;lt;/code&amp;gt;&lt;br /&gt;
* Helper (file viewer) application: see the [[Addon:GenealogyTree#Prerequisites|Prerequisites]] section for the GenealogyTree addon.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Lamport's TeX&amp;quot; is named after developer [https://wikipedia.org/wiki/Leslie_Lamport Leslie Lamport]. With LaTeX, Lamport added a collection of macros to the original T&amp;lt;sub&amp;gt;E&amp;lt;/sub&amp;gt;X program which was made by [https://wikipedia.org/wiki/Donald_Knuth Donald Knuth].&lt;br /&gt;
&lt;br /&gt;
[https://www.latex-project.org/get/ How to get LaTeX]&lt;br /&gt;
&lt;br /&gt;
==Open Document Spreadsheet==&lt;br /&gt;
* &amp;lt;code&amp;gt;.ods&amp;lt;/code&amp;gt; '''OpenDocument Spreadsheet''' format extension&lt;br /&gt;
&lt;br /&gt;
==Open Document Text==&lt;br /&gt;
* &amp;lt;code&amp;gt;.odt&amp;lt;/code&amp;gt; '''OpenDocument Text''' structured text format extension&lt;br /&gt;
&amp;quot;Filename extensions&lt;br /&gt;
.odt &amp;amp; .fodt for word processing (text) documents.&lt;br /&gt;
Open Document Format for Office Applications (ODF), also known as OpenDocument, is a ZIP-compressed[[https://wikipedia.org/wiki/OpenDocument#cite_note-6 6]] XML-based file format for spreadsheets, charts, presentations and word processing documents. It was developed with the aim of providing an open, XML-based file format specification for office applications.[[https://wikipedia.org/wiki/OpenDocument#cite_note-7 7]]&amp;quot; - ''[https://wikipedia.org/wiki/OpenDocument Wikipedia]''&lt;br /&gt;
&lt;br /&gt;
==PDF document==&lt;br /&gt;
* &amp;lt;code&amp;gt;.pdf&amp;lt;/code&amp;gt; '''Portable Document Format''' text formatting and images file format extension&lt;br /&gt;
** Ghostscript ''PDF dialect''&lt;br /&gt;
** Graphviz ''PDF dialect''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Portable Document Format (PDF) (redundantly: PDF format) is a file format developed by Adobe in the 1990s to present documents, including text formatting and images, in a manner independent of application software, hardware, and operating systems.[[https://wikipedia.org/wiki/PDF#cite_note-pdf-ref-1.7-3 2]][[https://wikipedia.org/wiki/PDF#cite_note-4 3]] Based on the PostScript language, each PDF file encapsulates a complete description of a fixed-layout flat document, including the text, fonts, vector graphics, raster images and other information needed to display it.&amp;quot; - ''Wikipedia''&lt;br /&gt;
&lt;br /&gt;
==Plain Text==&lt;br /&gt;
* &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; '''text''' format extension&lt;br /&gt;
&lt;br /&gt;
==PNG==&lt;br /&gt;
* &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt; '''Portable Network Graphics''' image file format extension&lt;br /&gt;
&lt;br /&gt;
==PostScript==&lt;br /&gt;
* &amp;lt;code&amp;gt;.ps&amp;lt;/code&amp;gt; '''PostScript''' page description language file format extension&lt;br /&gt;
PostScript (PS) is a page description language in the electronic publishing and desktop publishing business. It is a dynamically typed, concatenative programming language and was created at Adobe Systems.&lt;br /&gt;
==Print...==&lt;br /&gt;
&lt;br /&gt;
==Pro-Gen==&lt;br /&gt;
* &amp;lt;code&amp;gt;.def&amp;lt;/code&amp;gt; '''data exchange format''' genealogical data file format extension&lt;br /&gt;
[https://www.pro-gen.nl/gbhome.htm PRO-GEN] is a commercial genealogical program that has been very popular in the Netherlands and North-West Germany. It is often used by people who started collecting and storing data as early as 1989. This was a DOS based program which has been patched to work with Win 10.&lt;br /&gt;
&lt;br /&gt;
==Prolog==&lt;br /&gt;
* Prolog export - Prolog fact format in Unicode (utf-8)&lt;br /&gt;
&lt;br /&gt;
==Raw export==&lt;br /&gt;
raw Python object&lt;br /&gt;
&lt;br /&gt;
==RTF document==&lt;br /&gt;
* &amp;lt;code&amp;gt;.rtf&amp;lt;/code&amp;gt; '''Rich Text Format''' structured text file format extension&lt;br /&gt;
&amp;quot;The Rich Text Format (often abbreviated RTF) is a proprietary[[https://wikipedia.org/wiki/Rich_Text_Format#cite_note-6 6]][[https://wikipedia.org/wiki/Rich_Text_Format#cite_note-e-gov-uk-7 7]][[https://wikipedia.org/wiki/Rich_Text_Format#cite_note-e-gov-uk-archived-8 8]] document file format with published specification developed by Microsoft Corporation from 1987 until 2008 for cross-platform document interchange with Microsoft products.&amp;quot; - ''[https://wikipedia.org/wiki/Rich_Text_Format Wikipedia]''&lt;br /&gt;
==SQLite==&lt;br /&gt;
* &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; '''SQLite''' database file format extension&lt;br /&gt;
[https://www.sqlite.org/fileformat.html SQLite] is a database engine written in the C programming language.&lt;br /&gt;
==SVG==&lt;br /&gt;
* &amp;lt;code&amp;gt;.svg&amp;lt;/code&amp;gt; '''Scalable Vector Graphics''' image file format extension&lt;br /&gt;
Scalable Vector Graphics (SVG) is an Extensible Markup Language (XML)-based vector image format for two-dimensional graphics with support for interactivity and animation. &lt;br /&gt;
==SVGZ==&lt;br /&gt;
* &amp;lt;code&amp;gt;.svgz&amp;lt;/code&amp;gt; '''Compressed Structured Vector Graphs''' image file format extension&lt;br /&gt;
&lt;br /&gt;
==vCalendar==&lt;br /&gt;
* &amp;lt;code&amp;gt;.vcf&amp;lt;/code&amp;gt; '''vCalendar file''' calendar format extension&lt;br /&gt;
A calendar format that is a predecessor of iCalendar. It was created by the Internet Mail Consortium (IMC),&lt;br /&gt;
&lt;br /&gt;
==vCard==&lt;br /&gt;
* &amp;lt;code&amp;gt;.vcf&amp;lt;/code&amp;gt; '''Virtual Contact File''' structured text format extension&lt;br /&gt;
&lt;br /&gt;
[https://wikipedia.org/wiki/VCard vCard] is a file format standard for electronic business cards. &lt;br /&gt;
==XML==&lt;br /&gt;
* &amp;lt;code&amp;gt;.xml&amp;lt;/code&amp;gt; '''Extensible Markup Language''' structured text format extension&lt;br /&gt;
&lt;br /&gt;
'''Dialects'''&lt;br /&gt;
* &amp;lt;code&amp;gt;.gramps&amp;lt;/code&amp;gt; [[#Gramps_XML_and_XML_Package_import|'''Gramps Extensible Markup Language''']] Gramps native data exchange format in uncompressed text and [https://wikipedia.org/wiki/Gzip gzip] compressed&lt;br /&gt;
* &amp;lt;code&amp;gt;.gpkg&amp;lt;/code&amp;gt; [[#Gramps_XML_and_XML_Package_import|'''Gramps XML package ''']] Gramps native data backup and archive format in [https://wikipedia.org/wiki/.tar.gz .tar.gz] compressed format with or without media.&lt;br /&gt;
* Isotammi XML export&lt;br /&gt;
=See also:=&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Exporting_data]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:D3_Ancestral_and_Descendant_Charts&amp;diff=94680</id>
		<title>Addon:D3 Ancestral and Descendant Charts</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:D3_Ancestral_and_Descendant_Charts&amp;diff=94680"/>
		<updated>2023-05-29T20:29:28Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add few more details to the library versions used by D3Charts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
&lt;br /&gt;
The '''D3 Ancestral and Descendant Charts''' addon consists of three(3) Web based reports:&lt;br /&gt;
* {{man label|[[Addon:D3_Ancestral_and_Descendant_Charts#Ancestral_Collapsible_Tree|Ancestral Collapsible Tree]]}}&lt;br /&gt;
* {{man label|[[Addon:D3_Ancestral_and_Descendant_Charts#Ancestral_Fan_Chart|Ancestral Fan Chart]]}}&lt;br /&gt;
* {{man label|[[Addon:D3_Ancestral_and_Descendant_Charts#Descendant_Indented_Tree|Descendant Indented Tree]]}}.&lt;br /&gt;
&lt;br /&gt;
Each chart used the [[Output_formats#D3|D3.js library]] for its layout which are SVG based and provide some really nice inter-activeness and animation.&lt;br /&gt;
&lt;br /&gt;
Note the filtering is based off the text based Ancestry and Descendant Reports.&lt;br /&gt;
&lt;br /&gt;
All of the reports generate [https://en.wikipedia.org/wiki/JSON JSON] for ancestry/descendant's and could be easily customized for other usage.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Ancestral Collapsible Tree ===&lt;br /&gt;
[[File:D3-AncestralCollapsibleTree-WebReport-Addon-example-50.png|thumb|right|450px|Ancestral Collapsible Tree - example output]]&lt;br /&gt;
&lt;br /&gt;
This report is available under the menu {{Man menu|Reports &amp;gt; Web Pages &amp;gt; Ancestral Collapsible Tree...}}&lt;br /&gt;
&lt;br /&gt;
A graphical representation of ancestry for a given individual.&lt;br /&gt;
&lt;br /&gt;
By default up to Great Grandparents are displayed.&lt;br /&gt;
&lt;br /&gt;
Clicking on an ancestor whom has further ancestors will either collapse or expand all ancestors for that person.&lt;br /&gt;
&lt;br /&gt;
Specific customizable colors indicate whether there are further ancestors for a given person, and can be specified for maternal and paternal lines.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Ancestral Fan Chart ===&lt;br /&gt;
&lt;br /&gt;
[[File:D3-AncestralFanChart-WebReport-Addon-example-50.png|thumb|right|450px|Ancestral Fan Chart - example output]]&lt;br /&gt;
&lt;br /&gt;
This report is available under the menu {{Man menu|Reports &amp;gt; Web Pages &amp;gt; Ancestral Fan Chart...}}&lt;br /&gt;
&lt;br /&gt;
The Ancestral Fan Chart report illustrates an individuals ancestry by means of a full circle fan chart.&lt;br /&gt;
&lt;br /&gt;
The initial display shows the filtered individual at the center of the fan chart.&lt;br /&gt;
&lt;br /&gt;
Selecting individuals on the fan chart will result in that individual becoming the center person and a new fan chart is drawn dynamically indicating that persons ancestry.&lt;br /&gt;
&lt;br /&gt;
Continuous selection of the center of the fan chart will eventually return you to the original filter person, a page reload will also do this.&lt;br /&gt;
&lt;br /&gt;
Custom colors can be provided for paternal and maternal sides of the filtered person. &lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Descendant Indented Tree ===&lt;br /&gt;
&lt;br /&gt;
[[File:D3-DescendantIndentedTree-WebReport-Addon-example-50.png|thumb|right|450px|Descendant Indented Tree - example output]]&lt;br /&gt;
&lt;br /&gt;
This report is available under the menu {{Man menu|Reports &amp;gt; Web Pages &amp;gt; Descendant Indented Tree...}}&lt;br /&gt;
&lt;br /&gt;
The Descendant Indented Tree report is a graphical representation of the text based Descendant Report.&lt;br /&gt;
&lt;br /&gt;
When clicking on a person if that person has further descendants, then the tree will dynamically expand or collapse depending on its current state.&lt;br /&gt;
&lt;br /&gt;
As with the other reports some customizable colors can be specified at generation time. In this report they pertain to whether there are more descendants to view or not.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
* Charts appear without content - related to a security vulnerability update to Browsers. (i.e. local HTML files ought not to be authorized to open files from different sub-directories) This shouldn't be a problem once the files are uploaded to a server.  It is just local mode that is affected.  Workarounds for local mode available for:&lt;br /&gt;
** set [https://gramps.discourse.group/t/web-page-reports-have-no-content/411/8 Firefox] &amp;lt;tt&amp;gt;privacy.file_unique_origin flag&amp;lt;/tt&amp;gt; to false in [http://kb.mozillazine.org/About:config about:config]&lt;br /&gt;
** Chrome launch flags: &amp;lt;pre&amp;gt;C:\Program Files (x86)\Google\Chrome\Application\chrome.exe&amp;quot; --allow-file-access-from-files --allow-file-access --allow-cross-origin-auth-prompt&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Help buttons URL's on report dialogs do not lead here.&lt;br /&gt;
* {{bug|9602}}: Descendant Indented Tree doesn't work with Chromium browser&lt;br /&gt;
* {{bug|11800}}: D3 Chart update of d3.js and jquery libraries to newer versions&lt;br /&gt;
** Uses D3.js version 3.4.5  (and not the [https://d3js.org/ current release])&lt;br /&gt;
** Uses [https://jquery.com/ jquery] v1.10.2 and 2.0.3 which are no longer supported or patched&lt;br /&gt;
** Uses [https://jqueryui.com/ jquery-ui] v1.10.4 which is also outdated&lt;br /&gt;
* Does not work with MS-IE 11?[https://github.com/d3/d3/issues/599#issuecomment-32245110]&lt;br /&gt;
If anyone is still facing the problem [with MS-IE 11] here is the solution:&lt;br /&gt;
&lt;br /&gt;
Add this 2 lines to your html file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If not IE doesn't understand the property CSSStyleDeclaration in your d3.js file.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Web Solutions for Gramps]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Reports]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:Python_Shell_Gramplet&amp;diff=94621</id>
		<title>Addon:Python Shell Gramplet</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:Python_Shell_Gramplet&amp;diff=94621"/>
		<updated>2023-05-07T20:51:06Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Incorporate information Nick_H shared on Discourse forums&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
&lt;br /&gt;
[[File:PythonGramplet-interactive-shell-example-50.png|thumb|right|450px|Python Shell Gramplet - Interactive shell example output]]&lt;br /&gt;
&lt;br /&gt;
The {{man label|Python Shell}} Gramplet brings up an interactive Python Shell for interpreting python expressions.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
You can type most any (single line) Python expression. &lt;br /&gt;
&lt;br /&gt;
In addition, the environment has been populated with some useful variables, including &lt;br /&gt;
*'''self''' - (this Python gramplet)&lt;br /&gt;
*'''Date''' -  a date object constructor, that can be used for date arithmetic.&lt;br /&gt;
*'''db''' - Interact with the Database&lt;br /&gt;
*'''dbstate''' - Information about the Database&lt;br /&gt;
*'''gc''' - the Python &amp;quot;garbage collector&amp;quot; preloaded with the same flags as the Debug Tool.&lt;br /&gt;
*'''uistate''' - Interact with the GUI&lt;br /&gt;
&lt;br /&gt;
When the {{man label|Python Shell}} Gramplet is detached you can select the {{man button|Help}} button to see this page.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Output of print() commands issued in the Python Shell will be directed to the Gramps console window, so be sure to keep that window open.&lt;br /&gt;
&lt;br /&gt;
Use the [[Using database API|database API]] to retrieve objects and use object library to find the information you require. If you want to write GUI code, then knowledge of Gtk3 is also required.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
&lt;br /&gt;
The '''Date''' entry is a date object constructor, and can be used for date arithmetic. For example, you might be interested in questions like:&lt;br /&gt;
&lt;br /&gt;
What was the date 56 years before a given date:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; Date(2007, 12, 31) - 56&lt;br /&gt;
 1951-12-31&lt;br /&gt;
&lt;br /&gt;
How old was someone on Sept 3, 1955 who was born on June 7, 1922:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Date(1955, 9, 3) - Date(1922, 5, 7)&lt;br /&gt;
33 years, 3 months&lt;br /&gt;
&lt;br /&gt;
When did they turn 21 years old?&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; Date(1922, 5, 7) + 21&lt;br /&gt;
 1943-05-07&lt;br /&gt;
&lt;br /&gt;
You can also add years, months, and days:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; Date(1980) + (0, 0, 25)&lt;br /&gt;
 1980-01-26&lt;br /&gt;
&lt;br /&gt;
You can convert one date into another calendar, which returns a new date object:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; Date(1703, 6, 1).to_calendar(&amp;quot;hebrew&amp;quot;)&lt;br /&gt;
 5463-10-17 (Hebrew)&lt;br /&gt;
&lt;br /&gt;
=== Displayers ===&lt;br /&gt;
&lt;br /&gt;
Use utility code to make things easier. For example, you will probably want to use the name, date and place displayers rather than formatting the data yourself. To print the name of the default person, use the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; from gramps.gen.display.name import displayer as nd&lt;br /&gt;
 &amp;gt; person = self.dbstate.db.get_default_person()&lt;br /&gt;
 &amp;gt; print(nd.display(person))&lt;br /&gt;
&lt;br /&gt;
To find the type of a variable use:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; type(person)&lt;br /&gt;
&lt;br /&gt;
=== Developers ===&lt;br /&gt;
&lt;br /&gt;
Another use for this Gramplet is for debugging. This gramplet makes a nice interface to the running Gramps system. You can inspect, and alter the system by entering Python commands. As a simple example, you can:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; self.clear_text()     # clear the text in this window&lt;br /&gt;
 &amp;gt; self.set_wrap(False)  # turn word wrap off&lt;br /&gt;
 &amp;gt; self.set_wrap(True)   # turn word wrap on&lt;br /&gt;
&lt;br /&gt;
The Python Gramplet also has the Python &amp;quot;garbage collector&amp;quot; preloaded with the same flags as the Debug Tool. To use:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; gc.collect()&lt;br /&gt;
 23&lt;br /&gt;
 &amp;gt; gc.garbage[0]&lt;br /&gt;
 &amp;lt;cell at 0x9f9089c: function object at 0x9f89dbc&amp;gt;&lt;br /&gt;
 &amp;gt; gc.get_referents(self)&lt;br /&gt;
 [...]&lt;br /&gt;
 &amp;gt; gc.get_referrers(self)&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
{{stub}}&lt;br /&gt;
You can use the Python Shell to interact with people from your database and test Gramps functions:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
! Gramps 3.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;gt; person = db.get_person_from_gramps_id(&amp;quot;I01284&amp;quot;)&lt;br /&gt;
 &amp;gt; from Utils import probably_alive&lt;br /&gt;
 &amp;gt; probably_alive(person, db, Date(1776, 7, 4))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Gramps 4.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;gt; person = db.get_person_from_gramps_id(&amp;quot;I01284&amp;quot;)&lt;br /&gt;
 &amp;gt; from gen.utils.alive import probably_alive&lt;br /&gt;
 &amp;gt; probably_alive(person, db, Date(1776, 7, 4))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Gramps 5.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;gt; person = db.get_person_from_gramps_id(&amp;quot;I01284&amp;quot;)&lt;br /&gt;
 &amp;gt; from gramps.gen.utils.alive import probably_alive&lt;br /&gt;
 &amp;gt; probably_alive(person, db, Date(1776, 7, 4))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You can also interact with the GUI:&lt;br /&gt;
&lt;br /&gt;
This following returns the Gtk Frame of the first Gramplet in the first column.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
! Gramps 3.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;gt; uistate.viewmanager.pages&lt;br /&gt;
 [&amp;lt;DataViews.GrampletView.GrampletView instance at 0xa0bd0ac&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.PersonView.PersonView instance at 0xa8f542c&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.RelationView.RelationshipView instance at 0xa8f562c&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.FamilyList.FamilyListView instance at 0xa8f5f8c&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.PedigreeView.PedigreeView instance at 0xa8fc5cc&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.EventView.EventView instance at 0xa8fc88c&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.SourceView.SourceView instance at 0xa8fcdcc&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.PlaceView.PlaceView instance at 0xa9070ec&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.MediaView.MediaView instance at 0xa9074ac&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.RepositoryView.RepositoryView instance at 0xa9077ac&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.NoteView.NoteView instance at 0xa907d8c&amp;gt;, &lt;br /&gt;
  &amp;lt;DataViews.GeoView.GeoView instance at 0xa90d0cc&amp;gt;]&lt;br /&gt;
 &amp;gt; uistate.viewmanager.pages[0]&lt;br /&gt;
 &amp;lt;DataViews.GrampletView.GrampletView instance at 0xa0bd0ac&amp;gt;&lt;br /&gt;
 &amp;gt; uistate.viewmanager.pages[0].columns[0].get_children()[0].get_children()[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Gramps 4.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Gramps 5.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;gt; uistate.viewmanager.pages[:]&lt;br /&gt;
 [&amp;lt;dashboardview.DashboardView object at 0x0000000008c9f4e0&amp;gt;, &amp;lt;persontreeview.PersonTreeView object at 0x0000000000a05748&amp;gt;, &amp;lt;relview.RelationshipView object at 0x000000000b1b6358&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This following returns a reference to a loaded Gramplet object on the Event view - useful when developing Gramplets. Note that the Events view must be navigated first, as main views are lazy loading in Gramps 4.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
! Gramps 4.x&lt;br /&gt;
| &amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; evtview = uistate.viewmanager.pages[uistate.viewmanager.page_lookup.get((5,0))]&lt;br /&gt;
&amp;gt; # list all TabGramplet objects loaded for Events view&lt;br /&gt;
&amp;gt; [child.get_title() for child in evtview.bottombar.get_children()]&lt;br /&gt;
['Gallery', 'Citations', 'Notes', 'Attributes', 'References', 'Event PlaceTitle Compare Gramplet']&lt;br /&gt;
&amp;gt; # get a reference to my custom Gramplet object&lt;br /&gt;
&amp;gt; eptcGramplet = evtview.bottombar.get_children()[5].pui&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Gramplets]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=94040</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=94040"/>
		<updated>2023-02-05T19:13:46Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Check the documentation and ask before filing a bug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search wiki and existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Sometimes the behavior being observed might seem odd, yet as-designed. So the first step is to search the wiki to see what the documented behavior is. If you're still not sure, ask the [https://gramps.discourse.group/ Gramps community on Discourse.]&lt;br /&gt;
&lt;br /&gt;
If it still appears to be a bug, perhaps the bug you want to report has been reported before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release of code, then the issue should be filed under the project that corresponds to the maintenance branch for that release. For example, a bug found in Gramps 5.1.0 should be filed under the '''Gramps 5.1.0''' project.&lt;br /&gt;
&lt;br /&gt;
*If the issue represents a problem with functionality that only exists in the master branch, or the problem exists in the master branch, but not any stable releases, then the issue should be filed under the '''Gramps Master''' project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification, it may help you to read the '''[[How to create a good bug report]]''' article.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. Mantis allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**The '''Gramps Master''' project should only be used by developers and testers of the latest code. It is a place for recording issues that only apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). There is only one &amp;quot;Gramps Master&amp;quot; project because there is only one master branch in the Git repository.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful Mantis bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ Mantis bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=94039</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=94039"/>
		<updated>2023-02-05T17:54:45Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Ask bug reporters to fill in system information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Perhaps the bug you want to report has been submitted before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release of code, then the issue should be filed under the project that corresponds to the maintenance branch for that release. For example, a bug found in Gramps 5.1.0 should be filed under the '''Gramps 5.1.0''' project.&lt;br /&gt;
&lt;br /&gt;
*If the issue represents a problem with functionality that only exists in the master branch, or the problem exists in the master branch, but not any stable releases, then the issue should be filed under the '''Gramps Master''' project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification, it may help you to read the '''[[How to create a good bug report]]''' article.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Select Profile&lt;br /&gt;
** Gramps runs on multiple operating systems, so it's helpful to know which operating system and version you are reporting an issue against. This is where you provide that information. Mantis allows you store multiple profiles in your Account so that you can pick the appropriate one, which is handy if you run Gramps on different system configurations.&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**The '''Gramps Master''' project should only be used by developers and testers of the latest code. It is a place for recording issues that only apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). There is only one &amp;quot;Gramps Master&amp;quot; project because there is only one master branch in the Git repository.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==Useful Mantis bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ Mantis bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=93679</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=93679"/>
		<updated>2022-11-06T22:50:42Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Clarify that maintenance branch should be used for contributions to public releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
#Report&lt;br /&gt;
#Quickreport&lt;br /&gt;
#Tool&lt;br /&gt;
#Importer&lt;br /&gt;
#Exporter&lt;br /&gt;
#Doc creator&lt;br /&gt;
#Plugin lib&lt;br /&gt;
#Map service&lt;br /&gt;
#Gramps View&lt;br /&gt;
#Relationships&lt;br /&gt;
#Gramplet&lt;br /&gt;
#Sidebar&lt;br /&gt;
#Database  (Introduced Gramps 5.x and greater)&lt;br /&gt;
#Rule  (Introduced Gramps 5.1.x and greater)&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_it_on_the_Gramps_mailing_list|Announce it on the Gramps mailing list]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the maintenance/gramps51 git branch, as the default is master branch for the developmental pre-release. (Currently gramps 5.2, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure, with the code for each addon in its own folder:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons addons] git repository holds built versions of the addons for each release of Gramps, and has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** /gramps42&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps50&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps51&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also [https://help.github.com/articles/generating-an-ssh-key/  Connecting to GitHub with SSH] will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that all three git repositories local locations are put into the same base directory and named with the repository names in order for the make.py script commands to work as shown. From the base directory, run the following commands to create a copy of each repository. If you want to use SSH;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you want to use a web url:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone https://github.com/gramps-project/addons.git addons&lt;br /&gt;
 git clone https://github.com/gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps51 maintenance branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps51 origin/maintenance/gramps51&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps52 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other prerequisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' built-in configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;5.1&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] is TOOL, GRAMPLET, REPORT, QUICKVIEW, IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, or RELCALC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '5.1',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation [https://github.com/gramps-project/gramps/gen/plug/_pluginreg.py here] in the comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are (gen/plug/_pluginreg.py):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '5.1',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List the Prerequistes your addon depends on ==&lt;br /&gt;
&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;depends_on = [&amp;quot;libwebconnect&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is a list of id's from other gpr files. This example will ensure that [[Addon:Web_Connect_Pack#Prerequisites|libwebconnect]] is loaded before your addon. If it can't be found, or you have a cycle, then your addons won't be loaded.&lt;br /&gt;
&lt;br /&gt;
example code used in the Addon:Web_Connect_Pack that references libwebconnect Prerequistes [https://github.com/gramps-project/addons-source/blob/1304b65a7d758bfe17339c26260473ac3e9c4061/RUWebConnectPack/RUWebPack.gpr.py#L17 RUWebPack.gpr.py#L17 ]&lt;br /&gt;
&lt;br /&gt;
This means that common Prerequistes can be shared between addons and that code sits in its own gpr/addon file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[] for addon prerequistes have a look at converting them to use &amp;quot;depends_on = &amp;quot;  like in the following addons&lt;br /&gt;
https://github.com/gramps-project/addons-source/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
https://github.com/gramps-project/gramps/search?utf8=%E2%9C%93&amp;amp;q=depends_on&amp;amp;type=&lt;br /&gt;
&lt;br /&gt;
which can be a comma separated list for multiple dependencies/prerequisites (so that addons that share prerequisites import the same library?) (maybe move spell check into an addon etc? tip of the day... possibilities...)&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
mentioned in the following&lt;br /&gt;
https://sourceforge.net/p/gramps/mailman/message/27070037/&lt;br /&gt;
''In your gpr file, you can have a line like:&lt;br /&gt;
&lt;br /&gt;
depends_on = [&amp;quot;libwebconnect&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
which is a list of id's from other gpr files. This example will ensure&lt;br /&gt;
that libwebconnect is loaded before your plugin. If it can't be found,&lt;br /&gt;
or you have a cycle, then your plugin won't be loaded.&lt;br /&gt;
&lt;br /&gt;
If it is a common function, perhaps libhtml is the right place to put&lt;br /&gt;
it, and you can put a depends_on on that.&lt;br /&gt;
&lt;br /&gt;
-Doug''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
example output is on terminal only:&lt;br /&gt;
&lt;br /&gt;
Cannot resolve the following plugin dependencies:&lt;br /&gt;
   Plugin 'UK Web Connect Pack' requires: ['libwebconnect']&lt;br /&gt;
&lt;br /&gt;
[](feature)  For plugins/addons if prerequisites not available display a page stating why/what is missing that includes the addon description and a url to the support page.&lt;br /&gt;
&lt;br /&gt;
[] Gramps CLI info &amp;quot;gramps -v&amp;quot; needs a section that list third-party addons with version numbers and if prerequisites have been met.&lt;br /&gt;
&lt;br /&gt;
[]update the Addon:Prerequisites Checker Gramplet to test for your Prerequisites.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your addon inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
README.md&lt;br /&gt;
extra_dir/*&lt;br /&gt;
help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps51 or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps51 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps52 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[5.1_Addons]] or if the addon is meant for a future release [[5.2_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Addon list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce the addon ==&lt;br /&gt;
Join the [[Contact#Mailing_lists|Gramps Mailing lists]] or [[Contact#Forum|Forum]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
{{man tip|When submitting an update the patch part of the version number  MAJOR.MINOR.PATCH  is updated during the addon build process e.g. 1.1.3  to 1.1.4|You can find this step in [https://github.com/gramps-project/addons-source/blob/master/make.py#L125 addons-source/make.py].[https://gramps.discourse.group/t/should-addons-pr-include-version-number-update/2591]}}&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many Gramps developers that do support addons in various ways (translations, triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=93434</id>
		<title>Using the bug tracker</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Using_the_bug_tracker&amp;diff=93434"/>
		<updated>2022-10-08T15:04:31Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add syntax code for Gramps Pull-Request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Using the bug tracker}}&lt;br /&gt;
{{man tip|The bug/issue tracker for Gramps|is located at the following URL: &amp;lt;code&amp;gt;https://www.gramps-project.org/bugs&amp;lt;/code&amp;gt;}}&lt;br /&gt;
This bug/issue tracker allows users and developers to log new issues and track them as they progress. Please take some time to read the issue tracker instructions below and read '''[[How to create a good bug report|how to create a good bug report]]'''. Also, have a look at '''[[Known_issues|known issues]]''' and '''[[Common_problems|common problems]]'''.&lt;br /&gt;
&lt;br /&gt;
== Quick recommendations ==&lt;br /&gt;
When composing a problem (bug) report for Gramps:&lt;br /&gt;
* Be '''''precise'''''&lt;br /&gt;
* Be '''''clear''':'' explain how to reproduce the problem, step by step, so others can reproduce the bug, or understand the request.&lt;br /&gt;
* Include only '''''one problem per report'''''&lt;br /&gt;
* Include any relevant links and '''''examples'''''&lt;br /&gt;
{{man tip|Before you create a &amp;quot;Bug&amp;quot; report...|Composing a bug report can involve a lot of research and writing effort. Save yourself from unnecessary work.&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;A solution or workaround might already exist in another bug report or in the forums.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;If you connot find anything resembling your issue, ask about it in one of the forums. The community will help you solve or isolate the problem.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
==Report a bug==&lt;br /&gt;
===1. Login===&lt;br /&gt;
To report a bug or raise a feature request, you must have a login account on the '''Gramps bug tracker''' ''([https://www.mantisbt.org/ powered by MantisBT])'':&lt;br /&gt;
* [https://bugs.gramps-project.org {{man button|Login}}] to your account at https://gramps-project.org/bugs/login_page.php , or;&lt;br /&gt;
* Select [https://gramps-project.org/bugs/signup_page.php {{man button|Signup for a new account}}] or visit the following link to create a new login account: https://gramps-project.org/bugs/signup_page.php .&lt;br /&gt;
&lt;br /&gt;
Due to periodic SPAMbot activity, New Account requests might require human pre-approval. Be aware that this means that it might take up to 12 hours before a confirmation email is sent when creating a user account. Only after clicking on the link in the confirmation email can you submit bugs. Your email address will be handled confidentially.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===2. Search existing bugs===&lt;br /&gt;
[[File:Search box for existing bugs.png|thumb|right|450px|Search Box]]&lt;br /&gt;
Perhaps the bug you want to report has been submitted before. To check this, click on [https://gramps-project.org/bugs/view_all_bug_page.php {{man button|View Issues}}]. The top of the page is reserved for filters, which you set. Normally the default filters are just fine. Under these filters, there is a {{man label|Search}} box. Enter the terms best describing the bug, and click {{man button|Apply Filter}} to search. If you have an error message, try pasting a part of the error, to see if it is has been reported already.&lt;br /&gt;
&lt;br /&gt;
If the bug is already reported, read over the bug report, and see if you can add to the information. If so, you can leave a note with extra information to help the developers.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===3. Submit new bug===&lt;br /&gt;
[[File:Report issue buttons Gramps bugs.png|thumb|right|450px|'Report Issue' buttons.]]&lt;br /&gt;
Click on one of the {{man label|Report Issue}} buttons, and enter the required information, see below on how to select the project to which the bug belongs. Be verbose, the developers are bad at mind reading. We shall mercilessly close the bugs which have no meaningful information at all, such as #{{bug|7126}}. Do not forget to list the Gramps version you are using. You can check this in Gramps by clicking in the Gramps program the Help menu, option About.&lt;br /&gt;
{{-}}&lt;br /&gt;
==== How to proceed ====&lt;br /&gt;
[[File:Dropdown-Choose-Project-GrampsBugtracker.png|thumb|right|450px|Choose Project - selection list]]&lt;br /&gt;
The first step in submitting an issue on the tracker is to determine which project it belongs to on the issue tracker from the '''Select Project''' box, use the '''Choose Project''' drop down list to select the &amp;quot;project&amp;quot; for the bugs. &amp;quot;Projects&amp;quot; are a way to categorize issues. There are two types of projects in the issue tracker, '''Feature Requests''' and '''Gramps''':&lt;br /&gt;
&lt;br /&gt;
*The '''Feature Requests''' project is a place for recording requests for new features. &lt;br /&gt;
**If the issue represents functionality that does not currently exist in Gramps, then the issue should be filed under the '''Feature Requests''' project.&lt;br /&gt;
&lt;br /&gt;
*The '''Gramps''' project is a place for recording all issues with Gramps. &lt;br /&gt;
**If the issue represents a problem with functionality that has been released in a stable release of code, then the issue should be filed under the project that corresponds to the maintenance branch for that release. For example, a bug found in Gramps 5.1.0 should be filed under the '''Gramps 5.1.0''' project.&lt;br /&gt;
&lt;br /&gt;
*If the issue represents a problem with functionality that only exists in the master branch, or the problem exists in the master branch, but not any stable releases, then the issue should be filed under the '''Gramps Master''' project.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Enter Issue Details ====&lt;br /&gt;
[[File:Enter Issue Details page Gramps bugs.png|thumb|right|550px|Enter Issue Details - page]]&lt;br /&gt;
The {{man label|Enter Issue Details}} page is where you share with the developers what your issue or feature request is.&lt;br /&gt;
&lt;br /&gt;
Try and complete all the relevant sections as well as you can and be prepared to answer follow up questions if your report needs clarification, it may help you to read the '''[[How to create a good bug report]]''' article.&lt;br /&gt;
&lt;br /&gt;
===== Filling out the page =====&lt;br /&gt;
&lt;br /&gt;
* Product Version&lt;br /&gt;
**The projects with names that look like '''Gramps x.x.X''' are where issues are reported that apply specifically to a maintenance branch (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). A separate project exists for each maintenance branch.&lt;br /&gt;
**The '''Gramps Master''' project should only be used by developers and testers of the latest code. It is a place for recording issues that only apply to the master branch in Git (see [[Brief_introduction_to_Git#Types_of_branches|Types of Branches]]). There is only one &amp;quot;Gramps Master&amp;quot; project because there is only one master branch in the Git repository.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Useful Mantis bug tracker Syntax codes==&lt;br /&gt;
&lt;br /&gt;
The following are useful [http://www.mantisbt.org/ Mantis bug tracker] syntax codes you can use:&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;'' before a bug number writes a link to the bug. eg: ''&amp;lt;code&amp;gt;#1&amp;lt;/code&amp;gt;'' becomes {{bug|1}}&lt;br /&gt;
* Use ''&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;'' before a user name to mention a person (note: user names with embedded spaces are not supported)&lt;br /&gt;
* Using ''&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;'' before a comment number writes a link to the comment, same as : ''&amp;lt;code&amp;gt;{url}#c{comment number}&amp;lt;/code&amp;gt;''. eg: ''&amp;lt;code&amp;gt;~3&amp;lt;/code&amp;gt;'' becomes [https://gramps-project.org/bugs/view.php?id=1#c3]&lt;br /&gt;
* To link a GitHub Pull Request in the bug tracker, use p:gramps:nnnn: where nnnn is the PR number.&lt;br /&gt;
&lt;br /&gt;
=== Limited HTML tags ===&lt;br /&gt;
* A [https://github.com/mantisbt/mantisbt/blob/55fb5721ea7d980557da484390db5c6003b63cd0/config_defaults_inc.php#L1979 limited set] of [https://www.w3schools.com/tags/ HTML tags] can be used in the text field:&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;p&amp;amp;gt; &amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;  to define a paragraph.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;li&amp;amp;gt;&amp;lt;/code&amp;gt; to defines a [https://www.w3schools.com/tags/tag_li.asp list item] used with:&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ul&amp;amp;gt;&amp;lt;/code&amp;gt; unordered lists&lt;br /&gt;
***&amp;lt;code&amp;gt; &amp;amp;lt;ol&amp;amp;gt;&amp;lt;/code&amp;gt; ordered lists&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;br&amp;amp;gt;&amp;lt;/code&amp;gt; to insert a single line break.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;pre&amp;amp;gt; &amp;amp;lt;/pre&amp;amp;gt;&amp;lt;/code&amp;gt; to add preformatted text, that is displayed in a fixed-width font, and it preserves both spaces and line breaks.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;i&amp;amp;gt;  &amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt; usually displays text in ''italics''.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;b&amp;amp;gt; &amp;amp;lt;/b&amp;amp;gt;&amp;lt;/code&amp;gt; shows '''bold''' text&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;u&amp;amp;gt; &amp;amp;lt;/u&amp;amp;gt;&amp;lt;/code&amp;gt; Underline a misspelled word&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;em&amp;amp;gt; &amp;amp;lt;/em&amp;amp;gt;&amp;lt;/code&amp;gt; It renders as emphasized text.&lt;br /&gt;
**&amp;lt;code&amp;gt; &amp;amp;lt;strong&amp;amp;gt;&amp;lt;/code&amp;gt;  It defines important text.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[How to create a good bug report]]&lt;br /&gt;
* [[Known issues]]&lt;br /&gt;
* [[Common problems]]&lt;br /&gt;
* Help the Gramps project [[Bug triage]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_2&amp;diff=93306</id>
		<title>Gramps 5.1 Wiki Manual - Reports - part 2</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_2&amp;diff=93306"/>
		<updated>2022-09-11T20:14:00Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Remove extraneous column&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Reports - part 1|Gramps_5.1_Wiki_Manual_-_Reports_-_part_3|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Reports - part 2}}&lt;br /&gt;
{{#vardefine:chapter|13.2}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
This section describes the substitution values that can be used in the different reports available in Gramps.&lt;br /&gt;
= Substitution Values =&lt;br /&gt;
&lt;br /&gt;
Many of the [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Graphical_Reports|graphical reports]] allow you to customize the information that is displayed on the reports. Variable substitution is the method that is used to substitute a particular symbol (key) for specific information about the person in the database.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Substitution Keys&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Will show as: (the person is alive)&lt;br /&gt;
|-&lt;br /&gt;
!Line 1&lt;br /&gt;
|&amp;lt;code&amp;gt;$n&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 1&lt;br /&gt;
|Smith, Edwin Michael&lt;br /&gt;
|-&lt;br /&gt;
!Line 2&lt;br /&gt;
|&amp;lt;code&amp;gt;b. $b{ at $B}&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 2&lt;br /&gt;
|b. 1961-05-24 at San Jose, Santa Clara Co., CA&lt;br /&gt;
|-&lt;br /&gt;
!Line 3&lt;br /&gt;
|&amp;lt;code&amp;gt;d. $d&amp;lt; at &amp;gt;$D&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 3&lt;br /&gt;
|d.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the next section a list of all available variables (The Substitution Keys) follows.  &lt;br /&gt;
* If you wish to display names, date, or place information differently, you may use [[#Format Strings|Format Strings]] to accomplish this.&lt;br /&gt;
* There are also [[#Control Variables|Control Variables]] to display special characters (like the dollar sign).&lt;br /&gt;
* You can also use [[#Grouping|Grouping]] to optionally display information.  In the example above '''Line 2''', uses grouping to display &amp;lt;code&amp;gt;' at '&amp;lt;/code&amp;gt; only when the birth place is known.&lt;br /&gt;
* Along with [[#Events|Events]] you can print almost anything.&lt;br /&gt;
* Finally, [[#Separators|Separators]], to make your life complete.  In the example above '''Line 3''', uses this to display &amp;lt;code&amp;gt;' at '&amp;lt;/code&amp;gt; only when both the birth date and place is known.&lt;br /&gt;
&lt;br /&gt;
== The Substitution Keys ==&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Personal variables&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Marital variables&lt;br /&gt;
|-&lt;br /&gt;
!$n&lt;br /&gt;
|Displays the person's name&lt;br /&gt;
!$s&lt;br /&gt;
|Displays the name of the person's spouse&lt;br /&gt;
|-&lt;br /&gt;
!$i&lt;br /&gt;
|Displays the Gramps ID for the person.&lt;br /&gt;
!$j&lt;br /&gt;
|Displays the Gramps ID for the marriage.&lt;br /&gt;
|-&lt;br /&gt;
!$b&lt;br /&gt;
|Displays the person's date of birth  &lt;br /&gt;
!$m&lt;br /&gt;
|Displays the marriage date of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$B&lt;br /&gt;
|Displays the person's place of birth  &lt;br /&gt;
!$M&lt;br /&gt;
|Displays the place of the marriage of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$d&lt;br /&gt;
|Displays the person's date of death  &lt;br /&gt;
!$v&lt;br /&gt;
|Displays the divorce date of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$D&lt;br /&gt;
|Displays the person's place of death  &lt;br /&gt;
!$V&lt;br /&gt;
|Displays the place of the divorce of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$a&lt;br /&gt;
|Displays an attribute about the person.&lt;br /&gt;
see [[#Attributes|Attributes]] for more&lt;br /&gt;
!$u&lt;br /&gt;
|Displays an attribute about the marriage.&lt;br /&gt;
see [[#Attributes|Attributes]] for more&lt;br /&gt;
|-&lt;br /&gt;
!$e&lt;br /&gt;
|Displays event information about the person.&lt;br /&gt;
See [[#Events|Events]] for more&lt;br /&gt;
!$t&lt;br /&gt;
|Displays an event information about the marriage.&lt;br /&gt;
See [[#Events|Events]] for more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All of the Marital variables are defined by the person's preferred spouse in Gramps. If the person has never been married, then these variables will not display anything.&lt;br /&gt;
&lt;br /&gt;
==== Other Substitution Keys ====&lt;br /&gt;
* &amp;lt;code&amp;gt;$T&amp;lt;/code&amp;gt; Displays Todays date.&lt;br /&gt;
&lt;br /&gt;
=== Default displayed formats ===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Variables&lt;br /&gt;
!Display format&lt;br /&gt;
|-&lt;br /&gt;
!$n $s&lt;br /&gt;
|Names will be displayed as set in 'Name format:' on the Display tab in Gramps preferences&lt;br /&gt;
|-&lt;br /&gt;
!$B $D $M $V&lt;br /&gt;
|Places will display the Place title by default&lt;br /&gt;
|-&lt;br /&gt;
!$b $d $m $v $T&lt;br /&gt;
|Dates will be displayed as set in 'Date format:' on the Display tab in Gramps preferences&lt;br /&gt;
|-&lt;br /&gt;
!$e $t&lt;br /&gt;
|Events will display the description by default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated variables ===&lt;br /&gt;
&lt;br /&gt;
Some of the old variables were deprecated because [[#Format Strings|Format Strings]] have replaced them. So here is a list of those variables and how to achieve their results:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Old Variable&lt;br /&gt;
!How to display it now&lt;br /&gt;
!What is displayed&lt;br /&gt;
|-&lt;br /&gt;
|$f&lt;br /&gt;
|$n&lt;br /&gt;
|Name - as by Gramps name display under Preferences&lt;br /&gt;
|-&lt;br /&gt;
|$n&lt;br /&gt;
|$n(g f)&lt;br /&gt;
|Name - FirstName LastName&lt;br /&gt;
|-&lt;br /&gt;
|$N&lt;br /&gt;
|$n(f, g)&lt;br /&gt;
|Name - LastName, FirstName (note the explicit comma)&lt;br /&gt;
|-&lt;br /&gt;
|$nC&lt;br /&gt;
|$n(g F)&lt;br /&gt;
|Name - FirstName LastName in UPPER case&lt;br /&gt;
|-&lt;br /&gt;
|$NC&lt;br /&gt;
|$n(F, g)&lt;br /&gt;
|Name - LastName in UPPER case, FirstName&lt;br /&gt;
|-&lt;br /&gt;
|$by&lt;br /&gt;
|$b(yyyy)&lt;br /&gt;
|Date of birth, year only&lt;br /&gt;
|-&lt;br /&gt;
|$dy&lt;br /&gt;
|$d(yyyy)&lt;br /&gt;
|Date of death, year only&lt;br /&gt;
|-&lt;br /&gt;
|$my&lt;br /&gt;
|$m(yyyy)&lt;br /&gt;
|Date of preferred marriage, year only&lt;br /&gt;
|-&lt;br /&gt;
|$p&lt;br /&gt;
|$s&lt;br /&gt;
|Preferred spouse's name as by Gramps name display under Preferences&lt;br /&gt;
|-&lt;br /&gt;
|$s&lt;br /&gt;
|$s(g f)&lt;br /&gt;
|Preferred spouse's name - FirstName LastName&lt;br /&gt;
|-&lt;br /&gt;
|$S&lt;br /&gt;
|$s(f, g)&lt;br /&gt;
|Preferred spouse's name - LastName, FirstName&lt;br /&gt;
|-&lt;br /&gt;
|$sC&lt;br /&gt;
|$s(g F)&lt;br /&gt;
|Preferred spouse's name - FirstName LastName in UPPER case&lt;br /&gt;
|-&lt;br /&gt;
|$SC&lt;br /&gt;
|$s(F, g)&lt;br /&gt;
|Preferred spouse's name - LastName in UPPER case, FirstName&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format Strings ==&lt;br /&gt;
&lt;br /&gt;
Format strings are used to display names and dates differently than those assigned under Gramps Preferences. Here is the syntax for a format string:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''(format string)&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'nsijbmBMdvDVauet'&lt;br /&gt;
&lt;br /&gt;
A format string is any text, separators or format codes (defined below) to display information about the person.&lt;br /&gt;
&lt;br /&gt;
=== Formatting names ===&lt;br /&gt;
&lt;br /&gt;
For names &amp;lt;code&amp;gt;($n $s)&amp;lt;/code&amp;gt; you may use the following formatting codes to display the name differently.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!t&lt;br /&gt;
|Title&lt;br /&gt;
!f&lt;br /&gt;
|Given name&lt;br /&gt;
|-&lt;br /&gt;
!x&lt;br /&gt;
|Common name. Call name if existing, otherwise first first name&lt;br /&gt;
!c&lt;br /&gt;
|Call name&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Nick name&lt;br /&gt;
!s&lt;br /&gt;
|Suffix&lt;br /&gt;
|-&lt;br /&gt;
!l&lt;br /&gt;
|Surname&lt;br /&gt;
!g&lt;br /&gt;
|Family nickname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These codes can be upper-cased to uppercase the result.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!Displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$n(L, f) ($n(c)), $n(L, f){ ($n(c))}&lt;br /&gt;
$s(f l s)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;SMITH, Edwin Michael (), SMITH, Edwin Michael&lt;br /&gt;
Janice Ann Adams&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{man note|Note:|If you want to print a character 'c' within the format string (or any one of the other format codes), you will need to first add a &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt; in front of it. See [[#Control Variables|Control Variables]] for more.}}&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|The curly brackets &amp;lt;code&amp;gt;{ }&amp;lt;/code&amp;gt; are used to hide information. Here it is used around &amp;lt;code&amp;gt;' ($n(c))'&amp;lt;/code&amp;gt; to not display &amp;lt;code&amp;gt;' ()'&amp;lt;/code&amp;gt; if the person does not have a call name. See [[#Grouping|Grouping]] for more.}}&lt;br /&gt;
&lt;br /&gt;
=== Formatting Dates ===&lt;br /&gt;
For all of the date variables &amp;lt;code&amp;gt;($b $d $m $v)&amp;lt;/code&amp;gt; you may use the following formatting codes:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!yyyy&lt;br /&gt;
|The year as a four digit number&lt;br /&gt;
!yyy&lt;br /&gt;
|The year, with a minimum of three digits&lt;br /&gt;
|-&lt;br /&gt;
!yy&lt;br /&gt;
|The year, from 00 to 99&lt;br /&gt;
!y&lt;br /&gt;
|The year, from 0 to 99&lt;br /&gt;
|-&lt;br /&gt;
!mmmm&amp;lt;BR&amp;gt;&lt;br /&gt;
'''MMMM'''&lt;br /&gt;
|The full name of the month&amp;lt;BR&amp;gt;&lt;br /&gt;
The full name IN CAPS&lt;br /&gt;
!mmm&amp;lt;BR&amp;gt;&lt;br /&gt;
'''MMM'''&lt;br /&gt;
|The abbreviated name of the month&amp;lt;BR&amp;gt;&lt;br /&gt;
The abbreviated name IN CAPS&lt;br /&gt;
|-&lt;br /&gt;
!mm&lt;br /&gt;
|The month, from 00 to 12&lt;br /&gt;
!m&lt;br /&gt;
|The month, from 0 to 12&lt;br /&gt;
|-&lt;br /&gt;
!dd&lt;br /&gt;
|The day, from 00 to 31&lt;br /&gt;
!d&lt;br /&gt;
|The day, from 0 to 31&lt;br /&gt;
|-&lt;br /&gt;
!o&lt;br /&gt;
|The date type (modifier)&lt;br /&gt;
!&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(mmm-dd yy)&lt;br /&gt;
$m(yyyy/mmm/d)&lt;br /&gt;
$b(mmm-dd yy)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;May-24 61&lt;br /&gt;
1995/May/27&lt;br /&gt;
Jun-04 85&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{man warn| For date types (modifier) |Only &amp;quot;Before&amp;quot;, &amp;quot;After&amp;quot;, and &amp;quot;About&amp;quot; are supported at this time.  all others will not display anything.&amp;lt;BR&amp;gt;And for date span and date ranges, only the starting (first) date is displayed.}}&lt;br /&gt;
&lt;br /&gt;
=== Formatting Places ===&lt;br /&gt;
For all of the place variables &amp;lt;code&amp;gt;($B $D $M $V)&amp;lt;/code&amp;gt; you may use the following formatting codes:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!e&lt;br /&gt;
|Street&lt;br /&gt;
!l&lt;br /&gt;
|Locality&lt;br /&gt;
|-&lt;br /&gt;
!c&lt;br /&gt;
|City&lt;br /&gt;
!u&lt;br /&gt;
|County&lt;br /&gt;
|-&lt;br /&gt;
!s&lt;br /&gt;
|State&lt;br /&gt;
!p&lt;br /&gt;
|Postal Code&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Country&lt;br /&gt;
!t&lt;br /&gt;
|Title&lt;br /&gt;
|-&lt;br /&gt;
!x&lt;br /&gt;
|Longitude&lt;br /&gt;
!y&lt;br /&gt;
|Latitude&lt;br /&gt;
|}&lt;br /&gt;
These codes can be upper-cased to uppercase the result. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$B&lt;br /&gt;
$B(c, s, N)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;St Judes Hospital&lt;br /&gt;
Carmel, IN, USA&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rules for format strings ===&lt;br /&gt;
&lt;br /&gt;
* Anything will print inside a format string&lt;br /&gt;
* You need to use [[#Control Variables|Control Variables]] to display things like &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt; and format codes&lt;br /&gt;
* Separators can be within format strings.&lt;br /&gt;
* At least ONE format code has to display something for the ENTIRE format string to display&lt;br /&gt;
&lt;br /&gt;
For examples:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$n(f l)&lt;br /&gt;
b. $b {at $B&lt;br /&gt;
{d. $d $D&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;Edwin Michael Smith&lt;br /&gt;
b. 1961-05-24 at San Jose, Santa Clara Co., CA&amp;lt;/pre&amp;gt;{{man label|The person is still alive (or has no information present) so the line was removed.}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Control Variables ==&lt;br /&gt;
&lt;br /&gt;
Control variables allow you to print characters that are special to Substitution values within a display.&lt;br /&gt;
&lt;br /&gt;
For example the dollar character '$' is used to note the start of a variable. If you wish to print a dollar character you would use a control character like '&amp;amp;#92;$'&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Control Variables&lt;br /&gt;
!Result&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;$&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'$'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;amp;#92;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;(&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'('&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;)&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;{&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'{'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;}&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'}'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;lt;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;lt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;gt;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;gt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Basically anything that comes after a &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt; will be printed.&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|When you are inside a format string, you may need to use this to display a character that would normally be a format code.}}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code:&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(m hi mom)&lt;br /&gt;
$b(m hi \mo\m)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;5 hi 5o5&lt;br /&gt;
5 hi mom&amp;lt;/pre&amp;gt;{{man label|As this person was born on the fifth month.}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grouping ==&lt;br /&gt;
&lt;br /&gt;
There are instances where you do not want certain text to be displayed. &lt;br /&gt;
&lt;br /&gt;
Take the example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting Code&lt;br /&gt;
!Only date is known&lt;br /&gt;
!Only place is known&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;died on $d at $D&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on 1975-06-26 at&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on at Reno, Washoe Co., NV&amp;lt;code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Neither of these displayed results are very acceptable.&lt;br /&gt;
&lt;br /&gt;
But with groups (denoted by '''&amp;amp;#123;&amp;amp;#125;'''), you can optionally print information if a variable within contains information.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting Code&lt;br /&gt;
!Only date is known&lt;br /&gt;
!Only place is known&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;died{ on $d}{ at $D}&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on 1975-06-26&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died at Reno, Washoe Co., NV&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Which is a more preferable displayed result than in the first example.&lt;br /&gt;
&lt;br /&gt;
=== Rules for groups ===&lt;br /&gt;
&lt;br /&gt;
A group will only display if there is at least one variable that displays something. So if a group only has text and/or variables where the information is not known, the entire group will not print.&lt;br /&gt;
&lt;br /&gt;
Groups can also be nested. If this happens (like below), the outer group will only display if there is at least one variable that displays something within the outer group or any of the sub groups.&lt;br /&gt;
&lt;br /&gt;
Groups can also be used to remove text.  If you wish to not display the entire line, &amp;lt;code&amp;gt;'-'&amp;lt;/code&amp;gt; at the start of a line will remove the entire line from the display if the above rule is true.&lt;br /&gt;
&lt;br /&gt;
If you do not wish to have the display code above (for death information) displayed (the person is alive, or you do not yet know the information), modify the code to look like:&lt;br /&gt;
* &amp;lt;code&amp;gt;-{died{ on $d}{ at $D}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
This will hide &amp;lt;code&amp;gt;'('&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt; if the divorce information is not known (or still married).&lt;br /&gt;
* &amp;lt;code&amp;gt;m. $m $M {- ($v(yyyy))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only display some spouse information if married or remove the entire line if never married:&lt;br /&gt;
* &amp;lt;code&amp;gt;{$s $m(yyyy) {- $v(\(yyyy\))}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
Attributes do not have a format string. Instead the attribute name is placed inside &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;. Here is the syntax for an attribute:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''[attribute name]&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'au'&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$a[Profession]&lt;br /&gt;
$a[Social Security Number]&lt;br /&gt;
$a[Total \$ bequeathed]&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;Programmer&lt;br /&gt;
7A3-29-F1C6&lt;br /&gt;
3.00USD&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
Events have the same starting structure as attributes, &amp;lt;code&amp;gt;$e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$t&amp;lt;/code&amp;gt; and the event name in &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt; but events have an extra format string after the name to display the description, date, place, id, and attributes associated with it. Each of these items can be displayed with a , a 'n', 'd', 'D', 'i', and 'a' respectively in the format string. Here is the syntax for an event:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''[attribute name](format string)&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'et'&lt;br /&gt;
&lt;br /&gt;
=== Event format strings ===&lt;br /&gt;
&lt;br /&gt;
The Event format string is used to display information about the event. Here are the format codes to display parts of the event:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code &lt;br /&gt;
!displays&lt;br /&gt;
!&lt;br /&gt;
!Formatting code &lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Description&lt;br /&gt;
|&lt;br /&gt;
!i&lt;br /&gt;
|Event ID&lt;br /&gt;
|-&lt;br /&gt;
!d&lt;br /&gt;
|Event Date&amp;amp;#42;&lt;br /&gt;
|&lt;br /&gt;
!D&lt;br /&gt;
|Event Place&amp;amp;#42;&lt;br /&gt;
|-&lt;br /&gt;
!a&lt;br /&gt;
|An attributes for the event&amp;amp;#42;&amp;amp;#42;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;These variables can themselves have format strings. Date and a place can be formatted with format string as defined in [[#Format strings|Format strings]].&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;&amp;amp;#42;Attribute needs to have the attribute name in [] and are formatted as above.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$e[First Communion](d(yyyy-mm-d))&lt;br /&gt;
$e[Bar Mitzvah](n&amp;amp;lt; at &amp;amp;gt; D)&lt;br /&gt;
$e[Birth](d(yyyy mm/dd) D)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;2009-11-6&lt;br /&gt;
Jerry's Bar Mitzah at Opas house&lt;br /&gt;
2007 05/23 Grandmothers house&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
And:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(yyyy-Mmm-dd)&lt;br /&gt;
$M&amp;lt;/pre&amp;gt;&lt;br /&gt;
|is the same as&lt;br /&gt;
|&amp;lt;pre&amp;gt;$e[Birth](d(yyyy-Mmm-dd))&lt;br /&gt;
$t[Marriage](D)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes for attributes and events ===&lt;br /&gt;
&lt;br /&gt;
Attribute and event names are mandatory. &amp;lt;code&amp;gt;'$a'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;'$a[]'&amp;lt;/code&amp;gt; will not display anything.&lt;br /&gt;
&lt;br /&gt;
Attributes and event names may have special characters within them. Most notably &amp;lt;code&amp;gt;']'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt;. If this is the case, you will need to use [[#Control Variables|Control Variables]]&lt;br /&gt;
&lt;br /&gt;
== Separators ==&lt;br /&gt;
&lt;br /&gt;
Separators are special 'text only' groups inside &amp;lt;code&amp;gt;'&amp;amp;lt;'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'&amp;amp;gt;'&amp;lt;/code&amp;gt; that conditionally display a separator (like &amp;lt;code&amp;gt;', '&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;' - '&amp;lt;/code&amp;gt;) between two groups, variables, format codes or text.&lt;br /&gt;
&lt;br /&gt;
Separators are displayed conditionally depending on these rules:&lt;br /&gt;
* A variable that does '''not''' display anything will remove itself and a separator that is to the left of it from the display line only.&lt;br /&gt;
* If there is not a separator to the left, the same variable will remove itself and a separator that is to the right of it from the displayed line.&lt;br /&gt;
* If there are two separators together, the left one will be removed from the display line and the right is kept.&lt;br /&gt;
* Separators at the start or end of the display line (or format strings) are removed.&lt;br /&gt;
&lt;br /&gt;
Take this example formatting code:&lt;br /&gt;
* &amp;lt;code&amp;gt;$s(f l s)&amp;amp;lt;, &amp;amp;gt;$m(yyyy)&amp;amp;lt; @ &amp;amp;gt;$M&amp;amp;lt; - &amp;amp;gt;$v(&amp;amp;#92;(yyyy&amp;amp;#92;))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are some things that may happen:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Possibility&lt;br /&gt;
!Outcome&lt;br /&gt;
|-&lt;br /&gt;
|If '''none''' of the variables are known&lt;br /&gt;
|None of the separators will display&lt;br /&gt;
|-&lt;br /&gt;
|If only one variable '''is''' known&lt;br /&gt;
|Only that variable will print. No separators will print.&lt;br /&gt;
|-&lt;br /&gt;
|If only the spouse's name '''is not''' known&lt;br /&gt;
|The first separator will not display&lt;br /&gt;
|-&lt;br /&gt;
|If only the marriage date '''is not''' known&lt;br /&gt;
|The first separator does not display. We will be left with:&lt;br /&gt;
Jane Doe&amp;amp;lt; - &amp;amp;gt;{ … }And only the divorce date needs to be known to print the second separator.&lt;br /&gt;
|-&lt;br /&gt;
|If only the divorce date '''is not''' known&lt;br /&gt;
|the second separator will not display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Separators can be inside format strings:&lt;br /&gt;
* &amp;lt;code&amp;gt;$n(&amp;amp;lt;0&amp;amp;gt;T&amp;amp;lt; &amp;amp;gt;L&amp;amp;lt;, &amp;amp;gt;f&amp;amp;lt; &amp;amp;gt;s)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlike groups, separators can not cross over/out of format strings. So the separator &amp;lt;code&amp;gt;&amp;amp;lt;0&amp;amp;gt;&amp;lt;/code&amp;gt; will NEVER display. No matter what is on the left hand side of the variable.&lt;br /&gt;
&lt;br /&gt;
Here is a useful example:&lt;br /&gt;
* &amp;lt;code&amp;gt;{({b. $b}&amp;lt;, &amp;gt;{d. $d})}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|Only print the outside () if either the birth or death date displays&amp;lt;br&amp;gt;&lt;br /&gt;
Only displays the center separator if both dates are known.&amp;lt;br&amp;gt;&lt;br /&gt;
So here are some thing that could display&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|or the line does not print at all.&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| We will not see things like:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(, )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b., )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(, d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(, d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b., d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Reports - part 1|Gramps_5.1_Wiki_Manual_-_Reports_-_part_3|5.1}}&lt;br /&gt;
{{languages|Gramps 5.1 Wiki Manual - Reports - part 2}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_2&amp;diff=93305</id>
		<title>Gramps 5.1 Wiki Manual - Reports - part 2</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_2&amp;diff=93305"/>
		<updated>2022-09-11T20:08:01Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add header to table describing fields&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Reports - part 1|Gramps_5.1_Wiki_Manual_-_Reports_-_part_3|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Reports - part 2}}&lt;br /&gt;
{{#vardefine:chapter|13.2}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
This section describes the substitution values that can be used in the different reports available in Gramps.&lt;br /&gt;
= Substitution Values =&lt;br /&gt;
&lt;br /&gt;
Many of the [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Graphical_Reports|graphical reports]] allow you to customize the information that is displayed on the reports. Variable substitution is the method that is used to substitute a particular symbol (key) for specific information about the person in the database.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Substitution Keys&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Will show as: (the person is alive)&lt;br /&gt;
|-&lt;br /&gt;
!Line 1&lt;br /&gt;
|&amp;lt;code&amp;gt;$n&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 1&lt;br /&gt;
|Smith, Edwin Michael&lt;br /&gt;
|-&lt;br /&gt;
!Line 2&lt;br /&gt;
|&amp;lt;code&amp;gt;b. $b{ at $B}&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 2&lt;br /&gt;
|b. 1961-05-24 at San Jose, Santa Clara Co., CA&lt;br /&gt;
|-&lt;br /&gt;
!Line 3&lt;br /&gt;
|&amp;lt;code&amp;gt;d. $d&amp;lt; at &amp;gt;$D&amp;lt;/code&amp;gt;&lt;br /&gt;
!Line 3&lt;br /&gt;
|d.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the next section a list of all available variables (The Substitution Keys) follows.  &lt;br /&gt;
* If you wish to display names, date, or place information differently, you may use [[#Format Strings|Format Strings]] to accomplish this.&lt;br /&gt;
* There are also [[#Control Variables|Control Variables]] to display special characters (like the dollar sign).&lt;br /&gt;
* You can also use [[#Grouping|Grouping]] to optionally display information.  In the example above '''Line 2''', uses grouping to display &amp;lt;code&amp;gt;' at '&amp;lt;/code&amp;gt; only when the birth place is known.&lt;br /&gt;
* Along with [[#Events|Events]] you can print almost anything.&lt;br /&gt;
* Finally, [[#Separators|Separators]], to make your life complete.  In the example above '''Line 3''', uses this to display &amp;lt;code&amp;gt;' at '&amp;lt;/code&amp;gt; only when both the birth date and place is known.&lt;br /&gt;
&lt;br /&gt;
== The Substitution Keys ==&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Personal variables&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;|Marital variables&lt;br /&gt;
|-&lt;br /&gt;
!$n&lt;br /&gt;
|Displays the person's name&lt;br /&gt;
!$s&lt;br /&gt;
|Displays the name of the person's spouse&lt;br /&gt;
|-&lt;br /&gt;
!$i&lt;br /&gt;
|Displays the Gramps ID for the person.&lt;br /&gt;
!$j&lt;br /&gt;
|Displays the Gramps ID for the marriage.&lt;br /&gt;
|-&lt;br /&gt;
!$b&lt;br /&gt;
|Displays the person's date of birth  &lt;br /&gt;
!$m&lt;br /&gt;
|Displays the marriage date of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$B&lt;br /&gt;
|Displays the person's place of birth  &lt;br /&gt;
!$M&lt;br /&gt;
|Displays the place of the marriage of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$d&lt;br /&gt;
|Displays the person's date of death  &lt;br /&gt;
!$v&lt;br /&gt;
|Displays the divorce date of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$D&lt;br /&gt;
|Displays the person's place of death  &lt;br /&gt;
!$V&lt;br /&gt;
|Displays the place of the divorce of the person and the spouse.&lt;br /&gt;
|-&lt;br /&gt;
!$a&lt;br /&gt;
|Displays an attribute about the person.&lt;br /&gt;
see [[#Attributes|Attributes]] for more&lt;br /&gt;
!$u&lt;br /&gt;
|Displays an attribute about the marriage.&lt;br /&gt;
see [[#Attributes|Attributes]] for more&lt;br /&gt;
|-&lt;br /&gt;
!$e&lt;br /&gt;
|Displays event information about the person.&lt;br /&gt;
See [[#Events|Events]] for more&lt;br /&gt;
!$t&lt;br /&gt;
|Displays an event information about the marriage.&lt;br /&gt;
See [[#Events|Events]] for more&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All of the Marital variables are defined by the person's preferred spouse in Gramps. If the person has never been married, then these variables will not display anything.&lt;br /&gt;
&lt;br /&gt;
==== Other Substitution Keys ====&lt;br /&gt;
* &amp;lt;code&amp;gt;$T&amp;lt;/code&amp;gt; Displays Todays date.&lt;br /&gt;
&lt;br /&gt;
=== Default displayed formats ===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Variables&lt;br /&gt;
!Display format&lt;br /&gt;
|-&lt;br /&gt;
!$n $s&lt;br /&gt;
|Names will be displayed as set in 'Name format:' on the Display tab in Gramps preferences&lt;br /&gt;
|-&lt;br /&gt;
!$B $D $M $V&lt;br /&gt;
|Places will display the Place title by default&lt;br /&gt;
|-&lt;br /&gt;
!$b $d $m $v $T&lt;br /&gt;
|Dates will be displayed as set in 'Date format:' on the Display tab in Gramps preferences&lt;br /&gt;
|-&lt;br /&gt;
!$e $t&lt;br /&gt;
|Events will display the description by default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated variables ===&lt;br /&gt;
&lt;br /&gt;
Some of the old variables were deprecated because [[#Format Strings|Format Strings]] have replaced them. So here is a list of those variables and how to achieve their results:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Old Variable&lt;br /&gt;
!How to display it now&lt;br /&gt;
!What is displayed&lt;br /&gt;
|-&lt;br /&gt;
|$f&lt;br /&gt;
|$n&lt;br /&gt;
|Name - as by Gramps name display under Preferences&lt;br /&gt;
|-&lt;br /&gt;
|$n&lt;br /&gt;
|$n(g f)&lt;br /&gt;
|Name - FirstName LastName&lt;br /&gt;
|-&lt;br /&gt;
|$N&lt;br /&gt;
|$n(f, g)&lt;br /&gt;
|Name - LastName, FirstName (note the explicit comma)&lt;br /&gt;
|-&lt;br /&gt;
|$nC&lt;br /&gt;
|$n(g F)&lt;br /&gt;
|Name - FirstName LastName in UPPER case&lt;br /&gt;
|-&lt;br /&gt;
|$NC&lt;br /&gt;
|$n(F, g)&lt;br /&gt;
|Name - LastName in UPPER case, FirstName&lt;br /&gt;
|-&lt;br /&gt;
|$by&lt;br /&gt;
|$b(yyyy)&lt;br /&gt;
|Date of birth, year only&lt;br /&gt;
|-&lt;br /&gt;
|$dy&lt;br /&gt;
|$d(yyyy)&lt;br /&gt;
|Date of death, year only&lt;br /&gt;
|-&lt;br /&gt;
|$my&lt;br /&gt;
|$m(yyyy)&lt;br /&gt;
|Date of preferred marriage, year only&lt;br /&gt;
|-&lt;br /&gt;
|$p&lt;br /&gt;
|$s&lt;br /&gt;
|Preferred spouse's name as by Gramps name display under Preferences&lt;br /&gt;
|-&lt;br /&gt;
|$s&lt;br /&gt;
|$s(g f)&lt;br /&gt;
|Preferred spouse's name - FirstName LastName&lt;br /&gt;
|-&lt;br /&gt;
|$S&lt;br /&gt;
|$s(f, g)&lt;br /&gt;
|Preferred spouse's name - LastName, FirstName&lt;br /&gt;
|-&lt;br /&gt;
|$sC&lt;br /&gt;
|$s(g F)&lt;br /&gt;
|Preferred spouse's name - FirstName LastName in UPPER case&lt;br /&gt;
|-&lt;br /&gt;
|$SC&lt;br /&gt;
|$s(F, g)&lt;br /&gt;
|Preferred spouse's name - LastName in UPPER case, FirstName&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format Strings ==&lt;br /&gt;
&lt;br /&gt;
Format strings are used to display names and dates differently than those assigned under Gramps Preferences. Here is the syntax for a format string:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''(format string)&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'nsijbmBMdvDVauet'&lt;br /&gt;
&lt;br /&gt;
A format string is any text, separators or format codes (defined below) to display information about the person.&lt;br /&gt;
&lt;br /&gt;
=== Formatting names ===&lt;br /&gt;
&lt;br /&gt;
For names &amp;lt;code&amp;gt;($n $s)&amp;lt;/code&amp;gt; you may use the following formatting codes to display the name differently.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!t&lt;br /&gt;
|Title&lt;br /&gt;
!f&lt;br /&gt;
|Given name&lt;br /&gt;
|-&lt;br /&gt;
!x&lt;br /&gt;
|Common name. Call name if existing, otherwise first first name&lt;br /&gt;
!c&lt;br /&gt;
|Call name&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Nick name&lt;br /&gt;
!s&lt;br /&gt;
|Suffix&lt;br /&gt;
|-&lt;br /&gt;
!l&lt;br /&gt;
|Surname&lt;br /&gt;
!g&lt;br /&gt;
|Family nickname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These codes can be upper-cased to uppercase the result.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!Displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$n(L, f) ($n(c)), $n(L, f){ ($n(c))}&lt;br /&gt;
$s(f l s)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;SMITH, Edwin Michael (), SMITH, Edwin Michael&lt;br /&gt;
Janice Ann Adams&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{man note|Note:|If you want to print a character 'c' within the format string (or any one of the other format codes), you will need to first add a &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt; in front of it. See [[#Control Variables|Control Variables]] for more.}}&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|The curly brackets &amp;lt;code&amp;gt;{ }&amp;lt;/code&amp;gt; are used to hide information. Here it is used around &amp;lt;code&amp;gt;' ($n(c))'&amp;lt;/code&amp;gt; to not display &amp;lt;code&amp;gt;' ()'&amp;lt;/code&amp;gt; if the person does not have a call name. See [[#Grouping|Grouping]] for more.}}&lt;br /&gt;
&lt;br /&gt;
=== Formatting Dates ===&lt;br /&gt;
For all of the date variables &amp;lt;code&amp;gt;($b $d $m $v)&amp;lt;/code&amp;gt; you may use the following formatting codes:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!yyyy&lt;br /&gt;
|The year as a four digit number&lt;br /&gt;
!yyy&lt;br /&gt;
|The year, with a minimum of three digits&lt;br /&gt;
|-&lt;br /&gt;
!yy&lt;br /&gt;
|The year, from 00 to 99&lt;br /&gt;
!y&lt;br /&gt;
|The year, from 0 to 99&lt;br /&gt;
|-&lt;br /&gt;
!mmmm&amp;lt;BR&amp;gt;&lt;br /&gt;
'''MMMM'''&lt;br /&gt;
|The full name of the month&amp;lt;BR&amp;gt;&lt;br /&gt;
The full name IN CAPS&lt;br /&gt;
!mmm&amp;lt;BR&amp;gt;&lt;br /&gt;
'''MMM'''&lt;br /&gt;
|The abbreviated name of the month&amp;lt;BR&amp;gt;&lt;br /&gt;
The abbreviated name IN CAPS&lt;br /&gt;
|-&lt;br /&gt;
!mm&lt;br /&gt;
|The month, from 00 to 12&lt;br /&gt;
!m&lt;br /&gt;
|The month, from 0 to 12&lt;br /&gt;
|-&lt;br /&gt;
!dd&lt;br /&gt;
|The day, from 00 to 31&lt;br /&gt;
!d&lt;br /&gt;
|The day, from 0 to 31&lt;br /&gt;
|-&lt;br /&gt;
!o&lt;br /&gt;
|The date type (modifier)&lt;br /&gt;
!&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(mmm-dd yy)&lt;br /&gt;
$m(yyyy/mmm/d)&lt;br /&gt;
$b(mmm-dd yy)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;May-24 61&lt;br /&gt;
1995/May/27&lt;br /&gt;
Jun-04 85&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{man warn| For date types (modifier) |Only &amp;quot;Before&amp;quot;, &amp;quot;After&amp;quot;, and &amp;quot;About&amp;quot; are supported at this time.  all others will not display anything.&amp;lt;BR&amp;gt;And for date span and date ranges, only the starting (first) date is displayed.}}&lt;br /&gt;
&lt;br /&gt;
=== Formatting Places ===&lt;br /&gt;
For all of the place variables &amp;lt;code&amp;gt;($B $D $M $V)&amp;lt;/code&amp;gt; you may use the following formatting codes:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!e&lt;br /&gt;
|Street&lt;br /&gt;
|&lt;br /&gt;
!l&lt;br /&gt;
|Locality&lt;br /&gt;
|-&lt;br /&gt;
!c&lt;br /&gt;
|City&lt;br /&gt;
|&lt;br /&gt;
!u&lt;br /&gt;
|County&lt;br /&gt;
|-&lt;br /&gt;
!s&lt;br /&gt;
|State&lt;br /&gt;
|&lt;br /&gt;
!p&lt;br /&gt;
|Postal Code&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Country&lt;br /&gt;
|&lt;br /&gt;
!t&lt;br /&gt;
|Title&lt;br /&gt;
|-&lt;br /&gt;
!x&lt;br /&gt;
|Longitude&lt;br /&gt;
|&lt;br /&gt;
!y&lt;br /&gt;
|Latitude&lt;br /&gt;
|}&lt;br /&gt;
These codes can be upper-cased to uppercase the result. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$B&lt;br /&gt;
$B(c, s, N)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;St Judes Hospital&lt;br /&gt;
Carmel, IN, USA&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rules for format strings ===&lt;br /&gt;
&lt;br /&gt;
* Anything will print inside a format string&lt;br /&gt;
* You need to use [[#Control Variables|Control Variables]] to display things like &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt; and format codes&lt;br /&gt;
* Separators can be within format strings.&lt;br /&gt;
* At least ONE format code has to display something for the ENTIRE format string to display&lt;br /&gt;
&lt;br /&gt;
For examples:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$n(f l)&lt;br /&gt;
b. $b {at $B&lt;br /&gt;
{d. $d $D&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;Edwin Michael Smith&lt;br /&gt;
b. 1961-05-24 at San Jose, Santa Clara Co., CA&amp;lt;/pre&amp;gt;{{man label|The person is still alive (or has no information present) so the line was removed.}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Control Variables ==&lt;br /&gt;
&lt;br /&gt;
Control variables allow you to print characters that are special to Substitution values within a display.&lt;br /&gt;
&lt;br /&gt;
For example the dollar character '$' is used to note the start of a variable. If you wish to print a dollar character you would use a control character like '&amp;amp;#92;$'&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Control Variables&lt;br /&gt;
!Result&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;$&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'$'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;amp;#92;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;(&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'('&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;)&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;{&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'{'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;}&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'}'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;lt;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;lt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;amp;#92;&amp;gt;&lt;br /&gt;
|Displays a single &amp;lt;code&amp;gt;'&amp;gt;'&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Basically anything that comes after a &amp;lt;code&amp;gt;'&amp;amp;#92;'&amp;lt;/code&amp;gt; will be printed.&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|When you are inside a format string, you may need to use this to display a character that would normally be a format code.}}&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting code:&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(m hi mom)&lt;br /&gt;
$b(m hi \mo\m)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;5 hi 5o5&lt;br /&gt;
5 hi mom&amp;lt;/pre&amp;gt;{{man label|As this person was born on the fifth month.}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grouping ==&lt;br /&gt;
&lt;br /&gt;
There are instances where you do not want certain text to be displayed. &lt;br /&gt;
&lt;br /&gt;
Take the example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting Code&lt;br /&gt;
!Only date is known&lt;br /&gt;
!Only place is known&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;died on $d at $D&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on 1975-06-26 at&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on at Reno, Washoe Co., NV&amp;lt;code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Neither of these displayed results are very acceptable.&lt;br /&gt;
&lt;br /&gt;
But with groups (denoted by '''&amp;amp;#123;&amp;amp;#125;'''), you can optionally print information if a variable within contains information.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!Formatting Code&lt;br /&gt;
!Only date is known&lt;br /&gt;
!Only place is known&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;died{ on $d}{ at $D}&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died on 1975-06-26&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;died at Reno, Washoe Co., NV&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Which is a more preferable displayed result than in the first example.&lt;br /&gt;
&lt;br /&gt;
=== Rules for groups ===&lt;br /&gt;
&lt;br /&gt;
A group will only display if there is at least one variable that displays something. So if a group only has text and/or variables where the information is not known, the entire group will not print.&lt;br /&gt;
&lt;br /&gt;
Groups can also be nested. If this happens (like below), the outer group will only display if there is at least one variable that displays something within the outer group or any of the sub groups.&lt;br /&gt;
&lt;br /&gt;
Groups can also be used to remove text.  If you wish to not display the entire line, &amp;lt;code&amp;gt;'-'&amp;lt;/code&amp;gt; at the start of a line will remove the entire line from the display if the above rule is true.&lt;br /&gt;
&lt;br /&gt;
If you do not wish to have the display code above (for death information) displayed (the person is alive, or you do not yet know the information), modify the code to look like:&lt;br /&gt;
* &amp;lt;code&amp;gt;-{died{ on $d}{ at $D}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
This will hide &amp;lt;code&amp;gt;'('&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt; if the divorce information is not known (or still married).&lt;br /&gt;
* &amp;lt;code&amp;gt;m. $m $M {- ($v(yyyy))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only display some spouse information if married or remove the entire line if never married:&lt;br /&gt;
* &amp;lt;code&amp;gt;{$s $m(yyyy) {- $v(\(yyyy\))}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
Attributes do not have a format string. Instead the attribute name is placed inside &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;. Here is the syntax for an attribute:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''[attribute name]&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'au'&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$a[Profession]&lt;br /&gt;
$a[Social Security Number]&lt;br /&gt;
$a[Total \$ bequeathed]&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;Programmer&lt;br /&gt;
7A3-29-F1C6&lt;br /&gt;
3.00USD&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
Events have the same starting structure as attributes, &amp;lt;code&amp;gt;$e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$t&amp;lt;/code&amp;gt; and the event name in &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt; but events have an extra format string after the name to display the description, date, place, id, and attributes associated with it. Each of these items can be displayed with a , a 'n', 'd', 'D', 'i', and 'a' respectively in the format string. Here is the syntax for an event:&lt;br /&gt;
&lt;br /&gt;
$''{{man label|key}}''[attribute name](format string)&amp;lt;br /&amp;gt;&lt;br /&gt;
where: ''{{man label|key}}'' is one of the following characters: 'et'&lt;br /&gt;
&lt;br /&gt;
=== Event format strings ===&lt;br /&gt;
&lt;br /&gt;
The Event format string is used to display information about the event. Here are the format codes to display parts of the event:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code &lt;br /&gt;
!displays&lt;br /&gt;
!&lt;br /&gt;
!Formatting code &lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
!n&lt;br /&gt;
|Description&lt;br /&gt;
|&lt;br /&gt;
!i&lt;br /&gt;
|Event ID&lt;br /&gt;
|-&lt;br /&gt;
!d&lt;br /&gt;
|Event Date&amp;amp;#42;&lt;br /&gt;
|&lt;br /&gt;
!D&lt;br /&gt;
|Event Place&amp;amp;#42;&lt;br /&gt;
|-&lt;br /&gt;
!a&lt;br /&gt;
|An attributes for the event&amp;amp;#42;&amp;amp;#42;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;These variables can themselves have format strings. Date and a place can be formatted with format string as defined in [[#Format strings|Format strings]].&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;&amp;amp;#42;Attribute needs to have the attribute name in [] and are formatted as above.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$e[First Communion](d(yyyy-mm-d))&lt;br /&gt;
$e[Bar Mitzvah](n&amp;amp;lt; at &amp;amp;gt; D)&lt;br /&gt;
$e[Birth](d(yyyy mm/dd) D)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;2009-11-6&lt;br /&gt;
Jerry's Bar Mitzah at Opas house&lt;br /&gt;
2007 05/23 Grandmothers house&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
And:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Formatting code&lt;br /&gt;
!&lt;br /&gt;
!displays&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;$b(yyyy-Mmm-dd)&lt;br /&gt;
$M&amp;lt;/pre&amp;gt;&lt;br /&gt;
|is the same as&lt;br /&gt;
|&amp;lt;pre&amp;gt;$e[Birth](d(yyyy-Mmm-dd))&lt;br /&gt;
$t[Marriage](D)&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes for attributes and events ===&lt;br /&gt;
&lt;br /&gt;
Attribute and event names are mandatory. &amp;lt;code&amp;gt;'$a'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;'$a[]'&amp;lt;/code&amp;gt; will not display anything.&lt;br /&gt;
&lt;br /&gt;
Attributes and event names may have special characters within them. Most notably &amp;lt;code&amp;gt;']'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;')'&amp;lt;/code&amp;gt;. If this is the case, you will need to use [[#Control Variables|Control Variables]]&lt;br /&gt;
&lt;br /&gt;
== Separators ==&lt;br /&gt;
&lt;br /&gt;
Separators are special 'text only' groups inside &amp;lt;code&amp;gt;'&amp;amp;lt;'&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;'&amp;amp;gt;'&amp;lt;/code&amp;gt; that conditionally display a separator (like &amp;lt;code&amp;gt;', '&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;' - '&amp;lt;/code&amp;gt;) between two groups, variables, format codes or text.&lt;br /&gt;
&lt;br /&gt;
Separators are displayed conditionally depending on these rules:&lt;br /&gt;
* A variable that does '''not''' display anything will remove itself and a separator that is to the left of it from the display line only.&lt;br /&gt;
* If there is not a separator to the left, the same variable will remove itself and a separator that is to the right of it from the displayed line.&lt;br /&gt;
* If there are two separators together, the left one will be removed from the display line and the right is kept.&lt;br /&gt;
* Separators at the start or end of the display line (or format strings) are removed.&lt;br /&gt;
&lt;br /&gt;
Take this example formatting code:&lt;br /&gt;
* &amp;lt;code&amp;gt;$s(f l s)&amp;amp;lt;, &amp;amp;gt;$m(yyyy)&amp;amp;lt; @ &amp;amp;gt;$M&amp;amp;lt; - &amp;amp;gt;$v(&amp;amp;#92;(yyyy&amp;amp;#92;))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are some things that may happen:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!Possibility&lt;br /&gt;
!Outcome&lt;br /&gt;
|-&lt;br /&gt;
|If '''none''' of the variables are known&lt;br /&gt;
|None of the separators will display&lt;br /&gt;
|-&lt;br /&gt;
|If only one variable '''is''' known&lt;br /&gt;
|Only that variable will print. No separators will print.&lt;br /&gt;
|-&lt;br /&gt;
|If only the spouse's name '''is not''' known&lt;br /&gt;
|The first separator will not display&lt;br /&gt;
|-&lt;br /&gt;
|If only the marriage date '''is not''' known&lt;br /&gt;
|The first separator does not display. We will be left with:&lt;br /&gt;
Jane Doe&amp;amp;lt; - &amp;amp;gt;{ … }And only the divorce date needs to be known to print the second separator.&lt;br /&gt;
|-&lt;br /&gt;
|If only the divorce date '''is not''' known&lt;br /&gt;
|the second separator will not display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Separators can be inside format strings:&lt;br /&gt;
* &amp;lt;code&amp;gt;$n(&amp;amp;lt;0&amp;amp;gt;T&amp;amp;lt; &amp;amp;gt;L&amp;amp;lt;, &amp;amp;gt;f&amp;amp;lt; &amp;amp;gt;s)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlike groups, separators can not cross over/out of format strings. So the separator &amp;lt;code&amp;gt;&amp;amp;lt;0&amp;amp;gt;&amp;lt;/code&amp;gt; will NEVER display. No matter what is on the left hand side of the variable.&lt;br /&gt;
&lt;br /&gt;
Here is a useful example:&lt;br /&gt;
* &amp;lt;code&amp;gt;{({b. $b}&amp;lt;, &amp;gt;{d. $d})}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|Only print the outside () if either the birth or death date displays&amp;lt;br&amp;gt;&lt;br /&gt;
Only displays the center separator if both dates are known.&amp;lt;br&amp;gt;&lt;br /&gt;
So here are some thing that could display&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|or the line does not print at all.&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| We will not see things like:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(, )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b., )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(, d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, )&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b. 1970-4-8, d.)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(, d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;(b., d. 2012-3-9)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Reports - part 1|Gramps_5.1_Wiki_Manual_-_Reports_-_part_3|5.1}}&lt;br /&gt;
{{languages|Gramps 5.1 Wiki Manual - Reports - part 2}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports&amp;diff=93304</id>
		<title>Gramps 5.1 Wiki Manual - Reports</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports&amp;diff=93304"/>
		<updated>2022-09-11T20:00:44Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Typo corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Gramplets|Gramps 5.1 Wiki Manual - Reports - part 1|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Reports}}&lt;br /&gt;
{{#vardefine:chapter|13}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
[[File:Menubar-ReportsOverview-50.png|thumb|right|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Menubar - Reports Overview]]&lt;br /&gt;
This section describes all the different reports available in Gramps.&lt;br /&gt;
&lt;br /&gt;
Gramps comes with a large number of available reports. The different subsections describe the various possibilities and options:&lt;br /&gt;
&lt;br /&gt;
{{man note|Additional Reports |Gramps has even more reports available to install, made by volunteers just like you they are called Addons and you check the growing list of available reports [[5.1_Addons|'''here''']].. This system is controlled by the [[Gramps_5.1_Wiki_Manual_-_Plugin_Manager|'''Plugin Manager''']]. }}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
[[Gramps 5.1 Wiki Manual - Reports - part 1|Generating Reports]]: This first subsection gives you some general remarks.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
= Reports =&lt;br /&gt;
[[File:ToolbarIcon-OpenTheReportsDialog-50.png|right|thumb|400px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Toolbar Icon for &amp;quot;Open the reports dialog&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
The reports can be accessed by choosing the menu {{man menu|Reports -&amp;gt;''Report Section'' -&amp;gt;''Particular Report''}} . &lt;br /&gt;
&lt;br /&gt;
Alternatively, you can browse the complete selection of available reports along with their brief descriptions in a {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports#Report_Selection_dialog|Report Selection]]}} dialog invoked by clicking the {{man button|Open the reports dialog}} icon on the toolbar from any of the categories.&lt;br /&gt;
{{-}}&lt;br /&gt;
== Report Selection dialog ==&lt;br /&gt;
&lt;br /&gt;
[[File:ReportSelection-dialog-example-50.png|right|thumb|400px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Report Selection - dialog - example showing &amp;quot;Timeline Chart&amp;quot; information]]&lt;br /&gt;
&lt;br /&gt;
The {{man label|Report Selection}} dialog allows you to browse the complete selection of available reports along with their brief descriptions when  invoked by clicking the {{man button|Open the reports dialog}} icon on the toolbar from any of the categories and using the {{man button|&amp;amp;#x25B6;}} arrows to expand the listings.&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Substitution Values=&lt;br /&gt;
[[Gramps 5.1 Wiki Manual - Reports - part 2|Substitution Values]]: you can use some handy values in your reports. (Selected reports only)&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
=Books=&lt;br /&gt;
[[Gramps 5.1 Wiki Manual - Reports - part 3#Books|The Books Report]] allows you to create a custom '''genealogy book''' containing a collection of Gramps textual and graphical reports in a single document (i.e. a Book) &lt;br /&gt;
&lt;br /&gt;
==Available items selections==&lt;br /&gt;
===Alphabetical Index===&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_3#Alphabetical_Index|Alphabetical Index]] - This item produces page(s) with an alphabetical index of people noted into selected textual reports.&lt;br /&gt;
&lt;br /&gt;
===Custom Text===&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_3#Custom_Text|Custom Text]] - This item produces a page with three paragraphs, each containing custom text: Initial Text, Middle Text and Final Text. The text input fields are expandable so you can really put all the text you want in there.&lt;br /&gt;
&lt;br /&gt;
===Table Of Contents===&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_3#Table_of_contents|Table Of Contents]] - A Table of contents (TOC) is generated for book as a list of the parts of a book or document organized in the order in which the parts appear. &lt;br /&gt;
&lt;br /&gt;
===Title Page===&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_3#Title_Page|Title Page]] - A title page for your book.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Graphs=&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_5#Graphs|Graphs]] reports are created in Graphviz format and then converted into graphical output running it through the Graphviz dot tool behind the scene.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===&amp;lt;u&amp;gt;Family Lines Graph&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[File:Graphs-FamilyLinesGraph-example-overview-50.png|100px|Family Lines Graph]]The [[Gramps 5.1 Wiki Manual - Reports - part 5#Family Lines Graph|Family Lines Graph]] creates an easy-to-follow graph.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Hourglass Graph&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[File:Graphs-HourglassGraph-example-overview-50.png|100px|Hourglass]]The [[Gramps 5.1 Wiki Manual - Reports - part 5#Hourglass Graph|Hourglass Graph]] generate an hourglass graph.&lt;br /&gt;
===&amp;lt;u&amp;gt;Relationship Graph&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[File:Graphs-RelationshipGraph-example-overview-50.png|100px|Relationship]]The [[Gramps 5.1 Wiki Manual - Reports - part 5#Relationship Graph|Relationship Graph]] creates a complex relationship graph.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Graphical Reports=&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Graphical_Reports|Graphical reports]] represent information in forms of charts and graphs.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Ancestor Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Ancestor Tree|Ancestor Tree report]] generates the chart of people who are ancestors of the Active Person.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Calendar&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Calendar|Calendar report]] produces a calendar with birthdays and anniversaries on a page by month.&lt;br /&gt;
===&amp;lt;u&amp;gt;Descendant Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Descendant Tree|Descendant Tree report]] generates a graph of people who are descendants of the Active Person.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Family Descendant Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Family Descendant Tree|Family Descendant Tree]] generates a graph of people who are descendants of the Active Family.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Fan Chart&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Fan Chart|Fan Chart report]] produces a chart resembling a fan, with Active Person in the center, parents the semicircle next to it, ans so on, for a total of five generations.&lt;br /&gt;
====See also====&lt;br /&gt;
{{fan_charts}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Statistics Charts&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Statistics Charts|Statistics Charts report]] can collect and display a wealth of statistical data about your database.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Timeline Chart&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 4#Timeline Chart|Timeline Chart report]] outputs the list of people with their lifetimes represented by intervals on a common chronological scale.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Text Reports=&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_6#Text_Reports|Text reports]] output information as formatted text.&lt;br /&gt;
===&amp;lt;u&amp;gt;Ahnentafel Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Ahnentafel Report|Ahnentafel Report]] lists the Active Person and his or her ancestors along with their vital data. The people are numbered in an establish standard called 'Ahnentafel'.&lt;br /&gt;
===&amp;lt;u&amp;gt;Birthday and Anniversary Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Birthday and Anniversary Report|Birthday and Anniversary Report]] gives the same information as a calendar but in text format.&lt;br /&gt;
===&amp;lt;u&amp;gt;Complete Individual Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Complete Individual Report|Complete Individual Report]] provides individual summaries similar to that of the Individual Summary Report.&lt;br /&gt;
===&amp;lt;u&amp;gt;Database Summary Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_6#Database_Summary_Report|Database Summary Report]] displays the overall statistics concerning number of individuals of each gender, various incomplete entries statistics, as well as family and media statistics.&lt;br /&gt;
===&amp;lt;u&amp;gt;Descendant Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Descendant Report|Descendant Report]] presents the descendants of the Active Person with a brief description in intended style.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Detailed Ancestral Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Detailed Ancestral Report|Detailed Ancestral Report]] covers in detail the ancestors of the Active Person, including a range of vital data as well as marriages.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Detailed Descendant Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Detailed Descendant Report|Detailed Descendant Report]] covers in detail the descendants of the Active Person by generation, following the genealogical tradition of textual descendant reports by generation. It aims to provide all important features expected to be found in these classic descendency formats and has received influence from various sources.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;End of Line Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#End of Line Report|End of Line Report]] provides a list of of the person's last known ancestors with the pedigree line, ordered by generations.&lt;br /&gt;
===&amp;lt;u&amp;gt;Family Group Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Family Group Report|Family Group Report]] creates a family group report, showing information on a set of parents and their children.&lt;br /&gt;
===&amp;lt;u&amp;gt;Kinship Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[Gramps 5.1 Wiki Manual - Reports - part 6#Kinship Report|Kinship Report]] provides the kinship of selected person according to level search( height, down generations) set by the user.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Note Link Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_6#Note_Link_Report|Note Link Report]] checks the status of internal Gramps links in notes.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Number of Ancestors Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Number of Ancestors Report|Number of Ancestors Report]] displays the number of ancestors of the Active Person. The form is - generation x has y individuals (z %).&lt;br /&gt;
===&amp;lt;u&amp;gt;Place Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Place Report|Place Report]] produces a report according to places selected by the user. It will list related person and event to the selected place.&lt;br /&gt;
===&amp;lt;u&amp;gt;Records Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[Gramps 5.1 Wiki Manual - Reports - part 6#Records Report|Records Report]] shows a number of interesting records(mostly age related) in your database, like oldest living person, youngest mother,etc.&lt;br /&gt;
===&amp;lt;u&amp;gt;Tag Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 6#Tag Report|Tag Report]] lists primary objects - persons, families, and notes - who match the selected tag.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
= Web Pages =&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_7#Web_Pages|Web Pages]] for use on your personal website or to give away as a standalone report.&lt;br /&gt;
===&amp;lt;u&amp;gt;Narrated Web Site&amp;lt;/u&amp;gt;===&lt;br /&gt;
One of the reports in this category is the [[Gramps 5.1 Wiki Manual - Reports - part 7#Narrated Web Site|Narrated Web Site report]]. It generates a web site (that is, a set of linked web pages), for a set of selected individuals.&lt;br /&gt;
===&amp;lt;u&amp;gt;Web Calendar&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Gramps 5.1 Wiki Manual - Reports - part 7#Web Calendar|Web Calendar]] is a Report that creates webpages showing events for the selected individuals as a set of monthly calendars. &lt;br /&gt;
===&amp;lt;u&amp;gt;Dynamic Web Report&amp;lt;/u&amp;gt;===&lt;br /&gt;
The [[Addon:DynamicWeb_report|Dynamic Web Report]] Addon creates interactive web pages of the family tree database with options allowing a wide range of customization.&lt;br /&gt;
&lt;br /&gt;
This addon is based on the [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_7#Narrated_Web_Site|Narrative Web Report]] native Gramps report.&lt;br /&gt;
&lt;br /&gt;
{{Man warn|This section is a placeholder.|Addons don't belong in this part of the manual. &amp;lt;br /&amp;gt;This section was created to compensate for an incorrect address used by the {{man button|[[Addon:DynamicWeb_report#Help_for_the_report_generation|Help]]}} button in the addon and has been corrected as of the [https://github.com/gramps-project/addons-source/commit/c9099d9ee4358658988929efa04b8a40d02db1eb 0.0.82 version] released 3 Jan 2020. The new version links to the actual [[Addon:DynamicWeb_report|webpage for the Dynamic Web Report]]}}&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Quick Views =&lt;br /&gt;
[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_8#Quick_Views|Quick Views]] are reports that are available in the context menus of person, family, ... They maybe created by users, even with limited programming knowledge.&lt;br /&gt;
&amp;lt;!-- ################################################################################### --&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Gramplets|Gramps 5.1 Wiki Manual - Reports - part 1|5.1}}&lt;br /&gt;
{{languages|Gramps 5.1 Wiki Manual - Reports}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:GetGOV&amp;diff=93070</id>
		<title>Addon:GetGOV</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:GetGOV&amp;diff=93070"/>
		<updated>2022-07-24T16:10:29Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Link to bugs tagged GetGOV&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Addon:GetGOV}}&lt;br /&gt;
{{Third-party plugin}}&lt;br /&gt;
[[File:GetGOV-Gramplet-addon-detached-51.png|300px|right|thumb|GetGOV gramplet]]&lt;br /&gt;
The {{man label|GetGOV Gramplet}} is designed to download place information from the [http://gov.genealogy.net/search/index GOV gazetteer]. This information can include &lt;br /&gt;
&lt;br /&gt;
* Geographical location (lat-lon coordinates)&lt;br /&gt;
* Foreign and former names&lt;br /&gt;
* Past affiliation or hierarchy of enclosed-by places. &lt;br /&gt;
&lt;br /&gt;
Instead of the default [[Gramps_{{Version manual}}_Wiki_Manual_-_Settings#ID_Format|Place ID Format numbering (Pxxxx)]] for the imported places, the GOV-id will be used as the Place ID. If additional imports are performed, duplicate places (even part of the Enclosed By) will be automatically merged. &lt;br /&gt;
&lt;br /&gt;
=Usage=&lt;br /&gt;
It is designed to be installed as a gramplet on the [[Gramps_{{Version manual}}_Wiki_Manual_-_Categories#Places_Category|Places Category (List/Tree) view]].&lt;br /&gt;
===== Version 5.x =====&lt;br /&gt;
The language is set in the {{man menu|Edit -&amp;gt; Preferences..}} tabs {{man label|Display}} and is described in the [[Gramps_{{Version manual}}_Wiki_Manual_-_Settings#Place_Format_Editor|Place Format Editor]]. This is used as the preferred language for place names and types which are imported. The default language is German.&lt;br /&gt;
&lt;br /&gt;
===== Version 4.2 =====&lt;br /&gt;
If the {{man menu|Preferences -&amp;gt; Places}} tabs {{man label|Language}} is set, then this is used as the preferred language for place names and types which are imported, otherwise, the preference is German.  &lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
This example shows how the gramplet would be used with the GOV gazetteer website to import the place Frommenhausen.&lt;br /&gt;
&lt;br /&gt;
[[File:GOVscreenshot.png|600px|right]]&lt;br /&gt;
Log into the [http://gov.genealogy.net/search/index GOV gazetteer] website. &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
[[File:GOVresults.png|600px|right]]&lt;br /&gt;
Find the appropriate GOV-id for the place of interest. In the illustration, the search for the city Frommenhausen was used. The result identifies the appropriate GOV-id as &amp;lt;code&amp;gt;FROSENJN48KK&amp;lt;/code&amp;gt;.  &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
[[File:FrommenhausenDetails.png|600px|right]]&lt;br /&gt;
To see what data will be imported, you can drill down in to the GOV-id.  &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
[[File:GetGOVgramplet.png|600px|right]]&lt;br /&gt;
Enter the GOV-id into the GetGOV gramplet on the Places view.  &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
[[File:GetGOVimport.png|600px|right]]&lt;br /&gt;
The resulting places with Latitude and Longitude are loaded. Note that the Place Type is in the same language as the Place. Note that the ID is the GOV-id and not the default &amp;lt;code&amp;gt;Pxxxx&amp;lt;/code&amp;gt; numbering. If you use the Reorder Gramps IDs tool, it will change the ID to the default &amp;lt;code&amp;gt;Pxxxx&amp;lt;/code&amp;gt; numbering. Later use of this gramplet may import duplicate items (with different ID) since the Gramps ID is no longer the GOV-id and duplicates will not be identified. For instance, if you import &amp;lt;code&amp;gt;FROSENJN48KK&amp;lt;/code&amp;gt; and then use the Reorder Gramps ID tool to reset the Gramps ID, if you reimport FROSENJN48KK or any other GOV place that is already imported, you will have duplicate places for every item imported. &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
[[File:GetGOVresultsaltname.png|600px|right]]&lt;br /&gt;
This illustrates that multiple alternate names will be loaded if they are in the GOV database. Deutschland is the Primary name and there are multiple alternate names in different languages in this illustration.  &lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:GetGOVresultsenclosed.png|600px|right]]&lt;br /&gt;
The Place hierarchy is also loaded as defined in the GOV database. This includes the Enclosed By information which may be time-dependent as illustrated.  &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
= Issues =&lt;br /&gt;
* If you use the Reorder Gramps IDs tool, it will change the ID to the default Pxxx numbering. Later use of this gramplet will import duplicate items (with different ID) since the Gramps ID is no longer the GOV-id and duplicates will not be identified.&lt;br /&gt;
&lt;br /&gt;
= Known Bugs =&lt;br /&gt;
* Here's a current list of [https://gramps-project.org/bugs/search.php?project_id=8&amp;amp;sticky=on&amp;amp;sort=last_updated&amp;amp;dir=DESC&amp;amp;hide_status=90&amp;amp;tag_string=GetGOV&amp;amp;match_type=0 open bugs tagged GetGOV] in Mantis Bug Tracker.&lt;br /&gt;
* {{bug|11596}} Place format Language setting is not honored unless it is in lower case&lt;br /&gt;
* {{bug|10980}} Some places are shown as &amp;quot;?&amp;quot; if imported via getGOV third party addon&lt;br /&gt;
* {{bug|10773}} Places view shows all alternate names - even those with different languages&lt;br /&gt;
* {{bug|11680}} GetGOV crashes Gramps when GOV gazetteer website ( http://gov.genealogy.net ) is not available&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [[Addon:GeoName]] - downloads place information from the GeoNames gazetteer.&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Developers/General]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=91810</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=91810"/>
		<updated>2022-04-23T22:01:56Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Remove stray incomplete sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
#Report&lt;br /&gt;
#Quickreport&lt;br /&gt;
#Tool&lt;br /&gt;
#Importer&lt;br /&gt;
#Exporter&lt;br /&gt;
#Doc creator&lt;br /&gt;
#Plugin lib&lt;br /&gt;
#Map service&lt;br /&gt;
#Gramps View&lt;br /&gt;
#Relationships&lt;br /&gt;
#Gramplet&lt;br /&gt;
#Sidebar&lt;br /&gt;
#Database  (Introduced Gramps 5.x and greater)&lt;br /&gt;
#Rule  (Introduced Gramps 5.1.x and greater)&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_it_on_the_Gramps_mailing_list|Announce it on the Gramps mailing list]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons addons] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** /gramps42&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps50&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps51&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the gramps51 git branch, as the default is master branch for the developmental pre-release. (Currently gramps 5.2, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also [https://help.github.com/articles/generating-an-ssh-key/  Connecting to GitHub with SSH] will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that all three git repositories local locations are put into the same base directory and named with the repository names in order for the make.py script commands to work as shown. From the base directory, run the following commands to create a copy of each repository. If you want to use SSH;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you want to use a web url:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone https://github.com/gramps-project/addons.git addons&lt;br /&gt;
 git clone https://github.com/gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps51 branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps51 origin/maintenance/gramps51&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps52 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other pre-requisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' built-in configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;5.1&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] is TOOL, GRAMPLET, REPORT, QUICKVIEW, IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, or RELCALC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '5.1',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation [https://github.com/gramps-project/gramps/gen/plug/_pluginreg.py here] in the comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are (gen/plug/_pluginreg.py):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '5.1',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your addon inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
README.md&lt;br /&gt;
extra_dir/*&lt;br /&gt;
help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps51 or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps51 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps52 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[5.1_Addons]] or if the addon is meant for a future release [[5.2_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Addon list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce it on the Gramps mailing list ==&lt;br /&gt;
Join the [[Contact#Mailing_lists|Gramps Mailing lists]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many&lt;br /&gt;
Gramps developers that do support addons in various ways (translations,&lt;br /&gt;
triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=91809</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=91809"/>
		<updated>2022-04-23T21:56:42Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Using home directory isn't really required; clear up conflicting text in favor of 'base directory' terminology&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
#Report&lt;br /&gt;
#Quickreport&lt;br /&gt;
#Tool&lt;br /&gt;
#Importer&lt;br /&gt;
#Exporter&lt;br /&gt;
#Doc creator&lt;br /&gt;
#Plugin lib&lt;br /&gt;
#Map service&lt;br /&gt;
#Gramps View&lt;br /&gt;
#Relationships&lt;br /&gt;
#Gramplet&lt;br /&gt;
#Sidebar&lt;br /&gt;
#Database  (Introduced Gramps 5.x and greater)&lt;br /&gt;
#Rule  (Introduced Gramps 5.1.x and greater)&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_it_on_the_Gramps_mailing_list|Announce it on the Gramps mailing list]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons addons] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** /gramps42&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps50&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps51&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the gramps51 git branch, as the default is master branch for the developmental pre-release. (Currently gramps 5.2, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also [https://help.github.com/articles/generating-an-ssh-key/  Connecting to GitHub with SSH] will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that all three git repositories local locations are put into the same base directory and named with the repository names in order for the make.py script commands to work as shown. From the base directory, run the following commands to create a copy of each repository. If you want to use SSH;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you want to use a web url:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone https://github.com/gramps-project/addons.git addons&lt;br /&gt;
 git clone https://github.com/gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps51 branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps51 origin/maintenance/gramps51&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps52 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other pre-requisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' built-in configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;5.1&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] is TOOL, GRAMPLET, REPORT, QUICKVIEW, IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, or RELCALC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '5.1',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation [https://github.com/gramps-project/gramps/gen/plug/_pluginreg.py here] in the comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are (gen/plug/_pluginreg.py):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '5.1',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your addon inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
Note that the &lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
README.md&lt;br /&gt;
extra_dir/*&lt;br /&gt;
help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps51 or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps51 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps52 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[5.1_Addons]] or if the addon is meant for a future release [[5.2_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Addon list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce it on the Gramps mailing list ==&lt;br /&gt;
Join the [[Contact#Mailing_lists|Gramps Mailing lists]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many&lt;br /&gt;
Gramps developers that do support addons in various ways (translations,&lt;br /&gt;
triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=90769</id>
		<title>Addons development</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addons_development&amp;diff=90769"/>
		<updated>2022-02-25T02:35:28Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Link to addons-source GitHub repo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man tip|Information on developing Gramps addons|If you are looking for addons to install, visit: [[Third-party Addons]]}}&lt;br /&gt;
{{man warn|Note that this article anticipates that most addons will be developed under Linux.|([[Getting started with Gramps development|Linux is the principal development platform.]]) While it is possible to do so under Windows or MacOS, some of the steps will differ and the documented processes have not been as thoroughly reviewed. So developer beware.&amp;lt;br&amp;gt;See [[Portal:Developers]]}}&lt;br /&gt;
If you are developing a [[Third-party Addons|Third-party Addon]]; this page documents the API, methods, and best practices for Gramps 4.2 and later. &lt;br /&gt;
&lt;br /&gt;
==What can addons extend?==&lt;br /&gt;
Addons for Gramps can extend the program in many different ways. You can add any of the following [https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py types] of addons:&lt;br /&gt;
&lt;br /&gt;
#Report&lt;br /&gt;
#Quickreport&lt;br /&gt;
#Tool&lt;br /&gt;
#Importer&lt;br /&gt;
#Exporter&lt;br /&gt;
#Doc creator&lt;br /&gt;
#Plugin lib&lt;br /&gt;
#Map service&lt;br /&gt;
#Gramps View&lt;br /&gt;
#Relationships&lt;br /&gt;
#Gramplet&lt;br /&gt;
#Sidebar&lt;br /&gt;
#Database  (Introduced Gramps 5.x and greater)&lt;br /&gt;
#Rule  (Introduced Gramps 5.1.x and greater)&lt;br /&gt;
&lt;br /&gt;
==Writing an addon==&lt;br /&gt;
Writing an addon is fairly straightforward if you have just a little bit of Python experience. And sharing your addon is the right thing to do. The general steps to writing an addon and sharing your own addons are:&lt;br /&gt;
&lt;br /&gt;
# [[#Develop_your_addon|Develop your addon]]&lt;br /&gt;
# [[#Create_a_Gramps_Plugin_Registration_file|Create a Gramps Plugin Registration file (.gpr.py)]]&lt;br /&gt;
# [[#internationalization|Invite translation of your addon]] into multiple natural languages&lt;br /&gt;
# [[#Package_your_addon|Package your addon]]&lt;br /&gt;
# [[#List_and_document_your_addon_on_the_wiki|Document your addon]] and publish it to the addon list&lt;br /&gt;
# [[#List_your_addon_in_the_Gramps_Plugin_Manager|Register your addon with the Plugin Manager]]&lt;br /&gt;
# [[#Announce_it_on_the_Gramps_mailing_list|Announce it on the Gramps mailing list]] - Let users know it exist and how to use it.&lt;br /&gt;
# [[#Support_it_through_issue_tracker|Support it through the issue tracker]]&lt;br /&gt;
# [[#Maintain_the_code_as_Gramps_continues_to_evolve|Maintain the code]] as Gramps continues to evolve&lt;br /&gt;
&lt;br /&gt;
We'll now expand upon each of these steps individually.&lt;br /&gt;
&lt;br /&gt;
== Develop your addon ==&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons-source&lt;br /&gt;
** /''IndividualNameOfAddon1''&lt;br /&gt;
** /''IndividualNameOfAddon2''&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons add-ons] git repository has the following structure:&lt;br /&gt;
&lt;br /&gt;
* /addons&lt;br /&gt;
** /gramps42&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps50&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
** /gramps51&lt;br /&gt;
*** /download&lt;br /&gt;
*** /listings&lt;br /&gt;
&lt;br /&gt;
The [http://github.com/gramps-project/addons-source addons-source] repository holds the source code for the addons with branches holding the version for different gramps. If you are working on an addon for gramps for the current Gramps {{man version}} public release, be sure to use the gramps51 git branch, as the default is master branch for the developmental pre-release. (Currently gramps 5.2, which is not the typical target for addons.)  &lt;br /&gt;
&lt;br /&gt;
Example commands are shown below referring to the public release rather than the master branch.&lt;br /&gt;
&lt;br /&gt;
The developers are currently merging changes to the most recent maintenance branch into master as necessary, so you don't have to do anything for that unless you are in a hurry.  &lt;br /&gt;
&lt;br /&gt;
=== Get a local copy of Gramps and its addons ===&lt;br /&gt;
&lt;br /&gt;
These steps show how to download the addon sources.&lt;br /&gt;
&lt;br /&gt;
# Get an https://github.com/join account if you don't already have one.&lt;br /&gt;
# Request GIT write access for the https://github.com/gramps-project/addons-source project by emailing the [[Contact#Mailing_lists|gramps-devel mailing list]]&lt;br /&gt;
See also [[Brief_introduction_to_Git|git introduction]] for instructions on installing git and getting basic settings configured.  Also https://help.github.com/articles/generating-an-ssh-key/ will help with setting up credentials for GitHub.&lt;br /&gt;
To fully build and advertise a new addon will require local copies of the three repositories, the 'addons-source', 'addons' and the main Gramps source 'gramps'.&lt;br /&gt;
&lt;br /&gt;
This wiki assumes that the three git repositories local locations are all to be put into the users' home directory and named with the repository names.&lt;br /&gt;
&lt;br /&gt;
The three directories '''must''' be named as shown, and in the same base directory in order for the make.py script to work properly, however they don't have to be located directory in the users home directory.&lt;br /&gt;
&lt;br /&gt;
From your home directory;&lt;br /&gt;
&lt;br /&gt;
 git clone git@github.com:gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone git@github.com:gramps-project/addons.git addons&lt;br /&gt;
 git clone git@github.com:gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
or if you do not have a Github account:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/gramps-project/addons-source.git addons-source&lt;br /&gt;
 git clone https://github.com/gramps-project/addons.git addons&lt;br /&gt;
 git clone https://github.com/gramps-project/gramps.git gramps&lt;br /&gt;
&lt;br /&gt;
This will create a copy of the addons-source tree in your home directory at &amp;quot;~/addons-source&amp;quot;, and the other trees at their respective locations as well.&lt;br /&gt;
&lt;br /&gt;
To switch to a local copy of the gramps51 branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps51 origin/maintenance/gramps51&lt;br /&gt;
&lt;br /&gt;
or to work in the master branch:&lt;br /&gt;
&lt;br /&gt;
 cd addons-source&lt;br /&gt;
 git checkout -b gramps52 origin/master&lt;br /&gt;
&lt;br /&gt;
=== Other pre-requisites ===&lt;br /&gt;
{{man warn|These instructions, the make.py script etc.|are designed to operate in a Linux environment.  {{man menu|They won't work on Windows without modifications.}}}}&lt;br /&gt;
* Gramps uses Python version 3.2 or higher.  You must have at least that version installed.  If you have installed Gramps 4.2 or higher on your Linux system already, then a sufficient version of Python will be present. If you have more than one version of Python installed, then you must use the correct version for these scripts.  On some systems, both Python 2.x and 3.x are installed.  It is possible that the normal invocation of &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; starts up Python 2.x, and that to start up Python 3.x requires invoking with &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3.4&amp;lt;/code&amp;gt; etc.  You can test the version by &amp;lt;code&amp;gt;python –version&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;python3 –version&amp;lt;/code&amp;gt;.  If this is so, replace any usage of 'python' in the examples below with the appropriate invocation.&lt;br /&gt;
* The make.py used in construction of the addons requires that the LANGUAGE environment variable be set to 'en_US.UTF-8'. &lt;br /&gt;
* The make.py used in construction of the addons requires that the GRAMPSPATH environment variable be set to your path to the Gramps source tree.&lt;br /&gt;
* intltool must be installed;&lt;br /&gt;
: &amp;lt;code&amp;gt;sudo apt-get install intltool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example if your home directory is '/home/name' and you use the suggested path names, use&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=/home/name/gramps LANGUAGE='en_US.UTF-8' python3 make.py ...&amp;lt;/code&amp;gt;&lt;br /&gt;
to replace the &amp;lt;code&amp;gt;./make.py&amp;lt;/code&amp;gt; in the examples below.&lt;br /&gt;
&lt;br /&gt;
=== Create your addon subdirectory ===&lt;br /&gt;
* Make a new project directory in addons-source:&lt;br /&gt;
: &amp;lt;code&amp;gt;mkdir NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Follow the development API for your tool===&lt;br /&gt;
Create your NewProjectName.py and NewProjectName.gpr.py files.&lt;br /&gt;
&lt;br /&gt;
Follow the development API for your tool, [[Report-writing_tutorial|report]], view, or [[Gramplets]]. Place all of your associated .py, .glade, etc. files in this directory. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== Test your addon as you develop ===&lt;br /&gt;
&lt;br /&gt;
{{man warn|{{bug|10436}} Symlinks to folders in gramps plugin dir are not scanned}}&lt;br /&gt;
&lt;br /&gt;
To test your addon as you develop it is suggested that you copy your NewProjectName plugin into your Gramps user plugin directory from your addon development directory, prior to testing.  Or just edit in the Gramps user plugin directory until it is ready to publish, then copy back to your addon development directory.&lt;br /&gt;
&lt;br /&gt;
Your installed Gramps will search this folder (and subdirectories) for .gpr.py files, and add them to the plugin list.&lt;br /&gt;
&lt;br /&gt;
If you have code that you want to share between addons, you don't need to do anything special. Gramps adds each directory in which a .gpr.py is found onto the PYTHONPATH which is searched when you perform an import. Thus &amp;quot;import NewProjectName&amp;quot; will work from another addon. You should always make sure you name your addons with a name appropriate for Python imports.&lt;br /&gt;
&lt;br /&gt;
=== Commit your changes ===&lt;br /&gt;
To commit your changes so that others can see your addon source.&lt;br /&gt;
&lt;br /&gt;
* Remove the files using the ''clean'' command that should not be added to GitHub (eg files(template.pot/ locale etc)):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 clean NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add the project to the repository:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing what this addon is&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before committing additional edits to your addon, you should:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
* only the files you changed should be in this list&lt;br /&gt;
: &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
* Commit it with an appropriate message&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit -m &amp;quot;A message describing the changes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have been given 'push' rights to GitHub 'gramps-project/addons-source', and when you are sure you are done and want to publish to the repository:&lt;br /&gt;
&lt;br /&gt;
* to make sure that outside changes do not affect your commit&lt;br /&gt;
: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also you may want to [[Addons_development#Package_your_addon |Package your addon]] so it can be downloaded via the plugin manager.&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
&lt;br /&gt;
Some addons may want to have persistent data (data settings that remain between sessions). You can handle this yourself, or you can use Gramps' built-in configure system. &lt;br /&gt;
&lt;br /&gt;
At the top of the source file of your addon, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.register_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 # register the values to save:&lt;br /&gt;
 config.register(&amp;quot;section.option-name1&amp;quot;, value1)&lt;br /&gt;
 config.register(&amp;quot;section.option-name2&amp;quot;, value2)&lt;br /&gt;
 ...&lt;br /&gt;
 # load an existing file, if one:&lt;br /&gt;
 config.load()&lt;br /&gt;
 # save it, it case it didn't exist:&lt;br /&gt;
 config.save()&lt;br /&gt;
&lt;br /&gt;
This will create the file &amp;quot;grampletname.ini&amp;quot; and put in the same directory as the addon. If the config file already exists, it remains intact.&lt;br /&gt;
&lt;br /&gt;
In the addon, you can then:&lt;br /&gt;
&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
 config.set(&amp;quot;section.option-name1&amp;quot;, 3)&lt;br /&gt;
&lt;br /&gt;
and when this code is exiting, you might want to save the config. In a Gramplet that would be:&lt;br /&gt;
&lt;br /&gt;
 def on_save(self):&lt;br /&gt;
     config.save()&lt;br /&gt;
&lt;br /&gt;
If your code is a system-level file, then you might want to save the config in the Gramps system folder:&lt;br /&gt;
&lt;br /&gt;
 config = configman.register_manager(&amp;quot;system&amp;quot;, use_config_path=True)&lt;br /&gt;
&lt;br /&gt;
This, however, would be rare; most .ini files would go into the plugins directory.&lt;br /&gt;
&lt;br /&gt;
In other code that might use this config file, you would do this:&lt;br /&gt;
&lt;br /&gt;
 from config import config as configman&lt;br /&gt;
 config = configman.get_manager(&amp;quot;grampletname&amp;quot;)&lt;br /&gt;
 x = config.get(&amp;quot;section.option-name1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
For general help on translations in Gramps, see [[Coding for translation]]. However, that will only use translations that come with Gramps, or allows you to contribute translations to the Gramps core. To have your own managed translations that will be packaged with your addon, read the rest of this page.&lt;br /&gt;
Note that these instructions will only work for Python strings, if you have a glade file, it will not get translated.&lt;br /&gt;
&lt;br /&gt;
For any addon which you have translations into other languages, you will need to add a way to retrieve the translation. You need to add this to the top of your NewProjectName.py file:&lt;br /&gt;
&lt;br /&gt;
 from gramps.gen.const import GRAMPS_LOCALE as glocale&lt;br /&gt;
  _ = glocale.get_addon_translator(__file__).gettext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use the standard &amp;quot;_()&amp;quot; function to translate phrases in your addon. &lt;br /&gt;
&lt;br /&gt;
You can use one of a few different types of translation functions:&lt;br /&gt;
&lt;br /&gt;
# gettext&lt;br /&gt;
# lgettext&lt;br /&gt;
# ngettext&lt;br /&gt;
# lngettext&lt;br /&gt;
# sgettext&lt;br /&gt;
&lt;br /&gt;
These have become obsolete in Gramps 4; gettext, ngettext, and sgettext always return translated strings in unicode for consistent portability between Python 2 and Python3.&lt;br /&gt;
&lt;br /&gt;
See the [http://docs.python.org/3/library/gettext.html#the-gnutranslations-class python documentation] for documentation of gettext and ngettext. The &amp;quot;l&amp;quot; versions return the string encoded according to the [http://docs.python.org/3/library/locale.html#locale.setlocale currently set locale]; the &amp;quot;u&amp;quot; versions return unicode strings in Python2 and are not available in Python 3.&lt;br /&gt;
&lt;br /&gt;
'''sgettext''' is a Gramps extension that filters out clarifying comments for translators, such as&lt;br /&gt;
 _(&amp;quot;Remaining names | rest&amp;quot;)&lt;br /&gt;
Where &amp;quot;rest&amp;quot; is the English string that we want to present and &amp;quot;Remaining names&amp;quot; is a hint for translators.&lt;br /&gt;
&lt;br /&gt;
==== Commands to compile translations ====&lt;br /&gt;
&lt;br /&gt;
To build and compile translations for all projects to their download/Addon.addon.tgz files:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 build all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To compile translations for all projects :&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;python3 make.py gramps51 compile all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a Gramps Plugin Registration file ==&lt;br /&gt;
&lt;br /&gt;
First, create the NewProjectName.gpr.py file. The registration takes this general form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(PTYPE,&lt;br /&gt;
     gramps_target_version = &amp;quot;5.1&amp;quot;,&lt;br /&gt;
     version = &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
     ATTR = value,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://github.com/gramps-project/gramps/blob/master/gramps/gen/plug/_pluginreg.py#L76 PTYPE] is TOOL, GRAMPLET, REPORT, QUICKVIEW, IMPORT, EXPORT, DOCGEN, GENERAL, MAPSERVICE, VIEW, or RELCALC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ATTR depends on the PTYPE. But you must have '''gramps_target_version''' and '''version'''. '''gramps_target_version''' should be a string of the form &amp;quot;X.Y&amp;quot; version number matching Gramps X major, Y minor integer.  '''version''' is a string of the form &amp;quot;X.Y.Z&amp;quot; representing the version of your addon. X, Y, and Z should all be integers.&lt;br /&gt;
&lt;br /&gt;
Here is a sample Tool GPR file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(TOOL, &lt;br /&gt;
         id    = 'AttachSource',&lt;br /&gt;
         name  = _(&amp;quot;Attach Source&amp;quot;),&lt;br /&gt;
         description =  _(&amp;quot;Attaches a shared source to multiple objects.&amp;quot;),&lt;br /&gt;
         version = '1.0.0',&lt;br /&gt;
         gramps_target_version = '5.1',&lt;br /&gt;
         status = STABLE,&lt;br /&gt;
         fname = 'AttachSourceTool.py',&lt;br /&gt;
         authors = [&amp;quot;Douglas S. Blank&amp;quot;],&lt;br /&gt;
         authors_email = [&amp;quot;doug.blank@gmail.com&amp;quot;],&lt;br /&gt;
         category = TOOL_DBPROC,&lt;br /&gt;
         toolclass = 'AttachSourceWindow',&lt;br /&gt;
         optionclass = 'AttachSourceOptions',&lt;br /&gt;
         tool_modes = [TOOL_MODE_GUI]&lt;br /&gt;
         )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see examples of the kinds of addons [https://github.com/gramps-project/gramps/plugins here] (for example, see [https://github.com/gramps-project/gramps/plugins/drawreport/drawplugins.gpr.py gramps/plugins/drawreport/drawplugins.gpr.py]) and see the full documentation [https://github.com/gramps-project/gramps/gen/plug/_pluginreg.py here] in the comments and docstrings.&lt;br /&gt;
&lt;br /&gt;
Note that this .gpr.py will automatically use translations if you have them (see below). That is, the function &amp;quot;_&amp;quot; is predefined to use your locale translations; you only need to mark the text with _(&amp;quot;TEXT&amp;quot;) and include a translation of &amp;quot;TEXT&amp;quot; in your translation file. For example, in the above example, _(&amp;quot;Attach Source&amp;quot;) is marked for translation. If you have developed and packaged your addon with translation support, then that phrase will be converted into the user's language.&lt;br /&gt;
&lt;br /&gt;
=== Report plugins ===&lt;br /&gt;
The possible report categories are (gen/plug/_pluginreg.py):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#possible report categories&lt;br /&gt;
CATEGORY_TEXT       = 0&lt;br /&gt;
CATEGORY_DRAW       = 1&lt;br /&gt;
CATEGORY_CODE       = 2&lt;br /&gt;
CATEGORY_WEB        = 3&lt;br /&gt;
CATEGORY_BOOK       = 4&lt;br /&gt;
CATEGORY_GRAPHVIZ   = 5&lt;br /&gt;
REPORT_CAT          = [ CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_CODE,&lt;br /&gt;
                        CATEGORY_WEB, CATEGORY_BOOK, CATEGORY_GRAPHVIZ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each report category has a set of standards and interface. The categories CATEGORY_TEXT and CATEGORY_DRAW use the Document interface of Gramps. See also [[Report API]] for a draft view on this.&lt;br /&gt;
&lt;br /&gt;
The application programming interface or API for reports is treated at [[Report-writing_tutorial]]. For general information on Gramps development see [[Portal:Developers]] and [[Writing a plugin|Writing a Plugin]] specifically.&lt;br /&gt;
&lt;br /&gt;
=== General plugins ===&lt;br /&gt;
&lt;br /&gt;
The plugin framework also allows you to create generic plugins for use. This includes the ability to create libraries of functions, and plugins of your own design.&lt;br /&gt;
&lt;br /&gt;
==== Example: A library of functions ====&lt;br /&gt;
&lt;br /&gt;
In this example, a file name library.py will be imported at time of registration (when Gramps starts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
   id    = 'My Library',&lt;br /&gt;
   name  = _(&amp;quot;My Library&amp;quot;),&lt;br /&gt;
   description =  _(&amp;quot;Provides a library for doing something.&amp;quot;),&lt;br /&gt;
   version = '1.0',&lt;br /&gt;
   gramps_target_version = '5.1',&lt;br /&gt;
   status = STABLE,&lt;br /&gt;
   fname = 'library.py',&lt;br /&gt;
   load_on_reg = True,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code in the file library.py will be imported when Gramps begins. You can access the loaded module in other code by issuing an &amp;quot;import library&amp;quot; as Python keeps track of files already imported. However, the amount of useful code that you can run when the program is imported is limited. You might like to have the code do something that requires a dbstate or uistate object, and neither of these is available when just importing a file.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;load_on_reg&amp;quot; was not True, then this code would be unavailable until manually loaded. There is no automatic mechanism in Gramps to load GENERAL plugins automatically.&lt;br /&gt;
&lt;br /&gt;
In addition to importing a file at startup, one can also run a single function inside a GENERAL plugin, and it will be passed the dbstate, the uistate, and the plugin data. The function must be called &amp;quot;load_on_reg&amp;quot;, and take those three parameters, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: library.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, you could connect signals to the dbstate, open windows, etc.&lt;br /&gt;
&lt;br /&gt;
Another example of what one can do with the plugin interface is to create a general purpose plugin framework for use by other plugins. Here is the basis for a plugin system that:&lt;br /&gt;
&lt;br /&gt;
* allows plugins to list data files&lt;br /&gt;
* allows the plugin to process all of the data files&lt;br /&gt;
&lt;br /&gt;
First, the gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = &amp;quot;ID&amp;quot;,&lt;br /&gt;
  category = &amp;quot;CATEGORY&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;FUNCTION_NAME&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example uses three new features:&lt;br /&gt;
&lt;br /&gt;
# GENERAL plugins can have a category&lt;br /&gt;
# GENERAL plugins can have a load_on_reg function that returns data&lt;br /&gt;
# GENERAL plugins can have a function (called &amp;quot;process&amp;quot;) which will process the data&lt;br /&gt;
&lt;br /&gt;
If you (or someone else) create additional general plugins of this category, and they follow your load_on_reg data format API, then they could be used just like your original data. For example, here is an additional general plugin in the 'WEBSTUFF' category:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# anew.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'a new plugin',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  data = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;],&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This doesn't have load_on_reg = True, nor does it have a fname or process, but it does set the data directly in the .gpr.py file. Then we have the following results:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from gui.pluginmanager import GuiPluginManager&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN = GuiPluginManager.get_instance()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.get_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; PLUGMAN.process_plugin_data('WEBSTUFF')&lt;br /&gt;
[&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;STYLESHEET.CSS&amp;quot;, &amp;quot;ANOTHER.CSS&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registered GENERAL Categories ===&lt;br /&gt;
&lt;br /&gt;
The following are the published secondary plugins API's (type GENERAL, with the following categories):&lt;br /&gt;
&lt;br /&gt;
==== WEBSTUFF ====&lt;br /&gt;
&lt;br /&gt;
A sample gpr.py file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# stylesheet.gpr.py&lt;br /&gt;
&lt;br /&gt;
register(GENERAL, &lt;br /&gt;
  id    = 'system stylesheets',&lt;br /&gt;
  category = &amp;quot;WEBSTUFF&amp;quot;,&lt;br /&gt;
  name  = _(&amp;quot;CSS Stylesheets&amp;quot;),&lt;br /&gt;
  description =  _(&amp;quot;Provides a collection of stylesheets for the web&amp;quot;),&lt;br /&gt;
  version = '1.0',&lt;br /&gt;
  gramps_target_version = '5.1',&lt;br /&gt;
  fname = &amp;quot;stylesheet.py&amp;quot;,&lt;br /&gt;
  load_on_reg = True,&lt;br /&gt;
  process = &amp;quot;process_list&amp;quot;,&lt;br /&gt;
  )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is the associated program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# file: stylesheet.py&lt;br /&gt;
&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Runs when plugin is registered.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return [&amp;quot;Stylesheet.css&amp;quot;, &amp;quot;Another.css&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
def process_list(files):&lt;br /&gt;
    return [file.upper() for file in files]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Filters ====&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
register(GENERAL,&lt;br /&gt;
   category=&amp;quot;Filters&amp;quot;,&lt;br /&gt;
   ...&lt;br /&gt;
   load_on_reg = True&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def load_on_reg(dbstate, uistate, plugin):&lt;br /&gt;
    # returns a function that takes a namespace, 'Person', 'Family', etc.&lt;br /&gt;
&lt;br /&gt;
    def filters(namespace):&lt;br /&gt;
        print(&amp;quot;Ok...&amp;quot;, plugin.category, namespace, uistate)&lt;br /&gt;
        # return a Filter object here&lt;br /&gt;
    return filters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=internationalization&amp;gt;&lt;br /&gt;
== Get translators to translate your addon into multiple languages ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
If you [[#Localization|designed for localization]], the addon will begin supporting a single language. Make your add-on inviting for volunteers to translate it into their native language.&lt;br /&gt;
* Initialize and update the &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; for your addon:&lt;br /&gt;
: &amp;lt;code&amp;gt;cd ~/addons-source&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* You should edit the header of &amp;lt;code&amp;gt;template.pot&amp;lt;/code&amp;gt; with your information, so it gets copied to individual language files.&lt;br /&gt;
* Initialize a language for your addon (say French, fr):&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 init NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Update it from gramps and other addons:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 update NewProjectName fr&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit the translations file manually:&lt;br /&gt;
: &amp;lt;code&amp;gt;/NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
* Compile the language:&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 compile NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add or update your local language file, and commit changes:&lt;br /&gt;
: &amp;lt;code&amp;gt;git add NewProjectName/po/fr-local.po&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;git commit NewProjectName/po/fr-local.po -m &amp;quot;Added fr po file&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you have been given 'push' rights to GitHub 'gramps-project/addons-source', then;&lt;br /&gt;
: &amp;lt;code&amp;gt;git push origin gramps51&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Package your addon ==&lt;br /&gt;
&lt;br /&gt;
To create a downloadable package:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps51 build NewProjectName&amp;lt;/code&amp;gt;  or&lt;br /&gt;
: &amp;lt;code&amp;gt;./make.py gramps52 build NewProjectName&amp;lt;/code&amp;gt;  for the master branch.&lt;br /&gt;
&lt;br /&gt;
Note that the &lt;br /&gt;
&lt;br /&gt;
This will automatically include the following files in your build:&lt;br /&gt;
&lt;br /&gt;
* *.py&lt;br /&gt;
* *.glade&lt;br /&gt;
* *.xml&lt;br /&gt;
* *.txt&lt;br /&gt;
* locale/*/LC_MESSAGES/*.mo&lt;br /&gt;
&lt;br /&gt;
Starting with Gramp 5.0, if you have additional files beyond those listed above, you should create a MANIFEST file in the root of your addon folder listing the files (or pattern) one per line, like this sample MANIFEST file: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
README.md&lt;br /&gt;
extra_dir/*&lt;br /&gt;
help_files/docs/help.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note:|Running the command &amp;lt;code&amp;gt;make.py xxx build&amp;lt;/code&amp;gt; will increment the third number in your dotted version number of all addons in the &amp;lt;code&amp;gt;*.gpr.py&amp;lt;/code&amp;gt; file. Consider this number to be a &amp;quot;build number&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
This will leave your 'addons-source' with untracked changes according to git.  You should delete the 'NewProjectName/locale' directory.  The updated 'NewProjectName/NewProjectName.gpr.py ' is ready to add and commit the next time you make other changes.&lt;br /&gt;
: &amp;lt;code&amp;gt;rm –rf –v 'NewProjectName/locale'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then add the package to GitHub:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/download/NewProjectName.addon.tgz&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List your addon in the Gramps Plugin Manager==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Gramps needs to have been built|Make sure you have already built gramps51 or master.  Change to the appropriate git branch in your gramps directory, and run &amp;lt;code&amp;gt;python3 setup.py build&amp;lt;/code&amp;gt;  See [[Linux:Build_from_source]]}}&lt;br /&gt;
&lt;br /&gt;
To create a listing:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps51 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
: &amp;lt;code&amp;gt;cd '~/gramps-addons'&amp;lt;/code&amp;gt; or wherever you have built your addon&lt;br /&gt;
: &amp;lt;code&amp;gt;GRAMPSPATH=path/to/your/gramps/install ./make.py gramps52 listing NewProjectName&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That will create a series of files in the &amp;lt;tt&amp;gt;../listings/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Then add the updated listing to GitHub:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps51/listings/*&lt;br /&gt;
 git commit -m &amp;quot;Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
or (for the master branch);&lt;br /&gt;
&amp;lt;pre&amp;gt; cd '~/addons'&lt;br /&gt;
 git add gramps52/listings/*&lt;br /&gt;
 git commit -m &amp;quot; Added new plugin to listings: NewProjectName&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List and document your addon on the wiki==&lt;br /&gt;
&lt;br /&gt;
===List your addon===&lt;br /&gt;
Add a short description of your addon to the Addons list by editing the current release listing eg: [[5.1_Addons]] or if the addon is meant for a future release [[5.2_Addons]] when available.&lt;br /&gt;
&lt;br /&gt;
==== Example addon template  ====&lt;br /&gt;
Examine the listing for other addons and refer to the [[Plugin list legend]] for details of on the meaning of each columns.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|- &amp;lt;!-- Copy this section and list your Addon --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Plugin / Documentation --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Type --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Image --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Description --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Use --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Rating (out of 4) --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Contact --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Download --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Document your addon===&lt;br /&gt;
Document the addon in the wiki using the page name format of {{man menu|Addon:NewProjectName}}  examine the other addon support pages for the general format to use.&lt;br /&gt;
{{man tip|Hint on creating a new wiki page.|To create a new wiki page use the search box to search for the name of your page that doesn't exist then on the search results page you will be provided with a link to create the new page, by selecting and you can add your content}}&lt;br /&gt;
&lt;br /&gt;
====Example addon article====&lt;br /&gt;
Consider including the following information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Copy this section to your Addon support page--&amp;gt;&lt;br /&gt;
{{Third-party plugin}}&amp;lt;!-- This is a mediawiki template that expands out to display the standard addon message you see at the top of each addon page--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--sections only add if needed--&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Configure Options ===&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--default categories--&amp;gt;&lt;br /&gt;
[[Category:Addons]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Announce it on the Gramps mailing list ==&lt;br /&gt;
Join the [[Contact#Mailing_lists|Gramps Mailing lists]] and announce it to the users with general information on why you created and how to use it.&lt;br /&gt;
&lt;br /&gt;
== Support it through issue tracker ==&lt;br /&gt;
&lt;br /&gt;
Become a user on the [https://gramps-project.org/bugs/view_all_bug_page.php Gramps MantisBT (Mantis BugTracker)]. &lt;br /&gt;
and please check it regularly. There is no automated notification of issues (and possible feature requests) related to your addon when reported by users. &lt;br /&gt;
&lt;br /&gt;
Users tend to not understand coding and they make assumptions. So be kind and guiding if a report is ambiguous or inaccurate. A negative remark from an addon developer or anyone can be very discouraging.&lt;br /&gt;
&lt;br /&gt;
== Maintain the code as Gramps continues to evolve ==&lt;br /&gt;
&lt;br /&gt;
Remember that Gramps addons exist for many reasons and there are many&lt;br /&gt;
Gramps developers that do support addons in various ways (translations,&lt;br /&gt;
triage, keeping in sync with master, download infrastructure, etc).&lt;br /&gt;
&lt;br /&gt;
Some reasons why the addons exist; they provide:&lt;br /&gt;
* A quick way for anyone to share their work; the Gramps-project has never denied adding a addon.&lt;br /&gt;
* A method to continuously update and develop a stand-alone component, often before being officially accepted.&lt;br /&gt;
* A place for controversial plugins that will never be accepted into core, but are loved by many users (eg, Data Entry Gramplet).&lt;br /&gt;
* A place for experimental components to live.&lt;br /&gt;
== Example code adding common enhancements ==&lt;br /&gt;
* Copy all the Gramplet's output to a system clipboard via context pop-up menu : Enhancement request {{bug|11573}}, [https://github.com/gramps-project/gramps/pull/1014/commits/72012e13b4ca15caca4b7f36fdb9702c1fd470fd example pull]&lt;br /&gt;
* add a custom [[Gramps_Glossary#viewmode|View Mode]] toolbar icon via the &amp;lt;code&amp;gt;.gpr.py&amp;lt;/code&amp;gt; : [https://github.com/gramps-project/gramps/pull/1017 Pull 1017 Discussion], [https://github.com/gramps-project/gramps/pull/1017/commits/76e41d546d6ec519dd78fbe07f663135b5c79351 example Pull]&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
* [[Brief_introduction_to_Git|Git introduction]]&lt;br /&gt;
* [[Getting started with Gramps development]]&lt;br /&gt;
* [[Portal:Developers]]&lt;br /&gt;
* [https://gramps-project.org/docs/gen/gen_plug.html?highlight=include_in_listing#module-gramps.gen.plug._pluginreg Registration Module] &lt;br /&gt;
&lt;br /&gt;
;Gramps Addons site for Gramps 4.2 and newer&lt;br /&gt;
* https://github.com/gramps-project/addons-source  - Source code (Git)&lt;br /&gt;
* https://github.com/gramps-project/addons - downloadable .tgz files&lt;br /&gt;
;Gramps Addons site for Gramps 4.1 and older&lt;br /&gt;
* For 4.1.x and earlier, see [[Addons development old]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/General]]&lt;br /&gt;
[[Category:Developers/Tutorials]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Reports]]&lt;br /&gt;
[[Category:Gramplets]]&lt;br /&gt;
[[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Download&amp;diff=89846</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Download&amp;diff=89846"/>
		<updated>2022-01-22T02:58:45Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Specify more clearly the missing translations error message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{languages|Download}}&lt;br /&gt;
[[File:Gramp-Small-background-wiki-2020.jpg|120px|left]]&lt;br /&gt;
'''Research, organize and share your family tree with Gramps.''' &lt;br /&gt;
&lt;br /&gt;
Gramps is a free software project and community. We strive to produce a genealogy program that is both intuitive for hobbyists and feature-complete for professional genealogists. It is a community project, created, developed and governed by genealogists.&lt;br /&gt;
&lt;br /&gt;
{{man note|{{Man menu|Gramps '''Current version: '''{{version}}''' Released: '''2021-07-26'''}}|''Different data format to the GRAMPS 3.4 series. Full Python 3 support only as [https://www.python.org/doc/sunset-python-2/ Python 2 support dropped]. Uses GTK+ 3 GUI. Default database is now SQLite. Lot of updates see: ''[[Gramps 5.1 Wiki Manual - What's new?|What's new?]]{{-}}&lt;br /&gt;
[[File:Linux_220x261.png|128px|link=Download#Linux]]  [[File:windows_180x160.png|128px|link=Download#MS_Windows]] [[File:macos_200x200.png|128px|link=Download#macOS]]  [[File:Bsd daemon.png|128px|link=Download#BSD]]}} &lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
&lt;br /&gt;
[[File:Linux_220x261.png|128px|left|link=Download#Linux]]&lt;br /&gt;
&lt;br /&gt;
Before upgrading your distribution: Use your '''earlier version of Gramps''' to [[How_to_make_a_backup#Gramps_version_3.3_and_later|backup]] your Family Trees to the hardy and portable [[#1|XML format&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;[[Download#Linux distributions|via Distributions]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;u&amp;gt;[[Download#Flathub|via Flathub]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;u&amp;gt;[[Download#Linux:_Install_latest_version|Latest version ({{version}}) (advanced users only)]]&amp;lt;/u&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== MS Windows ==&lt;br /&gt;
[[File:windows_180x160.png|128px|left|link=Download#MS_Windows]]&lt;br /&gt;
&lt;br /&gt;
Before downloading the All-In-One software installer bundle for Windows: Use your '''earlier version of Gramps''' to [[How_to_make_a_backup#Gramps_version_3.3_and_later|backup]] your Family Trees to the hardy and portable [[#1|XML format&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;]]. &lt;br /&gt;
&lt;br /&gt;
This installer supports Microsoft Windows in all versions [http://windows.microsoft.com/en-au/windows/lifecycle Vista/7] and later. The 64-bit versions of Windows allow more efficient access to more resources. &lt;br /&gt;
&lt;br /&gt;
(''Please note: Gramps prefers the Python-3.5 and Gtk-3.18 libraries and newer. Those libraries have dropped support for Windows XP. But Gramps can still be run on Windows XP with earlier library versions, i.e., Python3.4.4 and Gtk-3.16'')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
*&amp;lt;u&amp;gt;[{{github_url}}/releases/download/v{{version_windows_AIO64}}/{{filename_windows_AIO64}}.exe Windows Installer (64-bit) {{version_windows_AIO64}}]&amp;lt;/u&amp;gt;&lt;br /&gt;
*&amp;lt;u&amp;gt;[{{github_url}}/releases/download/v{{version_windows_AIO32}}/{{filename_windows_AIO32}}.exe Windows Installer (32-bit) {{version_windows_AIO32}}]&amp;lt;/u&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;!-- preserve in case an installer rebuild is needed in the future&lt;br /&gt;
{{man note|''The {{version_windows_AIO64}} and {{version_windows_AIO64}}-2 installers are the '''same version of the Gramps program'''. |Only the compilation of the installer was changed. The initial Windows installer was quickly recalled so that the 'dash two' update could restore some omitted dependency items.''}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After download: '''double-click to install Gramps'''. &amp;lt;br&amp;gt;By default: new releases will be added in a new directory and earlier installations of Gramps will ''not'' be overwritten; the language will be a [[#Missing_other_languages|mix of British and US English]].&lt;br /&gt;
&lt;br /&gt;
{{man tip|Shortcuts|During installation, one shortcut is placed on the desktop and two shortcuts are added the Start menu. &amp;lt;br&amp;gt;''Please only use the 'console' secondary shortcut when performing diagnostics requested by a developer.''&amp;lt;br&amp;gt;1) ''GrampsAIO'''XX''' ''{{version}}''       {{man menu|	&amp;amp;larr; for normal use of Gramps}}&amp;lt;br&amp;gt;2) ''GrampsAIO'''XX''' ''{{version}}''-console}}&lt;br /&gt;
&lt;br /&gt;
Normally, when you try to load your old Family Tree you can allow it to be upgraded if necessary, and it will be opened. Should this fail for any reason, '''Create''' a new Family Tree and [[How_to_restore_a_backup|'''Import''' the back-up]] into this new Tree.&lt;br /&gt;
&lt;br /&gt;
Use the Windows AIO (All-In-One) version, please use the download links above. For more information about individual versions, console and debug modes, release notes, etc., look at [[GrampsAIO cx freeze-based|this page]] (English only). Or, you might want to look at the description of what is meant by an [[All_In_One_Gramps_Software_Bundle_for_Windows|All In One Bundle.]]&lt;br /&gt;
&lt;br /&gt;
=== Alternative independent installation ===&lt;br /&gt;
[[File:Gramps-release.png|left]]&lt;br /&gt;
If needed, there are alternatives to the All-In-One installer.&lt;br /&gt;
&lt;br /&gt;
==== PortableApps.com ====&lt;br /&gt;
A [https://portableapps.com/apps/education/gramps_portable '''PortableApps''' version] will run from an external device without the requirement of installing on the OS drive. PortableApps installations are &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; for touchscreen-based mobile devices. They just allow the application to run from external storage, USB thumbdrives.&lt;br /&gt;
&lt;br /&gt;
As of {{CURRENTDAYNAME}}, {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}, the most current Gramps release is the {{TEMPLATE:version}} version.  &lt;br /&gt;
&lt;br /&gt;
You can download the '''{{Version_windows_portable}} Gramps Portable version''' from:&lt;br /&gt;
* the [https://portableapps.com/apps/education/gramps_portable Gramps Portable project] page in their [https://portableapps.com/apps/education/ Education] category. &lt;br /&gt;
&lt;br /&gt;
Note that '''PortableApps.com''' also has a Legacy 3.4.9 version of Gramps available -- although it is not recommended for general use; just for recovering older format databases.&lt;br /&gt;
* [http://sourceforge.net/projects/portableapps/files/Gramps%20Portable/ GrampsPortable_3.4.9.paf.exe] (29.0 MB) &lt;br /&gt;
&lt;br /&gt;
[http://portableapps.com/apps/education/gramps_portable Portable Gramps from PortableApps.com] includes all dependencies required for Windows. ''Note:You can install it on C: then to run Gramps type C:\PortableApps\GrampsPortable\GrampsPortable.exe (Or the path you installed it to) or make a shortcut to that file on your desktop or start-menu.'' By Bart.S - '''[http://portableapps.com/blog/84601 Please report packaging issues to the author.]''' (2012-09-07)&lt;br /&gt;
&lt;br /&gt;
==== Chocolatey NuGet Package ====&lt;br /&gt;
You may also install using the alternative independent Gramps Chocolatey NuGet Package&lt;br /&gt;
&lt;br /&gt;
Chocolatey NuGet is a Machine Package Manager, somewhat like apt-get, but built with Windows in mind.&lt;br /&gt;
&lt;br /&gt;
* [https://chocolatey.org/packages/gramps/ Gramps Chocolatey Package]&lt;br /&gt;
&lt;br /&gt;
==== Gramps for Windows with MSYS2 ====&lt;br /&gt;
&lt;br /&gt;
How to use [https://www.msys2.org/ MSYS2] to run latest Gramps development version from source in 64bit Windows.&lt;br /&gt;
&lt;br /&gt;
* [[Gramps for Windows with MSYS2]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Missing other languages ===&lt;br /&gt;
[[File:Microsoft Window Gramps AIO Installer Choose Components-Selection-51.png|right|thumb|450px|Microsoft Window Gramps AIO Installer Choose Components-Selection window.]]&lt;br /&gt;
The default Gramps AIO installer will embed the US dialect of English for the interface with the British spellcheck dictionary. &lt;br /&gt;
&lt;br /&gt;
If you prefer a different language (or spell with the US or Australian dialects of English), please ensure that you pay special attention to the Choose Components phase of the installation.&lt;br /&gt;
&lt;br /&gt;
To install a language other than English, select from both the '''Translations''' ''and'' '''Dictionaries''' during the Choose Components phase of the installation.&lt;br /&gt;
&lt;br /&gt;
Even your primary language is installed by default, you might anticipate the need to spellcheck Notes in other than the British dialect of English. Be certain to select the appropriate languages from '''Dictionaries'''. Gramps will not access your Operating System's native dictionary.&lt;br /&gt;
&lt;br /&gt;
There is no simple facility for adding interface or dictionary languages after installation.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Mac OS X&amp;gt;&amp;lt;!-- backward compatibility hyperlinking anchor--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== macOS ==&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
[[File:macos_200x200.png|128px|left|link=Download#Mac_OS_X]] &lt;br /&gt;
&lt;br /&gt;
Before downloading the ready-to-run stand-alone bundle: Use your '''earlier version of Gramps''' to [[How_to_make_a_backup#Gramps_version_3.3_and_later|backup]] your Family Trees to the hardy and portable [[#1|XML format&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;]]. Read the [[Mac OS X:Application package|before installation]] instructions.&lt;br /&gt;
&lt;br /&gt;
Tested for compatibility with Apple macOS/Mac OS X versions 10.5 ([https://wikipedia.org/wiki/Mac_OS_X_Leopard Leopard]) through 11 ([https://wikipedia.org/wiki/MacOS_Big_Sur Big Sur]). ''Help determining your Operating System version can be found in the [https://support.apple.com/en-us/HT201260 HT201260 Apple Support article.]''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[{{github_url}}/releases/download/v{{version_Mac}}/{{Filename_mac_intel}}.dmg Intel {{version_Mac}}]&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After download: Double-click the .dmg file to mount the disk (note: your browser may do this for you automatically). Next, drag the Gramps application to your application folder and double-click to launch it. (For Apple Mac OS X, alternatively, you can click and hold on the disk icon at the top of the window of the mounted disk, and then option-drag to the Applications folder. This will create a new folder containing all the files, including the README and NEWS.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Normally, when you try to load your old Family Tree you can allow it to be upgraded if necessary, and it will be opened. Should this fail for any reason, '''Create''' a new Family Tree and [[How_to_restore_a_backup|'''Import''' the back-up]] into this new Tree.&lt;br /&gt;
&lt;br /&gt;
=== Alternative independent installation ===&lt;br /&gt;
[[File:Gramps-release.png|left]]&lt;br /&gt;
Alternatively, Gramps can also be installed on macOS using either the MacPorts or Homebrew package manager systems.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
==== MacPorts ====&lt;br /&gt;
&lt;br /&gt;
MacPorts is a package manager for Apple Mac.&lt;br /&gt;
&lt;br /&gt;
* [[Mac_OS_X:Build_from_source:MacPorts]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Homebrew ====&lt;br /&gt;
[https://wikipedia.org/wiki/Homebrew_(package_manager) Homebrew] is an open-source package manager for macOS (and Linux). &lt;br /&gt;
&lt;br /&gt;
See https://github.com/homebrew/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Adding additional Spell Checking languages on macOS ===&lt;br /&gt;
{{man tip|[[Mac_OS_X:Application_package#Dictionaries|Spell Checking:]]|Gramps uses a different spell checker than the one provided by Mac OS X, with different spelling dictionary requirements. We can't easily provide dictionaries for all of the supported languages in the bundle, but they're easily downloaded from [https://extensions.openoffice.org/ OpenOffice.org's website]. Download the language you want and save it, then navigate to the download in Finder. Most browsers have a downloads window that offers &amp;quot;Show in Finder&amp;quot; in its context menu. Change the file extension from &amp;lt;tt&amp;gt;oxt&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;zip&amp;lt;/tt&amp;gt;, then from the context menu select '''Open with... Archive Utility''' to decompress it. In the decompressed folder or perhaps in a subfolder you'll find the dictionary files in pairs, &amp;lt;tt&amp;gt;foo.aff&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;foo.dic&amp;lt;/tt&amp;gt;. Some languages have more than one pair with a README file to explain why. Select a pair and copy it to /Library/Dictionaries (you'll have to authenticate with an administrator id and password), and if 'foo' isn't already a language or locale code, make it one. For example, the French package includes several pairs with names like &amp;lt;tt&amp;gt;fr-moderne.aff&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;fr-moderne.dic&amp;lt;/tt&amp;gt;. The spell checker doesn't recognize those names, so when you copy them to /Library/Dictionaries you must rename them to &amp;lt;tt&amp;gt;fr.aff&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;fr.dic&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;fr_FR.aff&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;fr_FR.dic&amp;lt;/tt&amp;gt;. You can have more than one dictionary pair installed if you use several languages, but one '''must''' match the language you use for Gramps or spell checking won't be enabled at all.}}&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;Linux distributions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Linux and BSD distributions ==&lt;br /&gt;
{{man note|These packages are built and supported by the [https://en.wikipedia.org/wiki/Linux_distribution distros].|If your distribution is not listed you may possibly find it listed on [https://repology.org/metapackage/gramps/versions ''Repology'']&amp;lt;br&amp;gt;Please report any problems with them to the package maintainer.}}&lt;br /&gt;
Most Linux distributions come bundled with a version of Gramps, though it's not always the most recent version and it may not have been installed by default. Still it is recommended to use the Gramps version that comes with your distribution.&lt;br /&gt;
&lt;br /&gt;
Below are ways to install Gramps on some of the more popular distributions:&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!style=&amp;quot;width: 85pt;&amp;quot; | Distribution&lt;br /&gt;
!GUI Package manager&lt;br /&gt;
!Current versions&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Debianopenlogo-32.png|link=https://packages.debian.org/search?keywords=gramps]]''' [[Debian]] '''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;Add/Remove Software&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Debian 8 (&amp;quot;jessie&amp;quot;)(old old old stable): Gramps 4.1.1&amp;lt;!-- Debian 8 EOL ~2020-06-30  https://wiki.debian.org/DebianReleases#Production_Releases / Extended Long Term Support until ~2022-06-30 --&amp;gt;&lt;br /&gt;
* Debian 9 (&amp;quot;stretch&amp;quot;) (old old stable): Gramps 4.2.5&lt;br /&gt;
* Debian 9 (&amp;quot;stretch&amp;quot;)([https://packages.debian.org/stretch-backports/gramps backports]): Gramps 5.0.1&lt;br /&gt;
* Debian 10 (&amp;quot;buster&amp;quot;) (old stable): Gramps 5.0.1&lt;br /&gt;
* Debian 10 (&amp;quot;buster&amp;quot;)([https://packages.debian.org/buster-backports/gramps backports]) (stable): Gramps 5.1.2&lt;br /&gt;
* Debian 11 (&amp;quot;bullseye&amp;quot;)(stable): Gramps 5.1.3&lt;br /&gt;
* bookworm (testing): Gramps 5.1.4&lt;br /&gt;
* [http://packages.debian.org/sid/gramps sid (unstable)]: Gramps 5.1.4&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[http://packages.debian.org/search?keywords=gramps available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Ubuntu_32x32.png]] '''[https://ubuntu.com/ Ubuntu]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;Software Centre&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Xenial (16.04 LTS): Gramps: 4.2.2&lt;br /&gt;
* Xenial (16.04 LTS): Gramps: 4.2.6 ([https://launchpad.net/~rosco2/+archive/ubuntu/backports Backport])&lt;br /&gt;
* Bionic Beaver (18.04 LTS): Gramps: 5.0.0&lt;br /&gt;
* Eoan (19.10): Gramps: 5.0.1&lt;br /&gt;
* Focal (20.04 LTS): Gramps: 5.1.2&lt;br /&gt;
* Groovy Gorilla (Development: 20.10): Gramps: 5.1.3&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[http://packages.ubuntu.com/search?keywords=gramps&amp;amp;searchon=names available versions]/ (Also see: [https://launchpad.net/~rosco2/+archive/ubuntu/backports Backports])&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Farm-Fresh linux mint.png]]''' [https://www.linuxmint.com/ Linux Mint]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;Software Manager&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* 18.x(Gramps 4.2.2~dfsg-1)&lt;br /&gt;
* 19.x(Gramps 4.2.8)&lt;br /&gt;
* 20.x(Gramps 5.1.2)&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;&lt;br /&gt;
* Use the &amp;quot;Software Manager&amp;quot; to install a recent version.&lt;br /&gt;
* Manually install the most current version of Gramps using the following [https://forums.linuxmint.com/viewtopic.php?t=220159 instructions] from the ''Linux Mint Forums''&lt;br /&gt;
* [http://community.linuxmint.com/software/view/gramps Old versions available from Linuxmint]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Fedora_32x32.png]] '''[https://getfedora.org/ Fedora]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;Add/Remove Software (Gnome)&amp;lt;br&amp;gt;or&amp;lt;br&amp;gt;Software Management (KDE)&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Rawhide (Gramps 5.1.4)&lt;br /&gt;
* Fedora 33 (Gramps 5.1.4)&lt;br /&gt;
* Fedora 34 (Gramps 5.1.4)&lt;br /&gt;
* Fedora 35 (Gramps 5.1.4)&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[https://koji.fedoraproject.org/koji/packageinfo?packageID=1969 available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;'''[https://www.mageia.org/en/ Mageia]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;|[https://wiki.mageia.org/en/Installing_and_removing_software drakrpm (or rpmdrake)]&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Mageia [https://madb.mageia.org/package/show/name/gramps/release/cauldron/ Caulron]: Gramps 5.1.4&lt;br /&gt;
* Mageia 7.1: Gramps 5.0.1&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[http://mageia.madb.org/package/show/name/gramps Mageia App Db - gramps]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:OpenSUSE-distribution-icon.png|32px]] '''[https://www.opensuse.org/ openSUSE]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;[https://en.opensuse.org/YaST_Software_Management YaST]&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* openSUSE Tumbleweed: Gramps 5.1.4&lt;br /&gt;
* openSUSE Leap 15.2: Gramps 4.2.8&lt;br /&gt;
* openSUSE Leap 15.1: Gramps 4.2.8&lt;br /&gt;
* openSUSE Leap 15.0: Gramps 4.2.8&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[https://software.opensuse.org/package/gramps available versions]&amp;lt;br&amp;gt;The most recent version can usually be installed from the 'openSUSE BuildService - GNOME:Apps' repository&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Slackware-distribution-icon.jpg|32px]] '''[http://www.slackware.com/ Slackware]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* 14.2: Gramps 4.2.6&lt;br /&gt;
* 14.2: Gramps 5.1.2 - [https://slackbuilds.org/repository/14.2/misc/gramps/?search=gramps slackbuilds.org]&lt;br /&gt;
* 14.1: Gramps 4.0.3&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[https://pkgs.org/search/?q=gramps available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:archlinux-icon-crystal-32.svg]] '''[https://www.archlinux.org/ Arch Linux]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt; [https://wiki.archlinux.org/index.php/pacman pacman]&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Gramps 5.1.4&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[https://www.archlinux.org/packages/community/any/gramps/ available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;[[File:Gentoo-distribution-icon.png|32px]]'''[https://gentoo.org Gentoo Linux]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* Gramps 5.1.4&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[https://packages.gentoo.org/packages/app-misc/gramps available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;'''[https://www.netbsd.org/ NetBSD]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* NetBSD: [http://pkgsrc.se/databases/gramps5 Gramps 5.1.2]&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;'''[https://www.freebsd.org/ FreeBSD]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* FreeBSD: Gramps 4.2.8&lt;br /&gt;
* [https://www.freshports.org/science/gramps/ FreshPorts: Gramps 5.1.4]&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;&amp;lt;!--[http://portsmon.freebsd.org/portoverview.py?category=science&amp;amp;portname=gramps available versions]--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;'''[https://www.openbsd.org/ OpenBSD]'''&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
* OpenBSD: Gramps 5.1.3&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;[http://openports.se/misc/gramps available versions]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Distribution        --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- GUI Package manager --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Current versions    --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Notes               --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Linux: Install latest version ==&lt;br /&gt;
&lt;br /&gt;
If your distribution doesn't ship with Gramps or you wish to install a different version than it ships with, you could try to install the latest version of Gramps manually.&lt;br /&gt;
&lt;br /&gt;
{{man warn|1=Warning before attempting this use your existing installation to [[How to make a backup|make a Gramps XML backup]]|2=This should only be attempted by experienced users, and after you have backed up your Family Tree.&lt;br /&gt;
&lt;br /&gt;
The version of Gramps that has been included in your distribution will have been tested to work with the components in that distribution. If you try to install a different version of Gramps there is a possibility that the components needed for the new version of Gramps are not available for your distribution, or they are available, but don't work properly. You might not discover that there is a problem till you have already done some work with the new version of Gramps.&lt;br /&gt;
&lt;br /&gt;
If you already have Gramps installed, and you are only making a 'point' upgrade (i.e. from Gramps x.y.z to x.y.z+1, e.g. from 3.4.3 to 3.4.4), then it is likely but not certain that Gramps will continue to work. However, if the change is much greater, especially if it is a major version change (e.g. from 2.y.z to 3.y.z), then the danger that it does not work properly is much greater.}}&lt;br /&gt;
&lt;br /&gt;
=== Debian-based ===&lt;br /&gt;
For [[File:Debianopenlogo-32.png|link=Download#Debian-based]]'''[[Debian|Debian-based linux distributions]]''' (Which includes [[File:Ubuntu_32x32.png|link=Download#Debian-based]]''' Ubuntu ''') &amp;lt;!--[{{github_url}}/releases/v5.1.3 Download the .deb file].--&amp;gt;[{{github_url}}/releases/v{{version}} Download the .deb file]. Double-click on the downloaded .deb file or (for some distributions, e.g. Mint Debian) run the following command from the directory where the file was saved ({{man menu|change the filename to match the one you downloaded}}).&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i gramps_{{version}}-1_all.deb&lt;br /&gt;
&lt;br /&gt;
If you have an error about having unmet dependencies run:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get -f install&lt;br /&gt;
&lt;br /&gt;
to install the dependencies.&lt;br /&gt;
&lt;br /&gt;
If you see an error about an incomplete GTK installation and missing language translations when starting Gramps, run&lt;br /&gt;
&lt;br /&gt;
 sudo apt install language-pack-gnome-en&lt;br /&gt;
&lt;br /&gt;
to install the proper language pack. You may need to replace 'en' with your own language code, like 'nl' for Dutch.&lt;br /&gt;
 &lt;br /&gt;
==== Useful command lines ====&lt;br /&gt;
Before upgrading you can[https://sourceforge.net/p/gramps/mailman/message/35460486/]:&lt;br /&gt;
&lt;br /&gt;
* Find out what version you are running, by using this:&lt;br /&gt;
&lt;br /&gt;
    dpkg-query -s gramps&lt;br /&gt;
&lt;br /&gt;
that queries the package and gives you info about it.&lt;br /&gt;
&lt;br /&gt;
* If you are committed to an upgrade then make sure you have backed up you Family Trees to Gramps XML then run :&lt;br /&gt;
&lt;br /&gt;
    sudo dpkg -r gramps&lt;br /&gt;
&lt;br /&gt;
this will remove the current gramps package (assuming its a python3 version older versions could be python-gramps )&lt;br /&gt;
&lt;br /&gt;
* To stop Ubuntu updating gramps (to possibly an older version from Ubuntu!) you may need to run:&lt;br /&gt;
&lt;br /&gt;
    sudo apt-mark hold gramps&lt;br /&gt;
&lt;br /&gt;
'''Upgrade is then complete.'''&lt;br /&gt;
&lt;br /&gt;
=== Flathub ===&lt;br /&gt;
&lt;br /&gt;
Gramps 5.1.4 is available in a flatpak at flathub.&lt;br /&gt;
&lt;br /&gt;
{{man note|Please use your existing installation to backup your database before proceeding.|Also, it is a good idea to [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Converting_a_BSDDB_Family_Tree_to_SQLite|convert your database to SQLite]] even though there is currently BSDDB3 support in the 5.1.4 flatpak.}}&lt;br /&gt;
&lt;br /&gt;
First set up flatpak and the flathub repository on your system, there are instructions for various distributions at https://flatpak.org/setup/&lt;br /&gt;
&lt;br /&gt;
Second, you can use the blue install button at https://flathub.org/apps/details/org.gramps_project.Gramps if you set your software manager up to work with flathub, or use the command below in a terminal for a system wide installation if you have sudo privileges:&lt;br /&gt;
&lt;br /&gt;
 flatpak install flathub org.gramps_project.Gramps&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== For other distributions ===&lt;br /&gt;
For other distributions, [[File:Download_link.png|150px|link={{github_url}}/releases/v{{version}}]] the source and follow the instructions for [[Linux:Build from source]]&lt;br /&gt;
&lt;br /&gt;
== BSD ==&lt;br /&gt;
&lt;br /&gt;
[[File:Bsd daemon.png|128px|left|link=Download#BSD]]&lt;br /&gt;
&lt;br /&gt;
Before upgrading your distribution: Use your '''old version of Gramps''' to [[How_to_make_a_backup#Gramps_version_3.3_and_later|backup]] your Family Trees [[#1|[1]]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;[[Download#Linux and BSD distributions|via Distributions]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;u&amp;gt;[[Download#Linux:_Install_latest_version|Latest version (advanced users only)]]&amp;lt;/u&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[BSD platforms]]&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Linux Live CD ==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Note that both Live CD demonstrations use an old version of Gramps and it is not recommended for general use}} &lt;br /&gt;
&lt;br /&gt;
[[File:Download_link.png|150px|left|link=https://sourceforge.net/projects/gramps/files/gramps-cdrom/lgenealogy-6.1-desktop-i386.iso/download]]&lt;br /&gt;
'''Linux live CD Demonstration''' includes Gramps {{Version Linux Live CD}} pre-installed to trial, without touching anything on the hard drive. To start this boot the Computer with this Live Linux Desktop on a CD in the CD/DVD-ROM Drive. (Requires that you write this image to a CD-ROM using CD-Burner software eg:Nero, Imgburn..). [[Linux_Genealogy_CD#Download_the_CD|Download the CD]] (727 MB). The [[Linux Genealogy CD|Linux Genealogy CD is based on Ubuntu 10.10 (Maverick Meerkat)]].  If you are interested in Gramps, but are afraid to actually install it or unable to install it (not your PC, windows, no internet at home, work laptop, ...), then try out our [[Linux Genealogy CD]]. It runs without installing on the hard disk and contains a collection of open source, free, genealogy programs. You can then install latest [http://www.ubuntulinux.org/ Ubuntu] and Gramps from the CD anytime you like.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Online Demonstration ==&lt;br /&gt;
{{man note|Note|This is a commercial limited trial and not endorsed by the Gramps-project. Beware of third parties having your genealogical data.}}&lt;br /&gt;
&lt;br /&gt;
You can also try an online demonstration of Gramps on rollApp:&lt;br /&gt;
* https://www.rollapp.com/app/gramps&lt;br /&gt;
Select '''Launch Online''' then '''Test Drive(Opening/saving files will not be available)'''&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
[&amp;lt;span id=&amp;quot;1&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;]&lt;br /&gt;
Backup to Gramps XML. You will find backup in the Family Tree menu of recent Gramps versions, otherwise use export in the same menu but '''uncheck privacy options''' in the Exporter Assistant in order to export all data. See : [[How to make a backup]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Previous releases of Gramps]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=All_In_One_Gramps_Software_Bundle_for_Windows&amp;diff=89831</id>
		<title>All In One Gramps Software Bundle for Windows</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=All_In_One_Gramps_Software_Bundle_for_Windows&amp;diff=89831"/>
		<updated>2022-01-18T16:19:45Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: /* Installation folder */ Provide examples of Gramps installation path.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man warn|Gramps 3.4 and earlier.|Any files listed here may be '''not suitable''' for normal every day use! (My lawyer advised me to say that, but many people are using this and have reported no problems at all.)&amp;lt;br/&amp;gt;Any comments and help (e.g. on wiki pages) are welcome. Josip&amp;lt;br/&amp;gt;{{man menu|For Gramps 4.x and newer see [[GrampsAIO-4]]}}}}&lt;br /&gt;
&lt;br /&gt;
The '''Gramps &amp;quot;software bundle&amp;quot; for Windows''' or '''GrampsAIO''' is an all-in-one (a.k.a. &amp;quot;AIO&amp;quot;) installation package of Gramps which includes all dependencies for the Windows platform.  (See also [[Gramps and Windows]].)&lt;br /&gt;
&lt;br /&gt;
Not only are all dependencies included (&amp;quot;bundled&amp;quot;), so that users do not have to first manually install each one of them, but they are&lt;br /&gt;
installed in such a fashion that Gramps can easily find them.&lt;br /&gt;
&lt;br /&gt;
For the technically sophisticated, GrampsAIO is rebuild-able: it contains an install script which can make a new installable program from the installed one.&lt;br /&gt;
&lt;br /&gt;
For example somebody might like to repackage Gramps with their code changes, or favorite addons, or even their own family trees, etc. &lt;br /&gt;
&lt;br /&gt;
==Technical details==&lt;br /&gt;
The Windows logic for this bundle is that the first entry in the search path is the current working directory... the one in which the program is started. So, if any Gramps dependency is in that same working directory, there is no need to look further for that dependency in a system folder. This eliminates the possibility of loading an incompatible one -- thus &amp;quot;dependency hell&amp;quot; is avoided. This is also the reason why GrampsAIO must be started from its own folder.  Also, in newer Windows versions there may be security restriction with shell scripts so GrampsAIO does not use one.)&lt;br /&gt;
&lt;br /&gt;
==Installation folder==&lt;br /&gt;
This distribution is directory based, which means it loads all dependencies from the directory in which they have been installed.&lt;br /&gt;
&lt;br /&gt;
That folder's location depends on whether the person doing the installation has administrative rights on the Windows machine.  If an administrator installs it, the directory may be chosen. In that case, the default suggestion being &amp;lt;code&amp;gt;%ProgramFiles%\GrampsAIO&amp;lt;/code&amp;gt; (for example &amp;lt;code&amp;gt;C:\Program Files\GrampsAIO&amp;lt;/code&amp;gt;).  If a non-administrator installs it, it will be placed in the user's personal workspace, in &amp;lt;code&amp;gt;%APPDATA%\GrampsAIO&amp;lt;/code&amp;gt; (for example &amp;lt;code&amp;gt;C:\Documents and Settings\Jones\Application Data\GrampsAIO&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
As an example, a user with administrator rights using GrampsAOI-{{template:Version windows AIO64}}_win64.exe installer and accepting the standard destination folder during installation, &amp;lt;code&amp;gt;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;lt;/code&amp;gt; would be the location for the Gramps executable. While not common, installing the 32-bit version of Gramps on a 64-bit OS, the path would be &amp;lt;code&amp;gt;C:\Program&amp;amp;nbsp;Files&amp;amp;nbsp;(x86)\GrampsAIO32-{{template:Version windows AIO32}}&amp;lt;/code&amp;gt;. Finally, if you chose to install Gramps in a non-standard directory, use that folder path instead instead.&lt;br /&gt;
&lt;br /&gt;
To use it from the console (cmd.exe prompt), you must first go to the directory where the dependencies were installed (&amp;lt;code&amp;gt;GrampsAIO\bin&amp;lt;/code&amp;gt;); for example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
cd C:\GrampsAIO\bin; python -EO ..\share\gramps\gramps.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(but the installation may have been put somewhere else and so you should probably first search for the GrampsAIO\bin folder to make sure).&lt;br /&gt;
&lt;br /&gt;
==Why GrampsAIO was made==&lt;br /&gt;
* easy installation:&lt;br /&gt;
** no searching web for appropriate packages&lt;br /&gt;
** one click install&lt;br /&gt;
* no dependency hell:&lt;br /&gt;
** all libraries work together&lt;br /&gt;
** on upgrade of a library all other libraries are rebuilt with that version&lt;br /&gt;
&lt;br /&gt;
==How GrampsAIO was made==&lt;br /&gt;
* Place all software Gramps needs in one package:&lt;br /&gt;
# all core non-python libraries and applications&lt;br /&gt;
# any optional non-python libraries and applications&lt;br /&gt;
# python bindings for core libraries&lt;br /&gt;
# python bindings for optional libraries&lt;br /&gt;
* use NSIS (Nullsoft Script-able Install System)&lt;br /&gt;
&lt;br /&gt;
==Software releases:==&lt;br /&gt;
&lt;br /&gt;
The preferred way to get the GrampsAIO bundle is to download it from the official Gramps software repository.  See [[Download#MS Windows|Download]] for the current version and link to it.&lt;br /&gt;
&lt;br /&gt;
You can follow progress of GrampAIO-4 bundle development at their [[GrampsAIO-4|page]] Older versions or developmental versions are available directly from the GrampsAIO bundle's author.  See below.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[https://nsis.sourceforge.io/Creating_language_files_and_integrating_with_MUI#Another_solution:_Native_PO_File_support Native PO File support] for NSIS (Nullsoft Scriptable Install System)&lt;br /&gt;
*[[GrampsAIO-3]]&lt;br /&gt;
*[[GrampsAIO-4]]&lt;br /&gt;
*[[GrampsAIO-4 package updating]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers/Packaging]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Command_Line&amp;diff=89830</id>
		<title>Gramps 5.1 Wiki Manual - Command Line</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Command_Line&amp;diff=89830"/>
		<updated>2022-01-18T16:16:51Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Centralize installation folder information in All_In_One_Gramps_Software_Bundle_for_Windows &amp;gt; Installation folder section instead adding details here.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Keybindings|Gramps 5.1 Wiki Manual - User Directory|5.1}} &lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Command_Line}}&lt;br /&gt;
{{#vardefine:chapter|C}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
This appendix provides the reference to the command line capabilities available when launching Gramps from the terminal.&lt;br /&gt;
&lt;br /&gt;
== Start Gramps through the Command Line ==&lt;br /&gt;
&lt;br /&gt;
Normally Gramps is started through the graphical user interface (GUI) on [[Gramps_5.1_Wiki_Manual_-_Getting_started#Start_Gramps|your platform]].&lt;br /&gt;
&lt;br /&gt;
It is also possible to start Gramps using a command line interface (CLI). CLI use can&lt;br /&gt;
* produce reports that are not available via the GUI, &lt;br /&gt;
* create reports, do conversions etc. without opening a window and&lt;br /&gt;
* can provide [[Gramps_5.1_Wiki_Manual_-_Main_Window#Seeing_all_the_error_messages|extra information]] in the event of problems.&lt;br /&gt;
&lt;br /&gt;
This section of the user manual describes how to start Gramps through the CLI, and the features that are available.&lt;br /&gt;
&lt;br /&gt;
The way you start Gramps through the CLI depends on the operating system you are using.&lt;br /&gt;
&lt;br /&gt;
For simplicity of description, the examples of use below are written from the point of view of running Gramps on Linux. The examples would need to be changed for other platforms.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
Only the Linux platform is officially supported as Gramps developers use and test the source code on that platform, fixing any problems that arise due to upgrades.&lt;br /&gt;
&lt;br /&gt;
Assuming you have used the standard Package Manager (either through a CLI or a GUI) for your Linux distribution, you start Gramps through the CLI by typing&lt;br /&gt;
 gramps&lt;br /&gt;
&lt;br /&gt;
=== MS Windows ===&lt;br /&gt;
&lt;br /&gt;
MS Windows is a [[Download|community supported]] platform. If you install the [[All_In_One_Gramps_Software_Bundle_for_Windows|Windows AIO bundle]], then this will place an icon on the desktop as well as a menu item in the 'Start' menu. However, the Gramps installation directory is not added to the system path and to run gramps via CLI, we need to know the path to that directory.  To find the installation folder, refer to [[All_In_One_Gramps_Software_Bundle_for_Windows#Installation_folder|AIO bundle's installation folder section]].&lt;br /&gt;
&lt;br /&gt;
To find the path using a shortcut icon instead,&lt;br /&gt;
* Right-click on the &amp;lt;code&amp;gt;GrampsAIO64&amp;amp;nbsp;{{template:Version windows AIO64}}-console&amp;lt;/code&amp;gt; application, or the corresponding item in the Start menu.&lt;br /&gt;
* Note down the file location (its &amp;quot;Start in' directory).&lt;br /&gt;
* Select the full path and copy ({{man key press|Ctrl|c}}) it.&lt;br /&gt;
&lt;br /&gt;
To run Gramps from the command line, you'll need to start a console window:&lt;br /&gt;
* From the Start menu, start cmd.exe.&lt;br /&gt;
* Change directory to the installation directory you located.&lt;br /&gt;
* Type in or paste the path, surrounding it in quotes if there are spaces.&lt;br /&gt;
* Press {{man key press|Enter}}.&lt;br /&gt;
&lt;br /&gt;
For example, this might be:&lt;br /&gt;
 cd &amp;quot;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;quot;&lt;br /&gt;
 gramps&lt;br /&gt;
&lt;br /&gt;
You may use any of the command-line options along with this. For example, to get a detailed listing of all of the Family Tree databases in your default Family Tree folder, you would append &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;&lt;br /&gt;
 cd &amp;quot;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;quot;&lt;br /&gt;
 gramps -L&lt;br /&gt;
&lt;br /&gt;
See example usage https://github.com/gramps-project/addons-source/pull/121&lt;br /&gt;
&lt;br /&gt;
=== MacOS ===&lt;br /&gt;
&lt;br /&gt;
MacOS is a [[Download|community supported]] platform. If you download the MacOS disk image (.dmg), then you simply drag the application to your application folder (or anywhere else you want to store it) and start Gramps by double clicking on the application in the normal way. The Homebrew package manager[https://github.com/Homebrew] also allows for installation of the application in the usual Applications folder.&lt;br /&gt;
&lt;br /&gt;
To run from the command line, you'll need to start Terminal, found in the Utilities folder of the main Applications folder (/Applications/Utilities). Once you have a terminal window open, at the prompt type&lt;br /&gt;
  /path/to/Gramps.app/Contents/MacOS/Gramps&lt;br /&gt;
If you installed Gramps in Applications along with most of your other apps, as suggested above, that would be&lt;br /&gt;
  /Applications/Gramps.app/Contents/MacOS/Gramps&lt;br /&gt;
You may use any of the command-line options along with this. For example, to get a detailed listing of all of the Family Tree databases in your default Family Tree folder, you would use&lt;br /&gt;
  /Applications/Gramps.app/Contents/MacOS/Gramps -L&lt;br /&gt;
&lt;br /&gt;
There are other ways to install Gramps for MacOS, but these are much more complicated and are not covered here.&lt;br /&gt;
&lt;br /&gt;
== Python options ==&lt;br /&gt;
&lt;br /&gt;
In the examples of different platforms above, and also in commands in various files you may see some options after the 'python' command, for example '-EO' in&lt;br /&gt;
 &amp;quot;python3 -EO ..\share\gramps\gramps.py -L&lt;br /&gt;
&lt;br /&gt;
It is important to distinguish between the '''python options''' in this case:&lt;br /&gt;
 -EO&lt;br /&gt;
and the '''Gramps options''', in this case&lt;br /&gt;
 -L&lt;br /&gt;
&lt;br /&gt;
The '''python options''' that you may come across are:&lt;br /&gt;
* &amp;lt;code&amp;gt;-E&amp;lt;/code&amp;gt; Ignore all PYTHON* environment variables, e.g. &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PYTHONHOME&amp;lt;/code&amp;gt;, that might be set.&lt;br /&gt;
* &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; Turn on basic optimizations. This changes the filename extension for compiled (bytecode) files from &amp;lt;code&amp;gt;.pyc&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;.pyo&amp;lt;/code&amp;gt;. See also PYTHONOPTIMIZE.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; optimise flag has a number of effects in Gramps:&lt;br /&gt;
* If it is not turned on, an additional {{man menu|[[Gramps_5.1_Wiki_Manual_-_Tools#Debug|Debug]]}} entry appears in the {{man menu|[[Gramps_5.1_Wiki_Manual_-_Tools|Tools]]}} menu.&lt;br /&gt;
* If it is not turned on, [[Logging_system#So_how_logging_works_in_Gramps_after_all.3F|info logging messages are output]].&lt;br /&gt;
* If it is not turned on, [[Debugging_Gramps#Add_debug_statements|debug statements]] may be activated.&lt;br /&gt;
* If it is not turned on, additional features are available in the [[Gramps_5.1_Wiki_Manual_-_Plugin_Manager|Plugin Manager]].&lt;br /&gt;
&lt;br /&gt;
The '''Gramps options''' are described below.&lt;br /&gt;
&lt;br /&gt;
== Available Gramps options ==&lt;br /&gt;
&lt;br /&gt;
This section provides the reference list of all command line options available in Gramps. If you want to know more than just a list of options, see next sections: [[#Operation|Operation]] and [[#Examples| Examples]]. The summary below is printed by &lt;br /&gt;
 gramps -h&lt;br /&gt;
or&lt;br /&gt;
 gramps --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: gramps.py [OPTION...]&lt;br /&gt;
  --load-modules=MODULE1,MODULE2,...     Dynamic modules to load&lt;br /&gt;
&lt;br /&gt;
Help options&lt;br /&gt;
  -?, --help                             Show this help message&lt;br /&gt;
  --usage                                Display brief usage message&lt;br /&gt;
&lt;br /&gt;
Application options&lt;br /&gt;
  -O, --open=FAMILY_TREE                 Open Family Tree&lt;br /&gt;
  -U, --username=USERNAME                Database username&lt;br /&gt;
  -P, --password=PASSWORD                Database password&lt;br /&gt;
  -C, --create=FAMILY_TREE               Create on open if new Family Tree&lt;br /&gt;
  -i, --import=FILENAME                  Import file&lt;br /&gt;
  -e, --export=FILENAME                  Export file&lt;br /&gt;
  -r, --remove=FAMILY_TREE_PATTERN       Remove matching Family Tree(s) (use regular expressions)&lt;br /&gt;
  -f, --format=FORMAT                    Specify Family Tree format&lt;br /&gt;
  -a, --action=ACTION                    Specify action&lt;br /&gt;
  -p, --options=OPTIONS_STRING           Specify options&lt;br /&gt;
  -d, --debug=LOGGER_NAME                Enable debug logs&lt;br /&gt;
  -l [FAMILY_TREE_PATTERN...]            List Family Trees&lt;br /&gt;
  -L [FAMILY_TREE_PATTERN...]            List Family Trees in Detail&lt;br /&gt;
  -t [FAMILY_TREE_PATTERN...]            List Family Trees, tab delimited&lt;br /&gt;
  -u, --force-unlock                     Force unlock of Family Tree&lt;br /&gt;
  -s, --show                             Show config settings&lt;br /&gt;
  -c, --config=[config.setting[:value]]  Set config setting(s) and start Gramps&lt;br /&gt;
  -y, --yes                              Don't ask to confirm dangerous actions (non-GUI mode only)&lt;br /&gt;
  -q, --quiet                            Suppress progress indication output (non-GUI mode only)&lt;br /&gt;
  -v, --version                          Show versions&lt;br /&gt;
  -S, --safe                             Start Gramps in 'Safe mode'&lt;br /&gt;
                                          (temporarily use default settings)&lt;br /&gt;
  -D, --default=[APXFE]                  Reset settings to default;&lt;br /&gt;
                 A - addons are cleared&lt;br /&gt;
                 P - Preferences to default&lt;br /&gt;
                 X - Books are cleared, reports and tool settings to default&lt;br /&gt;
                 F - filters are cleared&lt;br /&gt;
                 E - Everything is set to default or cleared&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The usage message is as follows:&lt;br /&gt;
&lt;br /&gt;
 gramps --usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Example of usage of Gramps command line interface&lt;br /&gt;
&lt;br /&gt;
1. To import four databases (whose formats can be determined from their names)&lt;br /&gt;
and then check the resulting database for errors, one may type:&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps -i file4.wft -a tool -p name=check.&lt;br /&gt;
&lt;br /&gt;
2. To explicitly specify the formats in the above example, append filenames with appropriate -f options:&lt;br /&gt;
gramps -i file1.ged -f gedcom -i file2.gpkg -f gramps-pkg -i ~/db3.gramps -f gramps-xml -i file4.wft -f wft -a tool -p name=check.&lt;br /&gt;
&lt;br /&gt;
3. To record the database resulting from all imports, supply -e flag&lt;br /&gt;
(use -f if the filename does not allow Gramps to guess the format):&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -e ~/new-package -f gramps-pkg&lt;br /&gt;
&lt;br /&gt;
4. To save any error messages of the above example into files outfile and errfile, run:&lt;br /&gt;
gramps -i file1.ged -i file2.dpkg -e ~/new-package -f gramps-pkg &amp;gt;outfile 2&amp;gt;errfile&lt;br /&gt;
&lt;br /&gt;
5. To import three databases and start interactive Gramps session with the result:&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps&lt;br /&gt;
&lt;br /&gt;
6. To open a database and, based on that data, generate timeline report in PDF format&lt;br /&gt;
putting the output into the my_timeline.pdf file:&lt;br /&gt;
gramps -O 'Family Tree 1' -a report -p name=timeline,off=pdf,of=my_timeline.pdf&lt;br /&gt;
&lt;br /&gt;
7. To generate a summary of a database:&lt;br /&gt;
gramps -O 'Family Tree 1' -a report -p name=summary&lt;br /&gt;
&lt;br /&gt;
8. Listing report options&lt;br /&gt;
Use the name=timeline,show=all to find out about all available options for the timeline report.&lt;br /&gt;
To find out details of a particular option, use show=option_name , e.g. name=timeline,show=off string.&lt;br /&gt;
To learn about available report names, use name=show string.&lt;br /&gt;
&lt;br /&gt;
9. To convert a Family Tree on the fly to a .gramps xml file:&lt;br /&gt;
gramps -O 'Family Tree 1' -e output.gramps -f gramps-xml&lt;br /&gt;
&lt;br /&gt;
10. To generate a web site into an other locale (in German):&lt;br /&gt;
LANGUAGE=de_DE; LANG=de_DE.UTF-8 gramps -O 'Family Tree 1' -a report -p name=navwebpage,target=/../de&lt;br /&gt;
&lt;br /&gt;
11. Finally, to start normal interactive session type:&lt;br /&gt;
gramps&lt;br /&gt;
&lt;br /&gt;
Note: These examples are for bash shell.&lt;br /&gt;
Syntax may be different for other shells and for Windows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List options ===&lt;br /&gt;
Print a list of known family trees:&lt;br /&gt;
&lt;br /&gt;
;Sparse&lt;br /&gt;
 -l, List Family Trees&lt;br /&gt;
&lt;br /&gt;
 gramps -l&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List of known Family Trees in your database path&lt;br /&gt;
&lt;br /&gt;
/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb/5a46c1c3 with name &amp;quot;Example Family Tree&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
;Detailed&lt;br /&gt;
 -L, List Family Trees in Detail&lt;br /&gt;
&lt;br /&gt;
 gramps -L&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Family Trees:&lt;br /&gt;
Family Tree &amp;quot;Example Family Tree&amp;quot;:&lt;br /&gt;
   Database: SQLite&lt;br /&gt;
   Database module location: /usr/lib/python3.6/sqlite3/__init__.py&lt;br /&gt;
   Database module version: 2.6.0&lt;br /&gt;
   Database version: 3.21.0&lt;br /&gt;
   Last accessed: 30/12/17 09:29:37&lt;br /&gt;
   Locked?: False&lt;br /&gt;
   Number of citations: 2854&lt;br /&gt;
   Number of events: 3432&lt;br /&gt;
   Number of families: 762&lt;br /&gt;
   Number of media: 7&lt;br /&gt;
   Number of notes: 19&lt;br /&gt;
   Number of people: 2157&lt;br /&gt;
   Number of places: 1294&lt;br /&gt;
   Number of repositories: 3&lt;br /&gt;
   Number of sources: 4&lt;br /&gt;
   Number of tags: 2&lt;br /&gt;
   Path: /home/&amp;lt;~username&amp;gt;/.gramps/grampsdb/5a46c1c3&lt;br /&gt;
   Schema version: 18.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note that dates are shown in the default LOCALE format.|You change that at the system level. For example, on [[Gramps_Glossary#posix|POSIX]]-based systems you could use: &amp;lt;pre&amp;gt;LC_TIME=en_AU.UTF-8 gramps -L&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Version options ===&lt;br /&gt;
&lt;br /&gt;
 -v or --version prints version of Gramps and dependencies,&lt;br /&gt;
      information about environment settings and python and system paths&lt;br /&gt;
&lt;br /&gt;
 gramps -v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Settings:&lt;br /&gt;
----------------&lt;br /&gt;
 python    : 3.7.5&lt;br /&gt;
 gramps    : 5.1.1&lt;br /&gt;
 gtk++     : 3.24.12&lt;br /&gt;
 pygobject : 3.34.0&lt;br /&gt;
 pango     : 1.42.3&lt;br /&gt;
 cairo     : 1.16.0&lt;br /&gt;
 pycairo   : 1.16.2&lt;br /&gt;
 osmgpsmap : 1.0&lt;br /&gt;
 GExiv2    : 0.10&lt;br /&gt;
 ICU       : 63.1&lt;br /&gt;
 PyICU     : 2.2&lt;br /&gt;
 o.s.      : linux&lt;br /&gt;
 kernel    : 5.3.0-24-generic&lt;br /&gt;
&lt;br /&gt;
Environment settings:&lt;br /&gt;
---------------------&lt;br /&gt;
 LANG      : en_GB.UTF-8&lt;br /&gt;
 LANGUAGE  : en_GB:en&lt;br /&gt;
 GRAMPSI18N: not set&lt;br /&gt;
 GRAMPSHOME: not set&lt;br /&gt;
 GRAMPSDIR : not set&lt;br /&gt;
 PYTHONPATH:&lt;br /&gt;
    /usr/lib/python3/dist-packages/gramps&lt;br /&gt;
    /usr/bin&lt;br /&gt;
    /usr/lib/python37.zip&lt;br /&gt;
    /usr/lib/python3.7&lt;br /&gt;
    /usr/lib/python3.7/lib-dynload&lt;br /&gt;
    /usr/local/lib/python3.7/dist-packages&lt;br /&gt;
    /usr/lib/python3/dist-packages&lt;br /&gt;
&lt;br /&gt;
Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : 2.40&lt;br /&gt;
 Ghostscr. : 9.27&lt;br /&gt;
&lt;br /&gt;
System PATH env variable:&lt;br /&gt;
-------------------------&lt;br /&gt;
     /usr/local/sbin&lt;br /&gt;
     /usr/local/bin&lt;br /&gt;
     /usr/sbin&lt;br /&gt;
     /usr/bin&lt;br /&gt;
     /sbin&lt;br /&gt;
     /bin&lt;br /&gt;
     /usr/games&lt;br /&gt;
     /usr/local/games&lt;br /&gt;
     /snap/bin&lt;br /&gt;
&lt;br /&gt;
Databases:&lt;br /&gt;
-------------------------&lt;br /&gt;
 bsddb     :&lt;br /&gt;
     version     : 6.2.6&lt;br /&gt;
     db version  : 5.3.28&lt;br /&gt;
     location    : /usr/lib/python3/dist-packages/bsddb3/__init__.py&lt;br /&gt;
 sqlite3   :&lt;br /&gt;
     version     : 3.29.0&lt;br /&gt;
     py version  : 2.6.0&lt;br /&gt;
     location    : /usr/lib/python3.7/sqlite3/__init__.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Format options ===&lt;br /&gt;
&lt;br /&gt;
The format of any file destined for opening, importing, or exporting can be specified with the &amp;lt;pre&amp;gt;-f format&amp;lt;/pre&amp;gt; option. The acceptable &amp;lt;tt&amp;gt;''format''&amp;lt;/tt&amp;gt; values are listed below.&lt;br /&gt;
&lt;br /&gt;
==== Full family tree support ====&lt;br /&gt;
These formats contain all your data that is present in a family tree. &lt;br /&gt;
&lt;br /&gt;
* '''gramps''' -  Gramps XML format: This format is available for import, and export. When not specified, it can be guessed if the filename ends with .gramps&lt;br /&gt;
* '''gpkg''' - Gramps package XML format: This format is available for import and export. When not specified, it can be guessed if the filename ends with .gpkg. This creates a zip package with your data as xml, and all your media files included&lt;br /&gt;
* '''grdb''' - pre Gramps 3.x database: This format is available for import to support the old file format of Gramps. Everything in the grdb file is imported. When not specified, it can be guessed if the filename ends with .grdb&lt;br /&gt;
* '''burn''' - GNOME iso burning: export, only available on GNOME where burn protocol exists&lt;br /&gt;
&lt;br /&gt;
==== Reduced family tree support ====&lt;br /&gt;
These formats contain most, but not all data that can be created in Gramps&lt;br /&gt;
&lt;br /&gt;
*'''ged'''  - GEDCOM format: This format is available for import, and export. When not specified, it can be guessed if the filename ends with .ged&lt;br /&gt;
*'''gw''' - GeneWeb file: This format is available for import and export. When not specified, it can be guessed if the filename ends with .gw&lt;br /&gt;
&lt;br /&gt;
==== Subset of your data ====&lt;br /&gt;
These formats contain a specific subset of your data&lt;br /&gt;
&lt;br /&gt;
* '''csv''' - Comma Separated Value: This format is available for import and export. Be careful however, import must be as values created by the export function. Only a part of your data is contained in the output.&lt;br /&gt;
* '''vcf''' - VCard format: import and export&lt;br /&gt;
* '''vcs''' - VCalendar format: export&lt;br /&gt;
* '''def''' - old Pro-Gen format: import&lt;br /&gt;
* '''wft''' - Web Family Tree: This format is available for export only. When not specified, it can be guessed if the filename ends with .wft&lt;br /&gt;
&lt;br /&gt;
=== Opening options ===&lt;br /&gt;
&lt;br /&gt;
You can open a family tree, or you can ''open'' a file by importing it in an empty family tree.&lt;br /&gt;
&lt;br /&gt;
To let Gramps handle this automatically, just supply the family tree or filename you want to open:&lt;br /&gt;
&lt;br /&gt;
 python gramps.py 'My Fam Tree'&lt;br /&gt;
 python gramps.py JohnDoe.ged&lt;br /&gt;
&lt;br /&gt;
The first opens a family tree, the second imports a GEDCOM into an empty family tree. &lt;br /&gt;
&lt;br /&gt;
Additionally, you can pass Gramps the name of the family tree to be opened:&lt;br /&gt;
&lt;br /&gt;
* use this option : &amp;lt;code&amp;gt;-O famtree&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--open=famtree&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt;, Open of a family tree. This can be done also by just typing the name  (name or database dir)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
 python gramps.py 'Family Tree 1'&lt;br /&gt;
 python gramps.py /home/cristina/.gramps/grampsdb/47320f3d&lt;br /&gt;
 python gramps.py -O 'Family Tree 1'&lt;br /&gt;
 python gramps.py -O /home/cristina/.gramps/grampsdb/47320f3d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |If no option is given, just a name, Gramps will ignore the rest of the command line arguments. Use the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag to open, &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; to import, and do something with the data.}}&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |Only family trees can be opened directly. For other formats, you will need to use the import option which will set up the empty database and then import data into it.}}&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |Only a single family tree can be opened. If you need to combine data from several sources, you will need to use the import option.}}&lt;br /&gt;
&lt;br /&gt;
=== Import options ===&lt;br /&gt;
&lt;br /&gt;
The files destined for import can be specified with the &amp;lt;code&amp;gt;-i filename&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--import=filename&amp;lt;/code&amp;gt; option. The format can be specified with the &amp;lt;code&amp;gt;-f format&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--format=format&amp;lt;/code&amp;gt; option, immediately following the ''filename'' . If not specified, the guess will be attempted based on the ''filename''.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
   python gramps.py -i 'Family Tree 1' -i 'Family Tree 2'&lt;br /&gt;
   python gramps.py -i test.grdb -i data.gramps&lt;br /&gt;
&lt;br /&gt;
{{man tip | Tip |More than one file can be imported in one command. If this is the case, Gramps will incorporate the data from the next file into the database available at the moment.}}&lt;br /&gt;
&lt;br /&gt;
When more than one input file is given, each has to be preceded by &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; flag. The files are imported in the specified order, i.e. &amp;lt;code&amp;gt; -i file1 -i file2 &amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt; -i file2 -i file1 &amp;lt;/code&amp;gt; might produce different Gramps IDs in the resulting database.&lt;br /&gt;
&lt;br /&gt;
=== Export options ===&lt;br /&gt;
&lt;br /&gt;
The files destined for export can be specified with the &amp;lt;code&amp;gt;-e filename&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--export=filename&amp;lt;/code&amp;gt; option. The format can be specified with the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; option immediately following the ''filename'' . If not specified, the guess will be attempted based on the ''filename'' . For iso format, the ''filename'' is actually the name of directory the Gramps database will be written into. For gramps-xml, gpkg, gedcom, wft, geneweb, and gramps-pkg, the ''filename'' is the name of the resulting file.&lt;br /&gt;
&lt;br /&gt;
-e, export a family tree in required format. It is not possible to export to a family tree.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  python gramps.py -i 'Family Tree 1' -i test.grdb -f grdb -e mergedDB.gramps&lt;br /&gt;
Note that above does not change 'Family Tree 1' as everything happens via a temporary database, whereas:&lt;br /&gt;
  python gramps.py -O 'Family Tree 1' -i test.grdb -f grdb -e mergedDB.gramps&lt;br /&gt;
will import test.grdb into Family Tree 1, and then export to a file !&lt;br /&gt;
&lt;br /&gt;
{{man tip| Exporting more files |More than one file can be exported in one command. If this is the case, Gramps will attempt to write several files using the data from the database available at the moment.}}&lt;br /&gt;
&lt;br /&gt;
When more than one output file is given, each has to be preceded by &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; flag. The files are written one by one, in the specified order.&lt;br /&gt;
&lt;br /&gt;
=== Action options ===&lt;br /&gt;
&lt;br /&gt;
The action to perform on the imported data can be specified with the &amp;lt;code&amp;gt;-a action&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--action=action&amp;lt;/code&amp;gt; option. This is done after all imports are successfully completed.&lt;br /&gt;
&lt;br /&gt;
The following actions remain the same:&lt;br /&gt;
&lt;br /&gt;
*''report'': This action allows producing reports from the command line.&lt;br /&gt;
&lt;br /&gt;
*''tool'': This action allows to run a tool from the command line.&lt;br /&gt;
&lt;br /&gt;
Reports and tools generally have many options of their own, so these actions should be followed by the report/tool option string. The string is given using the &amp;lt;code&amp;gt;-p option_string&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--options=option_string&amp;lt;/code&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
The actions available in older versions of Gramps which were relocated in Gramps 3.3 are:&lt;br /&gt;
&lt;br /&gt;
*''summary'': This action was the same as {{man menu|Reports -&amp;gt;View -&amp;gt;Summary}}. In Gramps 3.3 it was replaced by (or renamed to)   '''-a report -p name=summary'''.&lt;br /&gt;
&lt;br /&gt;
*''check'': This action was the same as {{man menu|Tools -&amp;gt;Database Processing -&amp;gt;Check and Repair}}. In Gramps 3.3 it was replaced by (or renamed to) '''-a tool -p name=check'''.&lt;br /&gt;
&lt;br /&gt;
==== report action option ====&lt;br /&gt;
You can generate most reports from the command line using the report action. &lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can provide the css style to use here with the css option:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html,css=Web_Nebraska.css&amp;quot;&lt;br /&gt;
or without css in the html output:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html,css=&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{man tip| Report option string |The report option string should satisfy the following conditions:&amp;lt;br /&amp;gt;It must not contain any spaces (due to the general nature of the command line interface). If some arguments need to include spaces, the string should be enclosed with quotation marks.&amp;lt;br /&amp;gt;Option string must list pairs of option names and values. Within a pair, option name and value must be separated by the equal sign.&amp;lt;br /&amp;gt;Different pairs must be separated by commas.}}&lt;br /&gt;
&lt;br /&gt;
Most of the report options are specific for every report. However, there are some common options.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;name=report_name&amp;lt;/code&amp;gt;: This mandatory option determines which report will be generated. &lt;br /&gt;
{{man note|Report names|If the supplied report_name does not correspond to any available report, an error message will be printed followed by this list of available reports.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   ancestor_chart            - Ancestor Tree&lt;br /&gt;
   ancestor_report           - Ahnentafel Report&lt;br /&gt;
   AncestorFill              - AncestorFill&lt;br /&gt;
   birthday_report           - Birthday and Anniversary Report&lt;br /&gt;
   calendar                  - Calendar&lt;br /&gt;
   d3-ancestralcollapsibletree  - Ancestral Collapsible Tree&lt;br /&gt;
   d3-ancestralfanchart      - Ancestral Fan Chart&lt;br /&gt;
   d3-descendantindentedtree - Descendant Indented Tree&lt;br /&gt;
   database-differences-report  - Database Differences Report&lt;br /&gt;
   denominoviso              - DenominoViso&lt;br /&gt;
   descend_chart             - Descendant Tree&lt;br /&gt;
   descend_report            - Descendant Report&lt;br /&gt;
   DescendantBook            - Descendant Book&lt;br /&gt;
   Descendants Lines         - Descendants Lines&lt;br /&gt;
   det_ancestor_report       - Detailed Ancestral Report&lt;br /&gt;
   det_descendant_report     - Detailed Descendant Report&lt;br /&gt;
   DetailedDescendantBook    - Detailed Descendant Book&lt;br /&gt;
   double_cousins            - Double Cousins&lt;br /&gt;
   DynamicWeb                - Dynamic Web Report&lt;br /&gt;
   endofline_report          - End of Line Report&lt;br /&gt;
   family_descend_chart      - Family Descendant Tree&lt;br /&gt;
   family_group              - Family Group Report&lt;br /&gt;
   familylines_graph         - Family Lines Graph&lt;br /&gt;
   FamilySheet               - Family Sheet&lt;br /&gt;
   FamilyTree                - Family Tree&lt;br /&gt;
   fan_chart                 - Fan Chart&lt;br /&gt;
   gt_ancestor               - Ancestor Tree&lt;br /&gt;
   gt_descendant             - Descendant Tree&lt;br /&gt;
   gt_grandparent            - Grandparent Tree&lt;br /&gt;
   gt_sandclock              - Sandclock Tree&lt;br /&gt;
   gt_sandclock_family       - Sandclock Tree for a Family&lt;br /&gt;
   Heatmap                   - Heatmap&lt;br /&gt;
   hourglass_graph           - Hourglass Graph&lt;br /&gt;
   indiv_complete            - Complete Individual Report&lt;br /&gt;
   kinship_report            - Kinship Report&lt;br /&gt;
   LastChangeReport          - Last Change Report&lt;br /&gt;
   LinesOfDescendency        - Lines of Descendency Report&lt;br /&gt;
   ListeEclair               - Tiny Tafel&lt;br /&gt;
   MediaReport               - Media Report&lt;br /&gt;
   navwebpage                - Narrated Web Site&lt;br /&gt;
   networkchart              - Network Chart&lt;br /&gt;
   notelinkreport            - Note Link Report&lt;br /&gt;
   number_of_ancestors       - Number of Ancestors Report&lt;br /&gt;
   PedigreeChart             - Pedigree Chart&lt;br /&gt;
   PersonEverythingReport    - PersonEverything Report&lt;br /&gt;
   place_report              - Place Report&lt;br /&gt;
   records                   - Records Report&lt;br /&gt;
   rel_graph                 - Relationship Graph&lt;br /&gt;
   Repositories Report       - Repositories Report&lt;br /&gt;
   SourcesCitationsReport    - Sources and Citations Report&lt;br /&gt;
   statistics_chart          - Statistics Charts&lt;br /&gt;
   summary                   - Database Summary Report&lt;br /&gt;
   tag_report                - Tag Report&lt;br /&gt;
   timeline                  - Timeline Chart&lt;br /&gt;
   TimePedigreeHTML          - Timeline Pedigree Report&lt;br /&gt;
   TodoReport                - Todo Report&lt;br /&gt;
   WebCal                    - Web Calendar&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
*&amp;lt;code&amp;gt;of=&amp;lt;/code&amp;gt;: output filename and optional destination folder/directory eg: &amp;lt;code&amp;gt;of=&amp;quot;C:\Users\&amp;lt;username&amp;gt;\Desktop\FamilyTree.odt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;off=&amp;lt;/code&amp;gt;: output format. These are the extension an output format makes available, eg, pdf, html, doc, ...&lt;br /&gt;
*&amp;lt;code&amp;gt;style=&amp;lt;/code&amp;gt;: for text reports, the stylesheet to use. Defaults to 'default'.&lt;br /&gt;
*&amp;lt;code&amp;gt;show=all&amp;lt;/code&amp;gt;: This will produce the list of names for all options available for a given report.&lt;br /&gt;
*&amp;lt;code&amp;gt;show=option_name&amp;lt;/code&amp;gt;: This will print the description of the functionality supplied by the option_name, as well as what are the acceptable types and values for this option.&lt;br /&gt;
&lt;br /&gt;
So, to learn to use a report, do for example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,show=all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{man tip| Tip |If an option is not supplied, the last used value will be used. If this report has never been generated before, then the value from last generated report will be used when applicable. Otherwise, the default value will be used.}}&lt;br /&gt;
&lt;br /&gt;
When more than one output action is given, each has to be preceded by &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; flag. The actions are performed one by one, in the specified order.&lt;br /&gt;
&lt;br /&gt;
{{man tip| lists |Some reports have options or arguments which are interpreted (by the report) to be on multiple lines.  For instance some reports allow you to format how the information will be shown, perhaps with a name on one line and the person's birth date on the next line.  Such multiple-line options or arguments are called &amp;quot;lists&amp;quot; by Gramps.}}&lt;br /&gt;
&lt;br /&gt;
On the command line such lists must always start with a left square bracket &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; and must always end with a right square bracket &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt; but since such square brackets are usually &amp;quot;special&amp;quot; to the &amp;quot;shell&amp;quot; (they mean something to the command interpreter&lt;br /&gt;
you are typing the command to), you must &amp;quot;escape&amp;quot; them so that they are ignored by your shell.&lt;br /&gt;
&lt;br /&gt;
The details vary with each shell but (in linux/UNIX) usually you can precede such a square bracket with a backslash &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; or put quotation marks around the square bracket, usually either &amp;quot;single&amp;quot; or &amp;quot;double&amp;quot; ones.&lt;br /&gt;
&lt;br /&gt;
The Hourglass Graph report allows you to put a &amp;quot;note&amp;quot; at the top of the report and such a &amp;quot;note&amp;quot; is an example of a &amp;quot;list&amp;quot; option.  Here is an example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p name=hourglass_graph,note='[line one,line two]'&lt;br /&gt;
which shows that inside such a list different lines are separated by commas, and that spaces are acceptable since the quotation marks are already there for the square brackets.&lt;br /&gt;
&lt;br /&gt;
But if you want to have a comma inside your report you have to somehow tell Gramps that comma is not one which separates lines.  You do that by enclosing the line with the comma in quotation marks (either single or double).&lt;br /&gt;
&lt;br /&gt;
But if you are already using a set of quotation marks (to enclose your square brackets) you have to use the other type to enclose&lt;br /&gt;
the line with your comma.  Here is an example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p name=hourglass_graph,note=&amp;quot;['line one, also line one','line two, also line two']&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is possible to include any character in a list but the details are beyond the scope of this command-line introduction to Gramps.&lt;br /&gt;
&lt;br /&gt;
You will need to know the precise methods available in your particular command shell interpreter to include a character which is &amp;quot;special&amp;quot; to your shell or &amp;quot;special&amp;quot; to Gramps (like the comma in the example above) but in general you will have to &amp;quot;escape&amp;quot; it twice, once to your shell and once again to Gramps, since you don't want your shell to think it is some instruction it should pay attention to and you don't want Gramps to think that either.&lt;br /&gt;
&lt;br /&gt;
==== tool action option ====&lt;br /&gt;
You can run most tools from the command line using the 'tool' action.&lt;br /&gt;
To see which ones, say:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p show=all&lt;br /&gt;
To see a tool's available options, for instance the &amp;quot;verify&amp;quot; tool:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p name=verify,show=all&lt;br /&gt;
To run a tool, for instance the &amp;quot;verify&amp;quot; tool:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p name=verify&lt;br /&gt;
&lt;br /&gt;
{{man note|Tool names|If the supplied tool_name does not correspond to any available tool, an error message will be printed followed by this list of available tools.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   check                     - Check and Repair Database&lt;br /&gt;
   chtype                    - Rename Event Types&lt;br /&gt;
   dgenstats                 - Dump Gender Statistics&lt;br /&gt;
   evname                    - Extract Event Description&lt;br /&gt;
   rebuild                   - Rebuild Secondary Indexes&lt;br /&gt;
   rebuild_genstats          - Rebuild Gender Statistics&lt;br /&gt;
   rebuild_refmap            - Rebuild Reference Maps&lt;br /&gt;
   reorder_ids               - Reorder Gramps IDs&lt;br /&gt;
   test_for_date_parser_and_displayer	- Check Localized Date Displayer and Parser&lt;br /&gt;
   testcasegenerator         - Generate Testcases for Persons and Families&lt;br /&gt;
   verify                    - Verify the Data&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==== book action option ====&lt;br /&gt;
{{man note|New feature|Added in Gramps 5.0}}&lt;br /&gt;
You can run books from the command line using the 'book' action.&lt;br /&gt;
To see which ones, say:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book&lt;br /&gt;
To see a book's available options, for instance a book called &amp;quot;mybook&amp;quot;:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book -p name=mybook,show=all&lt;br /&gt;
To run a book, for instance a book called &amp;quot;mybook&amp;quot;:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book -p name=mybook&lt;br /&gt;
&lt;br /&gt;
{{man note|Book names|If the supplied book_name does not correspond to any available Book, an error message will be printed followed by this list of available Books. eg: Example listing only as the Books will be whatever you have named them.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   Granny Jones&lt;br /&gt;
   Grampa John&lt;br /&gt;
   Smith Family History&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== Force unlock option ===&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt;: you can extend the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag with &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; to force a locked family to be unlocked. This allows you to recover from a crash that leaves the family tree (database) locked, from the command line.&lt;br /&gt;
&lt;br /&gt;
An example (to unlock the &amp;quot;Family Tree 1&amp;quot; database):&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -u &amp;gt; /dev/null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note|It is not possible to open family trees that need repair from the command line.}}&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Unlocking_a_Family_Tree|Manage Family Trees:Unlocking a Family Tree]]&lt;br /&gt;
&lt;br /&gt;
=== Configuration (config) option ===&lt;br /&gt;
When all configuration variable(s) are set Gramps will start with these new values.&lt;br /&gt;
&lt;br /&gt;
These options can takes three forms:&lt;br /&gt;
{{man note|Note|Except for examples &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;3.2&amp;lt;/tt&amp;gt;, All the following examples, use &amp;lt;code&amp;gt;behavior.database-path&amp;lt;/code&amp;gt; as the configuration variable to change.}}&lt;br /&gt;
&lt;br /&gt;
;1) See all config values: &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--show&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
 gramps --show&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps config settings from /home/&amp;lt;~username&amp;gt;/.gramps/gramps50/gramps.ini:&lt;br /&gt;
export.proxy-order=[['privacy', 0], ['living', 0], ['person', 0], ['note', 0], ['reference', 0]]&lt;br /&gt;
&lt;br /&gt;
database.compress-backup=True&lt;br /&gt;
database.backend='bsddb'&lt;br /&gt;
database.backup-path='/home/&amp;lt;~username&amp;gt;'&lt;br /&gt;
database.port=''&lt;br /&gt;
database.autobackup=0&lt;br /&gt;
database.path='/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb'&lt;br /&gt;
database.host=''&lt;br /&gt;
database.backup-on-exit=True&lt;br /&gt;
&lt;br /&gt;
geography.lock=False&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
;2) See a single config value: &amp;lt;code&amp;gt;--config=database.path&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c database.path&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
 gramps --config=database.path&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Current Gramps config setting: database.path:'/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Set a value: &amp;lt;code&amp;gt;--config=behavior.database-path:'/media/mydb'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.database-path:'/media/mydb'&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
&lt;br /&gt;
3.1) Set a value to its default: &amp;lt;code&amp;gt;--config=behavior.database-path:DEFAULT&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.database-path:DEFAULT&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
&lt;br /&gt;
3.2) Set more than one value: &amp;lt;code&amp;gt;--config=behavior.use-tips:False --config=behavior.autoload:True&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.use-tips:False -c behavior.autoload:True&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
=== Safe mode ===&lt;br /&gt;
&amp;lt;code&amp;gt;gramps -S&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gramps --safe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This CLI command starts Gramps as if it had never been installed before. In this mode, any previous family trees can still be loaded, as long as they were stored in the default folder. All other settings, filters, books, addons etc. are either cleared or returned to their default values. Other CLI commands can be used, or, if none, Gramps will start the GUI. Nothing except the actual family tree data is saved.&lt;br /&gt;
&lt;br /&gt;
Note that this is typically used to see if Gramps behaves better when it is running as if with a totally 'clean' install.  It is NOT permanent (if you want that see [[#Defaults|Defaults]] below), if you start Gramps normally after using this command all of your previous settings etc. are still there.&lt;br /&gt;
&lt;br /&gt;
This actually works by setting the folder that Gramps uses to store its user data (except for family trees) to a temporary directory, which is deleted when Gramps closes.&lt;br /&gt;
=== Defaults ===&lt;br /&gt;
&amp;lt;code&amp;gt;gramps -D E&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gramps --default=E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This CLI command causes Gramps to clear out or return to defaults the desired settings. &lt;br /&gt;
The family tree databases are NOT cleared out or removed.  &lt;br /&gt;
The sub-commands (replace the 'E' from the example command line above with one or more of &lt;br /&gt;
the subcommand characters) are:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; Addons are cleared. Any installed addons are removed, along with their settings.&lt;br /&gt;
*&amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; Filters are cleared. Any custom filters are removed.&lt;br /&gt;
*&amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; Preferences are returned to their default values.&lt;br /&gt;
*&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; Books are cleared, Reports and Tools settings are returned to their default values.&lt;br /&gt;
*&amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; Old '.zip' files from family tree version upgrades are deleted.&lt;br /&gt;
*&amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; Everything except the actual family tree data is returned to default settings. This does all of the above as well as a few more items; deletes thumbnails, maps, and the user CSS (used in web reports).&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 gramps -D AP&lt;br /&gt;
will cause Gramps to remove all the Addons and to reset Preferences to their default values.&lt;br /&gt;
== Operation ==&lt;br /&gt;
&lt;br /&gt;
If the first argument on the command line does not start with a dash (i.e. no flag), Gramps will attempt to open the file with the name given by the first argument and start an interactive session, ignoring the rest of the command line arguments.&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag is given, then Gramps will try opening the supplied file name and then work with that data, as instructed by the further command line parameters.&lt;br /&gt;
&lt;br /&gt;
{{man note|1=Note |2=Only one file can be opened in a single invocation of Gramps. If you need to get data from multiple sources, use the importing options by using &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; flag.}}&lt;br /&gt;
&lt;br /&gt;
With or without the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag, there could be multiple imports, exports, and actions specified further on the command line by using &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; , and &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; flags.&lt;br /&gt;
&lt;br /&gt;
The order of &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; , or &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; options with respect to each does not matter. The actual execution order always is: all imports (if any) -&amp;gt; all exports (if any) -&amp;gt; all actions (if any).&lt;br /&gt;
&lt;br /&gt;
{{man note| Note |But opening must always be first!}}&lt;br /&gt;
&lt;br /&gt;
If no &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; option is given, Gramps will launch its main window and start the usual interactive session with the empty database, since there is no data to process, anyway.  (Unless you have already expressed a &amp;quot;preference&amp;quot; that it start with the last database it used.)&lt;br /&gt;
&lt;br /&gt;
If no &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; options are given, Gramps will launch its main window and start the usual interactive session with the database resulted from opening and all imports (if any). This database resides in a directory under the ''&amp;lt;code&amp;gt;~/.gramps/grampsdb/&amp;lt;/code&amp;gt;'' directory.&lt;br /&gt;
&lt;br /&gt;
Any errors encountered during import, export, or action, will be either dumped to stdout (if these are exceptions handled by Gramps) or to stderr (if these are not handled). Use usual shell redirections of stdout and stderr to save messages and errors in files.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
*To import four databases (whose formats can be determined from their names) and then check the resulting database for errors, one may type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps -i file4.wft -a check&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To explicitly specify the formats in the above example, append filenames with appropriate -f options:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -f gedcom -i file2.gpkg -f gramps-pkg -i ~/db3.gramps -f gramps-xml -i file4.wft -f wft -a check&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To record the database resulting from all imports, supply -e flag (use -f if the filename does not allow Gramps to guess the format):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -e ~/new-package -f gramps-pkg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To save any error messages of the above example into files outfile and errfile, run:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.dpkg -e ~/new-package -f gramps-pkg &amp;gt;outfile 2&amp;gt;errfile &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To import three databases and start interactive Gramps session with the result:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To open a database and, based on that data, generate timeline report in PDF format putting the output into the my_timeline.pdf file:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O 'Family Tree 1' -a report -p name=timeline,off=pdf,of=my_timeline.pdf &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man tip|1=Listing report options |2=Use the &amp;lt;code&amp;gt;''name=timeline,show=all''&amp;lt;/code&amp;gt; to find out about all available options for the timeline report. To find out details of a particular option, use &amp;lt;code&amp;gt;''show=option_name''&amp;lt;/code&amp;gt; , e.g. &amp;lt;code&amp;gt;''name=timeline,show=off''&amp;lt;/code&amp;gt; string. To learn about available report names, use &amp;lt;code&amp;gt;''name=show''&amp;lt;/code&amp;gt; string.}}&lt;br /&gt;
&lt;br /&gt;
*To convert the bsddb database on the fly to a .gramps xml file:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O 'Family Tree 1' -e output.gramps -f gramps-xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* To generate a web site into an other locale (in German):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;LANGUAGE=de_DE; LANG=de_DE.UTF-8 gramps -O 'Family Tree 1' -a report -p name=navwebpage,target=/../de &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Finally, to start normal interactive session type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment variables==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Warning|Gramps can take advantage of the following [[Gramps_and_Windows#Environmental_Variables|environment variables]]&amp;lt;br /&amp;gt;('''Only change them if you know what are you doing.''')}}&lt;br /&gt;
&lt;br /&gt;
===GRAMPSHOME===&lt;br /&gt;
* '''GRAMPSHOME''' - if set, [[Gramps_and_Windows#Setting_the_configuration_path|override default path]] to profile allowing user to use an external network drive to store data and all settings. For technically advanced users who run multiple versions of Gramps, setting a different $GRAMPSHOME is a way to avoid interference between the different versions in the Gramps [[Gramps_Glossary#user_directory|User Directory]]. It can also be used to configure Gramps to [[Run_Gramps_from_a_portable_drive|run from a portable drive]] or to prepare for a [[Installation|manual installation]]. The path can also be used to configure the path to a [[Gramps_for_Windows_with_MSYS2#Keep_your_GRAMPSHOME_separate|separate test Tree]] or [[Getting_started_with_Gramps_development|development Tree]].&lt;br /&gt;
&lt;br /&gt;
For example &amp;lt;pre&amp;gt;GRAMPSHOME=$HOME/familytrees/paternal&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LANG, LANGUAGE, LC_MESSAGE, LC_TIME ===&lt;br /&gt;
* '''LANG''', '''LANGUAGE''', '''LC_MESSAGES''', and '''LC_TIME''' - are used by Gramps to determine which language file(s) should be loaded. See locale(1) for a general discussion of '''LANG''', '''LC_MESSAGES''', and '''LC_TIME'''. Note that in addition to setting date formats (which are overridden in Gramps with Preferences settings) '''LC_TIME''' also sets the language used for words in dates like month and day names and ''in the context of dates'' words like ''about'', ''between'', and ''before''. '''LANGUAGE''' is a comma-separated list of language codes (''not locales'', though certain languages like pt_BR or cn_TW are regional variants) that sets a preference-ordered list of desired translations. It will override '''LANG''' but not '''LC_MESSAGES''' or '''LC_TIME'''.&lt;br /&gt;
&lt;br /&gt;
{{man note|MacOSX|Because of the way launching with Finder works, the environment variables for the Gramps.app bundle are hard-coded in &amp;lt;code&amp;gt;Gramps.app/Contents/MacOS/Gramps&amp;lt;/code&amp;gt;. If for some reason you need to change them, edit that file with TextEdit; be sure to save it back as plain text. See as well [[Run_GRAMPS_in_another_locale#Change_Mac_OS_X_application_defaults|setting locale]] for an alternative to using the '''LANG''' and '''LANGUAGE''' environment variables.}}&lt;br /&gt;
&lt;br /&gt;
===GRAMPSI18N===&lt;br /&gt;
* [[Translating_Gramps#.24GRAMPSI18N_.28for_your_locale.29| $GRAMPSI18N (for your locale) ]] - The LANG assumes the Gramps translations are installed globally. If this is not the case, you need to [[Translating_Gramps#.24GRAMPSI18N_.28for_your_locale.29|give Gramps the directory]] where the translations will be found. This can be used to temporarily [[Howto:Change_the_language_of_reports|change the language for Reports]] being generated.&lt;br /&gt;
&lt;br /&gt;
A translation is called &amp;lt;code&amp;gt;gramps.mo&amp;lt;/code&amp;gt;, you can find it in Linux with the locate command. For example, if you have Swedish in directory &amp;lt;code&amp;gt;/home/me/gramps/mo/sv/gramps.mo&amp;lt;/code&amp;gt;, you can direct Gramps there using: &lt;br /&gt;
 GRAMPSI18N=/home/me/gramps/mo LC_ALL=C.UTF-8 LANG=&amp;quot;sv&amp;quot; python3 gramps&lt;br /&gt;
&lt;br /&gt;
===GRAMPSDIR===&lt;br /&gt;
* The environment variable GRAMPSDIR is the path to your [[Translating_Gramps#gramps.sh|Gramps directory]].&lt;br /&gt;
&lt;br /&gt;
===GRAMPS_RESOURCES===&lt;br /&gt;
* The environment variable GRAMPS_RESOURCES is the path to Gramps built-in resources files. You should only change this if you are using Gramps from source code or a custom environment.  An indicator that you need to set this variable is if you receive one of the following errors:&lt;br /&gt;
** ''Encoding error while parsing resource path''&lt;br /&gt;
** ''Failed to open resource file''&lt;br /&gt;
** ''Resource Path {invalid/path/to/resources} is invalid''&lt;br /&gt;
** ''Unable to determine resource path''&lt;br /&gt;
&lt;br /&gt;
Example [[Linux:Build_from_source#Running_from_a_tarball_release|usage]]:&lt;br /&gt;
 GRAMPS_RESOURCES=/home/username/gramps/branches/maintenance/gramps51/build/lib.linux-x86_64-2.7/ PYTHONPATH=$GRAMPS_RESOURCES:$PYTHONPATH ./gramps&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Keybindings|Gramps 5.1 Wiki Manual - User Directory|5.1}} &lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Command_Line}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Command_Line&amp;diff=89829</id>
		<title>Gramps 5.1 Wiki Manual - Command Line</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Command_Line&amp;diff=89829"/>
		<updated>2022-01-18T15:49:50Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Locating path to gramps executable on Windows&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Keybindings|Gramps 5.1 Wiki Manual - User Directory|5.1}} &lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Command_Line}}&lt;br /&gt;
{{#vardefine:chapter|C}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
This appendix provides the reference to the command line capabilities available when launching Gramps from the terminal.&lt;br /&gt;
&lt;br /&gt;
== Start Gramps through the Command Line ==&lt;br /&gt;
&lt;br /&gt;
Normally Gramps is started through the graphical user interface (GUI) on [[Gramps_5.1_Wiki_Manual_-_Getting_started#Start_Gramps|your platform]].&lt;br /&gt;
&lt;br /&gt;
It is also possible to start Gramps using a command line interface (CLI). CLI use can&lt;br /&gt;
* produce reports that are not available via the GUI, &lt;br /&gt;
* create reports, do conversions etc. without opening a window and&lt;br /&gt;
* can provide [[Gramps_5.1_Wiki_Manual_-_Main_Window#Seeing_all_the_error_messages|extra information]] in the event of problems.&lt;br /&gt;
&lt;br /&gt;
This section of the user manual describes how to start Gramps through the CLI, and the features that are available.&lt;br /&gt;
&lt;br /&gt;
The way you start Gramps through the CLI depends on the operating system you are using.&lt;br /&gt;
&lt;br /&gt;
For simplicity of description, the examples of use below are written from the point of view of running Gramps on Linux. The examples would need to be changed for other platforms.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
Only the Linux platform is officially supported as Gramps developers use and test the source code on that platform, fixing any problems that arise due to upgrades.&lt;br /&gt;
&lt;br /&gt;
Assuming you have used the standard Package Manager (either through a CLI or a GUI) for your Linux distribution, you start Gramps through the CLI by typing&lt;br /&gt;
 gramps&lt;br /&gt;
&lt;br /&gt;
=== MS Windows ===&lt;br /&gt;
&lt;br /&gt;
MS Windows is a [[Download|community supported]] platform. If you install the [[All_In_One_Gramps_Software_Bundle_for_Windows|Windows AIO bundle]], then this will place an icon on the desktop as well as a menu item in the 'Start' menu. However, the Gramps installation directory is not added to the system path and to run gramps via CLI, we need to know the path to that directory. There are several ways to find the path, including by examining the program's shortcut in the start menu, taskbar or the start menu, or by locating the running executable's path in Task Manager. In most cases the path will be the default as described below.&lt;br /&gt;
&lt;br /&gt;
As an example, using GrampsAOI-{{template:Version windows AIO64}}_win64.exe installer and accepting the standard destination folder during installation, &amp;lt;code&amp;gt;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;lt;/code&amp;gt; would be the location for the Gramps executable. While not common, if you installed the 32-bit version of Gramps on a 64-bit OS, the path would be &amp;lt;code&amp;gt;C:\Program&amp;amp;nbsp;Files&amp;amp;nbsp;(x86)\GrampsAIO32-{{template:Version windows AIO32}}&amp;lt;/code&amp;gt;. Finally, if you chose to install Gramps in a non-standard directory, use that folder path instead instead. Use Windows File Explorer to confirm that the path is correct before continuing on.&lt;br /&gt;
&lt;br /&gt;
To find the path using a shortcut icon,&lt;br /&gt;
* Right-click on the &amp;lt;code&amp;gt;GrampsAIO64&amp;amp;nbsp;{{template:Version windows AIO64}}-console&amp;lt;/code&amp;gt; application, or the corresponding item in the Start menu.&lt;br /&gt;
* Note down the file location (its &amp;quot;Start in' directory).&lt;br /&gt;
* Select the full path and copy ({{man key press|Ctrl|c}}) it.&lt;br /&gt;
&lt;br /&gt;
To run Gramps from the command line, you'll need to start a console window:&lt;br /&gt;
* From the Start menu, start cmd.exe.&lt;br /&gt;
* Change directory to the installation directory you located.&lt;br /&gt;
* Type in or paste the path, surrounding it in quotes if there are spaces.&lt;br /&gt;
* Press {{man key press|Enter}}.&lt;br /&gt;
&lt;br /&gt;
For example, this might be:&lt;br /&gt;
 cd &amp;quot;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;quot;&lt;br /&gt;
 gramps&lt;br /&gt;
&lt;br /&gt;
You may use any of the command-line options along with this. For example, to get a detailed listing of all of the Family Tree databases in your default Family Tree folder, you would append &amp;lt;code&amp;gt;-L&amp;lt;/code&amp;gt;&lt;br /&gt;
 cd &amp;quot;C:\Program&amp;amp;nbsp;Files\GrampsAOI64-{{template:Version windows AIO64}}&amp;quot;&lt;br /&gt;
 gramps -L&lt;br /&gt;
&lt;br /&gt;
See example usage https://github.com/gramps-project/addons-source/pull/121&lt;br /&gt;
&lt;br /&gt;
=== MacOS ===&lt;br /&gt;
&lt;br /&gt;
MacOS is a [[Download|community supported]] platform. If you download the MacOS disk image (.dmg), then you simply drag the application to your application folder (or anywhere else you want to store it) and start Gramps by double clicking on the application in the normal way. The Homebrew package manager[https://github.com/Homebrew] also allows for installation of the application in the usual Applications folder.&lt;br /&gt;
&lt;br /&gt;
To run from the command line, you'll need to start Terminal, found in the Utilities folder of the main Applications folder (/Applications/Utilities). Once you have a terminal window open, at the prompt type&lt;br /&gt;
  /path/to/Gramps.app/Contents/MacOS/Gramps&lt;br /&gt;
If you installed Gramps in Applications along with most of your other apps, as suggested above, that would be&lt;br /&gt;
  /Applications/Gramps.app/Contents/MacOS/Gramps&lt;br /&gt;
You may use any of the command-line options along with this. For example, to get a detailed listing of all of the Family Tree databases in your default Family Tree folder, you would use&lt;br /&gt;
  /Applications/Gramps.app/Contents/MacOS/Gramps -L&lt;br /&gt;
&lt;br /&gt;
There are other ways to install Gramps for MacOS, but these are much more complicated and are not covered here.&lt;br /&gt;
&lt;br /&gt;
== Python options ==&lt;br /&gt;
&lt;br /&gt;
In the examples of different platforms above, and also in commands in various files you may see some options after the 'python' command, for example '-EO' in&lt;br /&gt;
 &amp;quot;python3 -EO ..\share\gramps\gramps.py -L&lt;br /&gt;
&lt;br /&gt;
It is important to distinguish between the '''python options''' in this case:&lt;br /&gt;
 -EO&lt;br /&gt;
and the '''Gramps options''', in this case&lt;br /&gt;
 -L&lt;br /&gt;
&lt;br /&gt;
The '''python options''' that you may come across are:&lt;br /&gt;
* &amp;lt;code&amp;gt;-E&amp;lt;/code&amp;gt; Ignore all PYTHON* environment variables, e.g. &amp;lt;code&amp;gt;PYTHONPATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PYTHONHOME&amp;lt;/code&amp;gt;, that might be set.&lt;br /&gt;
* &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; Turn on basic optimizations. This changes the filename extension for compiled (bytecode) files from &amp;lt;code&amp;gt;.pyc&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;.pyo&amp;lt;/code&amp;gt;. See also PYTHONOPTIMIZE.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; optimise flag has a number of effects in Gramps:&lt;br /&gt;
* If it is not turned on, an additional {{man menu|[[Gramps_5.1_Wiki_Manual_-_Tools#Debug|Debug]]}} entry appears in the {{man menu|[[Gramps_5.1_Wiki_Manual_-_Tools|Tools]]}} menu.&lt;br /&gt;
* If it is not turned on, [[Logging_system#So_how_logging_works_in_Gramps_after_all.3F|info logging messages are output]].&lt;br /&gt;
* If it is not turned on, [[Debugging_Gramps#Add_debug_statements|debug statements]] may be activated.&lt;br /&gt;
* If it is not turned on, additional features are available in the [[Gramps_5.1_Wiki_Manual_-_Plugin_Manager|Plugin Manager]].&lt;br /&gt;
&lt;br /&gt;
The '''Gramps options''' are described below.&lt;br /&gt;
&lt;br /&gt;
== Available Gramps options ==&lt;br /&gt;
&lt;br /&gt;
This section provides the reference list of all command line options available in Gramps. If you want to know more than just a list of options, see next sections: [[#Operation|Operation]] and [[#Examples| Examples]]. The summary below is printed by &lt;br /&gt;
 gramps -h&lt;br /&gt;
or&lt;br /&gt;
 gramps --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: gramps.py [OPTION...]&lt;br /&gt;
  --load-modules=MODULE1,MODULE2,...     Dynamic modules to load&lt;br /&gt;
&lt;br /&gt;
Help options&lt;br /&gt;
  -?, --help                             Show this help message&lt;br /&gt;
  --usage                                Display brief usage message&lt;br /&gt;
&lt;br /&gt;
Application options&lt;br /&gt;
  -O, --open=FAMILY_TREE                 Open Family Tree&lt;br /&gt;
  -U, --username=USERNAME                Database username&lt;br /&gt;
  -P, --password=PASSWORD                Database password&lt;br /&gt;
  -C, --create=FAMILY_TREE               Create on open if new Family Tree&lt;br /&gt;
  -i, --import=FILENAME                  Import file&lt;br /&gt;
  -e, --export=FILENAME                  Export file&lt;br /&gt;
  -r, --remove=FAMILY_TREE_PATTERN       Remove matching Family Tree(s) (use regular expressions)&lt;br /&gt;
  -f, --format=FORMAT                    Specify Family Tree format&lt;br /&gt;
  -a, --action=ACTION                    Specify action&lt;br /&gt;
  -p, --options=OPTIONS_STRING           Specify options&lt;br /&gt;
  -d, --debug=LOGGER_NAME                Enable debug logs&lt;br /&gt;
  -l [FAMILY_TREE_PATTERN...]            List Family Trees&lt;br /&gt;
  -L [FAMILY_TREE_PATTERN...]            List Family Trees in Detail&lt;br /&gt;
  -t [FAMILY_TREE_PATTERN...]            List Family Trees, tab delimited&lt;br /&gt;
  -u, --force-unlock                     Force unlock of Family Tree&lt;br /&gt;
  -s, --show                             Show config settings&lt;br /&gt;
  -c, --config=[config.setting[:value]]  Set config setting(s) and start Gramps&lt;br /&gt;
  -y, --yes                              Don't ask to confirm dangerous actions (non-GUI mode only)&lt;br /&gt;
  -q, --quiet                            Suppress progress indication output (non-GUI mode only)&lt;br /&gt;
  -v, --version                          Show versions&lt;br /&gt;
  -S, --safe                             Start Gramps in 'Safe mode'&lt;br /&gt;
                                          (temporarily use default settings)&lt;br /&gt;
  -D, --default=[APXFE]                  Reset settings to default;&lt;br /&gt;
                 A - addons are cleared&lt;br /&gt;
                 P - Preferences to default&lt;br /&gt;
                 X - Books are cleared, reports and tool settings to default&lt;br /&gt;
                 F - filters are cleared&lt;br /&gt;
                 E - Everything is set to default or cleared&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The usage message is as follows:&lt;br /&gt;
&lt;br /&gt;
 gramps --usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Example of usage of Gramps command line interface&lt;br /&gt;
&lt;br /&gt;
1. To import four databases (whose formats can be determined from their names)&lt;br /&gt;
and then check the resulting database for errors, one may type:&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps -i file4.wft -a tool -p name=check.&lt;br /&gt;
&lt;br /&gt;
2. To explicitly specify the formats in the above example, append filenames with appropriate -f options:&lt;br /&gt;
gramps -i file1.ged -f gedcom -i file2.gpkg -f gramps-pkg -i ~/db3.gramps -f gramps-xml -i file4.wft -f wft -a tool -p name=check.&lt;br /&gt;
&lt;br /&gt;
3. To record the database resulting from all imports, supply -e flag&lt;br /&gt;
(use -f if the filename does not allow Gramps to guess the format):&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -e ~/new-package -f gramps-pkg&lt;br /&gt;
&lt;br /&gt;
4. To save any error messages of the above example into files outfile and errfile, run:&lt;br /&gt;
gramps -i file1.ged -i file2.dpkg -e ~/new-package -f gramps-pkg &amp;gt;outfile 2&amp;gt;errfile&lt;br /&gt;
&lt;br /&gt;
5. To import three databases and start interactive Gramps session with the result:&lt;br /&gt;
gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps&lt;br /&gt;
&lt;br /&gt;
6. To open a database and, based on that data, generate timeline report in PDF format&lt;br /&gt;
putting the output into the my_timeline.pdf file:&lt;br /&gt;
gramps -O 'Family Tree 1' -a report -p name=timeline,off=pdf,of=my_timeline.pdf&lt;br /&gt;
&lt;br /&gt;
7. To generate a summary of a database:&lt;br /&gt;
gramps -O 'Family Tree 1' -a report -p name=summary&lt;br /&gt;
&lt;br /&gt;
8. Listing report options&lt;br /&gt;
Use the name=timeline,show=all to find out about all available options for the timeline report.&lt;br /&gt;
To find out details of a particular option, use show=option_name , e.g. name=timeline,show=off string.&lt;br /&gt;
To learn about available report names, use name=show string.&lt;br /&gt;
&lt;br /&gt;
9. To convert a Family Tree on the fly to a .gramps xml file:&lt;br /&gt;
gramps -O 'Family Tree 1' -e output.gramps -f gramps-xml&lt;br /&gt;
&lt;br /&gt;
10. To generate a web site into an other locale (in German):&lt;br /&gt;
LANGUAGE=de_DE; LANG=de_DE.UTF-8 gramps -O 'Family Tree 1' -a report -p name=navwebpage,target=/../de&lt;br /&gt;
&lt;br /&gt;
11. Finally, to start normal interactive session type:&lt;br /&gt;
gramps&lt;br /&gt;
&lt;br /&gt;
Note: These examples are for bash shell.&lt;br /&gt;
Syntax may be different for other shells and for Windows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List options ===&lt;br /&gt;
Print a list of known family trees:&lt;br /&gt;
&lt;br /&gt;
;Sparse&lt;br /&gt;
 -l, List Family Trees&lt;br /&gt;
&lt;br /&gt;
 gramps -l&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List of known Family Trees in your database path&lt;br /&gt;
&lt;br /&gt;
/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb/5a46c1c3 with name &amp;quot;Example Family Tree&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
;Detailed&lt;br /&gt;
 -L, List Family Trees in Detail&lt;br /&gt;
&lt;br /&gt;
 gramps -L&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Family Trees:&lt;br /&gt;
Family Tree &amp;quot;Example Family Tree&amp;quot;:&lt;br /&gt;
   Database: SQLite&lt;br /&gt;
   Database module location: /usr/lib/python3.6/sqlite3/__init__.py&lt;br /&gt;
   Database module version: 2.6.0&lt;br /&gt;
   Database version: 3.21.0&lt;br /&gt;
   Last accessed: 30/12/17 09:29:37&lt;br /&gt;
   Locked?: False&lt;br /&gt;
   Number of citations: 2854&lt;br /&gt;
   Number of events: 3432&lt;br /&gt;
   Number of families: 762&lt;br /&gt;
   Number of media: 7&lt;br /&gt;
   Number of notes: 19&lt;br /&gt;
   Number of people: 2157&lt;br /&gt;
   Number of places: 1294&lt;br /&gt;
   Number of repositories: 3&lt;br /&gt;
   Number of sources: 4&lt;br /&gt;
   Number of tags: 2&lt;br /&gt;
   Path: /home/&amp;lt;~username&amp;gt;/.gramps/grampsdb/5a46c1c3&lt;br /&gt;
   Schema version: 18.0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note that dates are shown in the default LOCALE format.|You change that at the system level. For example, on [[Gramps_Glossary#posix|POSIX]]-based systems you could use: &amp;lt;pre&amp;gt;LC_TIME=en_AU.UTF-8 gramps -L&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Version options ===&lt;br /&gt;
&lt;br /&gt;
 -v or --version prints version of Gramps and dependencies,&lt;br /&gt;
      information about environment settings and python and system paths&lt;br /&gt;
&lt;br /&gt;
 gramps -v&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps Settings:&lt;br /&gt;
----------------&lt;br /&gt;
 python    : 3.7.5&lt;br /&gt;
 gramps    : 5.1.1&lt;br /&gt;
 gtk++     : 3.24.12&lt;br /&gt;
 pygobject : 3.34.0&lt;br /&gt;
 pango     : 1.42.3&lt;br /&gt;
 cairo     : 1.16.0&lt;br /&gt;
 pycairo   : 1.16.2&lt;br /&gt;
 osmgpsmap : 1.0&lt;br /&gt;
 GExiv2    : 0.10&lt;br /&gt;
 ICU       : 63.1&lt;br /&gt;
 PyICU     : 2.2&lt;br /&gt;
 o.s.      : linux&lt;br /&gt;
 kernel    : 5.3.0-24-generic&lt;br /&gt;
&lt;br /&gt;
Environment settings:&lt;br /&gt;
---------------------&lt;br /&gt;
 LANG      : en_GB.UTF-8&lt;br /&gt;
 LANGUAGE  : en_GB:en&lt;br /&gt;
 GRAMPSI18N: not set&lt;br /&gt;
 GRAMPSHOME: not set&lt;br /&gt;
 GRAMPSDIR : not set&lt;br /&gt;
 PYTHONPATH:&lt;br /&gt;
    /usr/lib/python3/dist-packages/gramps&lt;br /&gt;
    /usr/bin&lt;br /&gt;
    /usr/lib/python37.zip&lt;br /&gt;
    /usr/lib/python3.7&lt;br /&gt;
    /usr/lib/python3.7/lib-dynload&lt;br /&gt;
    /usr/local/lib/python3.7/dist-packages&lt;br /&gt;
    /usr/lib/python3/dist-packages&lt;br /&gt;
&lt;br /&gt;
Non-python dependencies:&lt;br /&gt;
------------------------&lt;br /&gt;
 Graphviz  : 2.40&lt;br /&gt;
 Ghostscr. : 9.27&lt;br /&gt;
&lt;br /&gt;
System PATH env variable:&lt;br /&gt;
-------------------------&lt;br /&gt;
     /usr/local/sbin&lt;br /&gt;
     /usr/local/bin&lt;br /&gt;
     /usr/sbin&lt;br /&gt;
     /usr/bin&lt;br /&gt;
     /sbin&lt;br /&gt;
     /bin&lt;br /&gt;
     /usr/games&lt;br /&gt;
     /usr/local/games&lt;br /&gt;
     /snap/bin&lt;br /&gt;
&lt;br /&gt;
Databases:&lt;br /&gt;
-------------------------&lt;br /&gt;
 bsddb     :&lt;br /&gt;
     version     : 6.2.6&lt;br /&gt;
     db version  : 5.3.28&lt;br /&gt;
     location    : /usr/lib/python3/dist-packages/bsddb3/__init__.py&lt;br /&gt;
 sqlite3   :&lt;br /&gt;
     version     : 3.29.0&lt;br /&gt;
     py version  : 2.6.0&lt;br /&gt;
     location    : /usr/lib/python3.7/sqlite3/__init__.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
=== Format options ===&lt;br /&gt;
&lt;br /&gt;
The format of any file destined for opening, importing, or exporting can be specified with the &amp;lt;pre&amp;gt;-f format&amp;lt;/pre&amp;gt; option. The acceptable &amp;lt;tt&amp;gt;''format''&amp;lt;/tt&amp;gt; values are listed below.&lt;br /&gt;
&lt;br /&gt;
==== Full family tree support ====&lt;br /&gt;
These formats contain all your data that is present in a family tree. &lt;br /&gt;
&lt;br /&gt;
* '''gramps''' -  Gramps XML format: This format is available for import, and export. When not specified, it can be guessed if the filename ends with .gramps&lt;br /&gt;
* '''gpkg''' - Gramps package XML format: This format is available for import and export. When not specified, it can be guessed if the filename ends with .gpkg. This creates a zip package with your data as xml, and all your media files included&lt;br /&gt;
* '''grdb''' - pre Gramps 3.x database: This format is available for import to support the old file format of Gramps. Everything in the grdb file is imported. When not specified, it can be guessed if the filename ends with .grdb&lt;br /&gt;
* '''burn''' - GNOME iso burning: export, only available on GNOME where burn protocol exists&lt;br /&gt;
&lt;br /&gt;
==== Reduced family tree support ====&lt;br /&gt;
These formats contain most, but not all data that can be created in Gramps&lt;br /&gt;
&lt;br /&gt;
*'''ged'''  - GEDCOM format: This format is available for import, and export. When not specified, it can be guessed if the filename ends with .ged&lt;br /&gt;
*'''gw''' - GeneWeb file: This format is available for import and export. When not specified, it can be guessed if the filename ends with .gw&lt;br /&gt;
&lt;br /&gt;
==== Subset of your data ====&lt;br /&gt;
These formats contain a specific subset of your data&lt;br /&gt;
&lt;br /&gt;
* '''csv''' - Comma Separated Value: This format is available for import and export. Be careful however, import must be as values created by the export function. Only a part of your data is contained in the output.&lt;br /&gt;
* '''vcf''' - VCard format: import and export&lt;br /&gt;
* '''vcs''' - VCalendar format: export&lt;br /&gt;
* '''def''' - old Pro-Gen format: import&lt;br /&gt;
* '''wft''' - Web Family Tree: This format is available for export only. When not specified, it can be guessed if the filename ends with .wft&lt;br /&gt;
&lt;br /&gt;
=== Opening options ===&lt;br /&gt;
&lt;br /&gt;
You can open a family tree, or you can ''open'' a file by importing it in an empty family tree.&lt;br /&gt;
&lt;br /&gt;
To let Gramps handle this automatically, just supply the family tree or filename you want to open:&lt;br /&gt;
&lt;br /&gt;
 python gramps.py 'My Fam Tree'&lt;br /&gt;
 python gramps.py JohnDoe.ged&lt;br /&gt;
&lt;br /&gt;
The first opens a family tree, the second imports a GEDCOM into an empty family tree. &lt;br /&gt;
&lt;br /&gt;
Additionally, you can pass Gramps the name of the family tree to be opened:&lt;br /&gt;
&lt;br /&gt;
* use this option : &amp;lt;code&amp;gt;-O famtree&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--open=famtree&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt;, Open of a family tree. This can be done also by just typing the name  (name or database dir)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
 python gramps.py 'Family Tree 1'&lt;br /&gt;
 python gramps.py /home/cristina/.gramps/grampsdb/47320f3d&lt;br /&gt;
 python gramps.py -O 'Family Tree 1'&lt;br /&gt;
 python gramps.py -O /home/cristina/.gramps/grampsdb/47320f3d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |If no option is given, just a name, Gramps will ignore the rest of the command line arguments. Use the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag to open, &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; to import, and do something with the data.}}&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |Only family trees can be opened directly. For other formats, you will need to use the import option which will set up the empty database and then import data into it.}}&lt;br /&gt;
&lt;br /&gt;
{{Man tip| Tip |Only a single family tree can be opened. If you need to combine data from several sources, you will need to use the import option.}}&lt;br /&gt;
&lt;br /&gt;
=== Import options ===&lt;br /&gt;
&lt;br /&gt;
The files destined for import can be specified with the &amp;lt;code&amp;gt;-i filename&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--import=filename&amp;lt;/code&amp;gt; option. The format can be specified with the &amp;lt;code&amp;gt;-f format&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--format=format&amp;lt;/code&amp;gt; option, immediately following the ''filename'' . If not specified, the guess will be attempted based on the ''filename''.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
   python gramps.py -i 'Family Tree 1' -i 'Family Tree 2'&lt;br /&gt;
   python gramps.py -i test.grdb -i data.gramps&lt;br /&gt;
&lt;br /&gt;
{{man tip | Tip |More than one file can be imported in one command. If this is the case, Gramps will incorporate the data from the next file into the database available at the moment.}}&lt;br /&gt;
&lt;br /&gt;
When more than one input file is given, each has to be preceded by &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; flag. The files are imported in the specified order, i.e. &amp;lt;code&amp;gt; -i file1 -i file2 &amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt; -i file2 -i file1 &amp;lt;/code&amp;gt; might produce different Gramps IDs in the resulting database.&lt;br /&gt;
&lt;br /&gt;
=== Export options ===&lt;br /&gt;
&lt;br /&gt;
The files destined for export can be specified with the &amp;lt;code&amp;gt;-e filename&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--export=filename&amp;lt;/code&amp;gt; option. The format can be specified with the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; option immediately following the ''filename'' . If not specified, the guess will be attempted based on the ''filename'' . For iso format, the ''filename'' is actually the name of directory the Gramps database will be written into. For gramps-xml, gpkg, gedcom, wft, geneweb, and gramps-pkg, the ''filename'' is the name of the resulting file.&lt;br /&gt;
&lt;br /&gt;
-e, export a family tree in required format. It is not possible to export to a family tree.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  python gramps.py -i 'Family Tree 1' -i test.grdb -f grdb -e mergedDB.gramps&lt;br /&gt;
Note that above does not change 'Family Tree 1' as everything happens via a temporary database, whereas:&lt;br /&gt;
  python gramps.py -O 'Family Tree 1' -i test.grdb -f grdb -e mergedDB.gramps&lt;br /&gt;
will import test.grdb into Family Tree 1, and then export to a file !&lt;br /&gt;
&lt;br /&gt;
{{man tip| Exporting more files |More than one file can be exported in one command. If this is the case, Gramps will attempt to write several files using the data from the database available at the moment.}}&lt;br /&gt;
&lt;br /&gt;
When more than one output file is given, each has to be preceded by &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; flag. The files are written one by one, in the specified order.&lt;br /&gt;
&lt;br /&gt;
=== Action options ===&lt;br /&gt;
&lt;br /&gt;
The action to perform on the imported data can be specified with the &amp;lt;code&amp;gt;-a action&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--action=action&amp;lt;/code&amp;gt; option. This is done after all imports are successfully completed.&lt;br /&gt;
&lt;br /&gt;
The following actions remain the same:&lt;br /&gt;
&lt;br /&gt;
*''report'': This action allows producing reports from the command line.&lt;br /&gt;
&lt;br /&gt;
*''tool'': This action allows to run a tool from the command line.&lt;br /&gt;
&lt;br /&gt;
Reports and tools generally have many options of their own, so these actions should be followed by the report/tool option string. The string is given using the &amp;lt;code&amp;gt;-p option_string&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--options=option_string&amp;lt;/code&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
The actions available in older versions of Gramps which were relocated in Gramps 3.3 are:&lt;br /&gt;
&lt;br /&gt;
*''summary'': This action was the same as {{man menu|Reports -&amp;gt;View -&amp;gt;Summary}}. In Gramps 3.3 it was replaced by (or renamed to)   '''-a report -p name=summary'''.&lt;br /&gt;
&lt;br /&gt;
*''check'': This action was the same as {{man menu|Tools -&amp;gt;Database Processing -&amp;gt;Check and Repair}}. In Gramps 3.3 it was replaced by (or renamed to) '''-a tool -p name=check'''.&lt;br /&gt;
&lt;br /&gt;
==== report action option ====&lt;br /&gt;
You can generate most reports from the command line using the report action. &lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can provide the css style to use here with the css option:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html,css=Web_Nebraska.css&amp;quot;&lt;br /&gt;
or without css in the html output:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,style=default,off=html,of=test.html,css=&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{man tip| Report option string |The report option string should satisfy the following conditions:&amp;lt;br /&amp;gt;It must not contain any spaces (due to the general nature of the command line interface). If some arguments need to include spaces, the string should be enclosed with quotation marks.&amp;lt;br /&amp;gt;Option string must list pairs of option names and values. Within a pair, option name and value must be separated by the equal sign.&amp;lt;br /&amp;gt;Different pairs must be separated by commas.}}&lt;br /&gt;
&lt;br /&gt;
Most of the report options are specific for every report. However, there are some common options.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;name=report_name&amp;lt;/code&amp;gt;: This mandatory option determines which report will be generated. &lt;br /&gt;
{{man note|Report names|If the supplied report_name does not correspond to any available report, an error message will be printed followed by this list of available reports.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   ancestor_chart            - Ancestor Tree&lt;br /&gt;
   ancestor_report           - Ahnentafel Report&lt;br /&gt;
   AncestorFill              - AncestorFill&lt;br /&gt;
   birthday_report           - Birthday and Anniversary Report&lt;br /&gt;
   calendar                  - Calendar&lt;br /&gt;
   d3-ancestralcollapsibletree  - Ancestral Collapsible Tree&lt;br /&gt;
   d3-ancestralfanchart      - Ancestral Fan Chart&lt;br /&gt;
   d3-descendantindentedtree - Descendant Indented Tree&lt;br /&gt;
   database-differences-report  - Database Differences Report&lt;br /&gt;
   denominoviso              - DenominoViso&lt;br /&gt;
   descend_chart             - Descendant Tree&lt;br /&gt;
   descend_report            - Descendant Report&lt;br /&gt;
   DescendantBook            - Descendant Book&lt;br /&gt;
   Descendants Lines         - Descendants Lines&lt;br /&gt;
   det_ancestor_report       - Detailed Ancestral Report&lt;br /&gt;
   det_descendant_report     - Detailed Descendant Report&lt;br /&gt;
   DetailedDescendantBook    - Detailed Descendant Book&lt;br /&gt;
   double_cousins            - Double Cousins&lt;br /&gt;
   DynamicWeb                - Dynamic Web Report&lt;br /&gt;
   endofline_report          - End of Line Report&lt;br /&gt;
   family_descend_chart      - Family Descendant Tree&lt;br /&gt;
   family_group              - Family Group Report&lt;br /&gt;
   familylines_graph         - Family Lines Graph&lt;br /&gt;
   FamilySheet               - Family Sheet&lt;br /&gt;
   FamilyTree                - Family Tree&lt;br /&gt;
   fan_chart                 - Fan Chart&lt;br /&gt;
   gt_ancestor               - Ancestor Tree&lt;br /&gt;
   gt_descendant             - Descendant Tree&lt;br /&gt;
   gt_grandparent            - Grandparent Tree&lt;br /&gt;
   gt_sandclock              - Sandclock Tree&lt;br /&gt;
   gt_sandclock_family       - Sandclock Tree for a Family&lt;br /&gt;
   Heatmap                   - Heatmap&lt;br /&gt;
   hourglass_graph           - Hourglass Graph&lt;br /&gt;
   indiv_complete            - Complete Individual Report&lt;br /&gt;
   kinship_report            - Kinship Report&lt;br /&gt;
   LastChangeReport          - Last Change Report&lt;br /&gt;
   LinesOfDescendency        - Lines of Descendency Report&lt;br /&gt;
   ListeEclair               - Tiny Tafel&lt;br /&gt;
   MediaReport               - Media Report&lt;br /&gt;
   navwebpage                - Narrated Web Site&lt;br /&gt;
   networkchart              - Network Chart&lt;br /&gt;
   notelinkreport            - Note Link Report&lt;br /&gt;
   number_of_ancestors       - Number of Ancestors Report&lt;br /&gt;
   PedigreeChart             - Pedigree Chart&lt;br /&gt;
   PersonEverythingReport    - PersonEverything Report&lt;br /&gt;
   place_report              - Place Report&lt;br /&gt;
   records                   - Records Report&lt;br /&gt;
   rel_graph                 - Relationship Graph&lt;br /&gt;
   Repositories Report       - Repositories Report&lt;br /&gt;
   SourcesCitationsReport    - Sources and Citations Report&lt;br /&gt;
   statistics_chart          - Statistics Charts&lt;br /&gt;
   summary                   - Database Summary Report&lt;br /&gt;
   tag_report                - Tag Report&lt;br /&gt;
   timeline                  - Timeline Chart&lt;br /&gt;
   TimePedigreeHTML          - Timeline Pedigree Report&lt;br /&gt;
   TodoReport                - Todo Report&lt;br /&gt;
   WebCal                    - Web Calendar&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
*&amp;lt;code&amp;gt;of=&amp;lt;/code&amp;gt;: output filename and optional destination folder/directory eg: &amp;lt;code&amp;gt;of=&amp;quot;C:\Users\&amp;lt;username&amp;gt;\Desktop\FamilyTree.odt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;off=&amp;lt;/code&amp;gt;: output format. These are the extension an output format makes available, eg, pdf, html, doc, ...&lt;br /&gt;
*&amp;lt;code&amp;gt;style=&amp;lt;/code&amp;gt;: for text reports, the stylesheet to use. Defaults to 'default'.&lt;br /&gt;
*&amp;lt;code&amp;gt;show=all&amp;lt;/code&amp;gt;: This will produce the list of names for all options available for a given report.&lt;br /&gt;
*&amp;lt;code&amp;gt;show=option_name&amp;lt;/code&amp;gt;: This will print the description of the functionality supplied by the option_name, as well as what are the acceptable types and values for this option.&lt;br /&gt;
&lt;br /&gt;
So, to learn to use a report, do for example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p &amp;quot;name=family_group,show=all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{man tip| Tip |If an option is not supplied, the last used value will be used. If this report has never been generated before, then the value from last generated report will be used when applicable. Otherwise, the default value will be used.}}&lt;br /&gt;
&lt;br /&gt;
When more than one output action is given, each has to be preceded by &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; flag. The actions are performed one by one, in the specified order.&lt;br /&gt;
&lt;br /&gt;
{{man tip| lists |Some reports have options or arguments which are interpreted (by the report) to be on multiple lines.  For instance some reports allow you to format how the information will be shown, perhaps with a name on one line and the person's birth date on the next line.  Such multiple-line options or arguments are called &amp;quot;lists&amp;quot; by Gramps.}}&lt;br /&gt;
&lt;br /&gt;
On the command line such lists must always start with a left square bracket &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; and must always end with a right square bracket &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt; but since such square brackets are usually &amp;quot;special&amp;quot; to the &amp;quot;shell&amp;quot; (they mean something to the command interpreter&lt;br /&gt;
you are typing the command to), you must &amp;quot;escape&amp;quot; them so that they are ignored by your shell.&lt;br /&gt;
&lt;br /&gt;
The details vary with each shell but (in linux/UNIX) usually you can precede such a square bracket with a backslash &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; or put quotation marks around the square bracket, usually either &amp;quot;single&amp;quot; or &amp;quot;double&amp;quot; ones.&lt;br /&gt;
&lt;br /&gt;
The Hourglass Graph report allows you to put a &amp;quot;note&amp;quot; at the top of the report and such a &amp;quot;note&amp;quot; is an example of a &amp;quot;list&amp;quot; option.  Here is an example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p name=hourglass_graph,note='[line one,line two]'&lt;br /&gt;
which shows that inside such a list different lines are separated by commas, and that spaces are acceptable since the quotation marks are already there for the square brackets.&lt;br /&gt;
&lt;br /&gt;
But if you want to have a comma inside your report you have to somehow tell Gramps that comma is not one which separates lines.  You do that by enclosing the line with the comma in quotation marks (either single or double).&lt;br /&gt;
&lt;br /&gt;
But if you are already using a set of quotation marks (to enclose your square brackets) you have to use the other type to enclose&lt;br /&gt;
the line with your comma.  Here is an example:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -p name=hourglass_graph,note=&amp;quot;['line one, also line one','line two, also line two']&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is possible to include any character in a list but the details are beyond the scope of this command-line introduction to Gramps.&lt;br /&gt;
&lt;br /&gt;
You will need to know the precise methods available in your particular command shell interpreter to include a character which is &amp;quot;special&amp;quot; to your shell or &amp;quot;special&amp;quot; to Gramps (like the comma in the example above) but in general you will have to &amp;quot;escape&amp;quot; it twice, once to your shell and once again to Gramps, since you don't want your shell to think it is some instruction it should pay attention to and you don't want Gramps to think that either.&lt;br /&gt;
&lt;br /&gt;
==== tool action option ====&lt;br /&gt;
You can run most tools from the command line using the 'tool' action.&lt;br /&gt;
To see which ones, say:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p show=all&lt;br /&gt;
To see a tool's available options, for instance the &amp;quot;verify&amp;quot; tool:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p name=verify,show=all&lt;br /&gt;
To run a tool, for instance the &amp;quot;verify&amp;quot; tool:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a tool -p name=verify&lt;br /&gt;
&lt;br /&gt;
{{man note|Tool names|If the supplied tool_name does not correspond to any available tool, an error message will be printed followed by this list of available tools.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   check                     - Check and Repair Database&lt;br /&gt;
   chtype                    - Rename Event Types&lt;br /&gt;
   dgenstats                 - Dump Gender Statistics&lt;br /&gt;
   evname                    - Extract Event Description&lt;br /&gt;
   rebuild                   - Rebuild Secondary Indexes&lt;br /&gt;
   rebuild_genstats          - Rebuild Gender Statistics&lt;br /&gt;
   rebuild_refmap            - Rebuild Reference Maps&lt;br /&gt;
   reorder_ids               - Reorder Gramps IDs&lt;br /&gt;
   test_for_date_parser_and_displayer	- Check Localized Date Displayer and Parser&lt;br /&gt;
   testcasegenerator         - Generate Testcases for Persons and Families&lt;br /&gt;
   verify                    - Verify the Data&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==== book action option ====&lt;br /&gt;
{{man note|New feature|Added in Gramps 5.0}}&lt;br /&gt;
You can run books from the command line using the 'book' action.&lt;br /&gt;
To see which ones, say:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book&lt;br /&gt;
To see a book's available options, for instance a book called &amp;quot;mybook&amp;quot;:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book -p name=mybook,show=all&lt;br /&gt;
To run a book, for instance a book called &amp;quot;mybook&amp;quot;:&lt;br /&gt;
 gramps -O &amp;quot;Family Tree 1&amp;quot; -a book -p name=mybook&lt;br /&gt;
&lt;br /&gt;
{{man note|Book names|If the supplied book_name does not correspond to any available Book, an error message will be printed followed by this list of available Books. eg: Example listing only as the Books will be whatever you have named them.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Available names are:&lt;br /&gt;
   Granny Jones&lt;br /&gt;
   Grampa John&lt;br /&gt;
   Smith Family History&lt;br /&gt;
&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== Force unlock option ===&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt;: you can extend the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag with &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; to force a locked family to be unlocked. This allows you to recover from a crash that leaves the family tree (database) locked, from the command line.&lt;br /&gt;
&lt;br /&gt;
An example (to unlock the &amp;quot;Family Tree 1&amp;quot; database):&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O &amp;quot;Family Tree 1&amp;quot; -a report -u &amp;gt; /dev/null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man note|Note|It is not possible to open family trees that need repair from the command line.}}&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Unlocking_a_Family_Tree|Manage Family Trees:Unlocking a Family Tree]]&lt;br /&gt;
&lt;br /&gt;
=== Configuration (config) option ===&lt;br /&gt;
When all configuration variable(s) are set Gramps will start with these new values.&lt;br /&gt;
&lt;br /&gt;
These options can takes three forms:&lt;br /&gt;
{{man note|Note|Except for examples &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;3.2&amp;lt;/tt&amp;gt;, All the following examples, use &amp;lt;code&amp;gt;behavior.database-path&amp;lt;/code&amp;gt; as the configuration variable to change.}}&lt;br /&gt;
&lt;br /&gt;
;1) See all config values: &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--show&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
 gramps --show&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gramps config settings from /home/&amp;lt;~username&amp;gt;/.gramps/gramps50/gramps.ini:&lt;br /&gt;
export.proxy-order=[['privacy', 0], ['living', 0], ['person', 0], ['note', 0], ['reference', 0]]&lt;br /&gt;
&lt;br /&gt;
database.compress-backup=True&lt;br /&gt;
database.backend='bsddb'&lt;br /&gt;
database.backup-path='/home/&amp;lt;~username&amp;gt;'&lt;br /&gt;
database.port=''&lt;br /&gt;
database.autobackup=0&lt;br /&gt;
database.path='/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb'&lt;br /&gt;
database.host=''&lt;br /&gt;
database.backup-on-exit=True&lt;br /&gt;
&lt;br /&gt;
geography.lock=False&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
;2) See a single config value: &amp;lt;code&amp;gt;--config=database.path&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c database.path&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
 gramps --config=database.path&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Current Gramps config setting: database.path:'/home/&amp;lt;~username&amp;gt;/.gramps/grampsdb'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Set a value: &amp;lt;code&amp;gt;--config=behavior.database-path:'/media/mydb'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.database-path:'/media/mydb'&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
&lt;br /&gt;
3.1) Set a value to its default: &amp;lt;code&amp;gt;--config=behavior.database-path:DEFAULT&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.database-path:DEFAULT&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
&lt;br /&gt;
3.2) Set more than one value: &amp;lt;code&amp;gt;--config=behavior.use-tips:False --config=behavior.autoload:True&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-c behavior.use-tips:False -c behavior.autoload:True&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
=== Safe mode ===&lt;br /&gt;
&amp;lt;code&amp;gt;gramps -S&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gramps --safe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This CLI command starts Gramps as if it had never been installed before. In this mode, any previous family trees can still be loaded, as long as they were stored in the default folder. All other settings, filters, books, addons etc. are either cleared or returned to their default values. Other CLI commands can be used, or, if none, Gramps will start the GUI. Nothing except the actual family tree data is saved.&lt;br /&gt;
&lt;br /&gt;
Note that this is typically used to see if Gramps behaves better when it is running as if with a totally 'clean' install.  It is NOT permanent (if you want that see [[#Defaults|Defaults]] below), if you start Gramps normally after using this command all of your previous settings etc. are still there.&lt;br /&gt;
&lt;br /&gt;
This actually works by setting the folder that Gramps uses to store its user data (except for family trees) to a temporary directory, which is deleted when Gramps closes.&lt;br /&gt;
=== Defaults ===&lt;br /&gt;
&amp;lt;code&amp;gt;gramps -D E&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gramps --default=E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This CLI command causes Gramps to clear out or return to defaults the desired settings. &lt;br /&gt;
The family tree databases are NOT cleared out or removed.  &lt;br /&gt;
The sub-commands (replace the 'E' from the example command line above with one or more of &lt;br /&gt;
the subcommand characters) are:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; Addons are cleared. Any installed addons are removed, along with their settings.&lt;br /&gt;
*&amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; Filters are cleared. Any custom filters are removed.&lt;br /&gt;
*&amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; Preferences are returned to their default values.&lt;br /&gt;
*&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; Books are cleared, Reports and Tools settings are returned to their default values.&lt;br /&gt;
*&amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; Old '.zip' files from family tree version upgrades are deleted.&lt;br /&gt;
*&amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; Everything except the actual family tree data is returned to default settings. This does all of the above as well as a few more items; deletes thumbnails, maps, and the user CSS (used in web reports).&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 gramps -D AP&lt;br /&gt;
will cause Gramps to remove all the Addons and to reset Preferences to their default values.&lt;br /&gt;
== Operation ==&lt;br /&gt;
&lt;br /&gt;
If the first argument on the command line does not start with a dash (i.e. no flag), Gramps will attempt to open the file with the name given by the first argument and start an interactive session, ignoring the rest of the command line arguments.&lt;br /&gt;
&lt;br /&gt;
If the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag is given, then Gramps will try opening the supplied file name and then work with that data, as instructed by the further command line parameters.&lt;br /&gt;
&lt;br /&gt;
{{man note|1=Note |2=Only one file can be opened in a single invocation of Gramps. If you need to get data from multiple sources, use the importing options by using &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; flag.}}&lt;br /&gt;
&lt;br /&gt;
With or without the &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; flag, there could be multiple imports, exports, and actions specified further on the command line by using &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; , and &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; flags.&lt;br /&gt;
&lt;br /&gt;
The order of &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; , or &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; options with respect to each does not matter. The actual execution order always is: all imports (if any) -&amp;gt; all exports (if any) -&amp;gt; all actions (if any).&lt;br /&gt;
&lt;br /&gt;
{{man note| Note |But opening must always be first!}}&lt;br /&gt;
&lt;br /&gt;
If no &amp;lt;code&amp;gt;-O&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; option is given, Gramps will launch its main window and start the usual interactive session with the empty database, since there is no data to process, anyway.  (Unless you have already expressed a &amp;quot;preference&amp;quot; that it start with the last database it used.)&lt;br /&gt;
&lt;br /&gt;
If no &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; options are given, Gramps will launch its main window and start the usual interactive session with the database resulted from opening and all imports (if any). This database resides in a directory under the ''&amp;lt;code&amp;gt;~/.gramps/grampsdb/&amp;lt;/code&amp;gt;'' directory.&lt;br /&gt;
&lt;br /&gt;
Any errors encountered during import, export, or action, will be either dumped to stdout (if these are exceptions handled by Gramps) or to stderr (if these are not handled). Use usual shell redirections of stdout and stderr to save messages and errors in files.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
*To import four databases (whose formats can be determined from their names) and then check the resulting database for errors, one may type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps -i file4.wft -a check&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To explicitly specify the formats in the above example, append filenames with appropriate -f options:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -f gedcom -i file2.gpkg -f gramps-pkg -i ~/db3.gramps -f gramps-xml -i file4.wft -f wft -a check&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To record the database resulting from all imports, supply -e flag (use -f if the filename does not allow Gramps to guess the format):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -e ~/new-package -f gramps-pkg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To save any error messages of the above example into files outfile and errfile, run:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.dpkg -e ~/new-package -f gramps-pkg &amp;gt;outfile 2&amp;gt;errfile &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To import three databases and start interactive Gramps session with the result:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -i file1.ged -i file2.gpkg -i ~/db3.gramps &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To open a database and, based on that data, generate timeline report in PDF format putting the output into the my_timeline.pdf file:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O 'Family Tree 1' -a report -p name=timeline,off=pdf,of=my_timeline.pdf &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{man tip|1=Listing report options |2=Use the &amp;lt;code&amp;gt;''name=timeline,show=all''&amp;lt;/code&amp;gt; to find out about all available options for the timeline report. To find out details of a particular option, use &amp;lt;code&amp;gt;''show=option_name''&amp;lt;/code&amp;gt; , e.g. &amp;lt;code&amp;gt;''name=timeline,show=off''&amp;lt;/code&amp;gt; string. To learn about available report names, use &amp;lt;code&amp;gt;''name=show''&amp;lt;/code&amp;gt; string.}}&lt;br /&gt;
&lt;br /&gt;
*To convert the bsddb database on the fly to a .gramps xml file:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps -O 'Family Tree 1' -e output.gramps -f gramps-xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* To generate a web site into an other locale (in German):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;LANGUAGE=de_DE; LANG=de_DE.UTF-8 gramps -O 'Family Tree 1' -a report -p name=navwebpage,target=/../de &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Finally, to start normal interactive session type:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;gramps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Environment variables==&lt;br /&gt;
&lt;br /&gt;
{{man warn|Warning|Gramps can take advantage of the following [[Gramps_and_Windows#Environmental_Variables|environment variables]]&amp;lt;br /&amp;gt;('''Only change them if you know what are you doing.''')}}&lt;br /&gt;
&lt;br /&gt;
===GRAMPSHOME===&lt;br /&gt;
* '''GRAMPSHOME''' - if set, [[Gramps_and_Windows#Setting_the_configuration_path|override default path]] to profile allowing user to use an external network drive to store data and all settings. For technically advanced users who run multiple versions of Gramps, setting a different $GRAMPSHOME is a way to avoid interference between the different versions in the Gramps [[Gramps_Glossary#user_directory|User Directory]]. It can also be used to configure Gramps to [[Run_Gramps_from_a_portable_drive|run from a portable drive]] or to prepare for a [[Installation|manual installation]]. The path can also be used to configure the path to a [[Gramps_for_Windows_with_MSYS2#Keep_your_GRAMPSHOME_separate|separate test Tree]] or [[Getting_started_with_Gramps_development|development Tree]].&lt;br /&gt;
&lt;br /&gt;
For example &amp;lt;pre&amp;gt;GRAMPSHOME=$HOME/familytrees/paternal&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LANG, LANGUAGE, LC_MESSAGE, LC_TIME ===&lt;br /&gt;
* '''LANG''', '''LANGUAGE''', '''LC_MESSAGES''', and '''LC_TIME''' - are used by Gramps to determine which language file(s) should be loaded. See locale(1) for a general discussion of '''LANG''', '''LC_MESSAGES''', and '''LC_TIME'''. Note that in addition to setting date formats (which are overridden in Gramps with Preferences settings) '''LC_TIME''' also sets the language used for words in dates like month and day names and ''in the context of dates'' words like ''about'', ''between'', and ''before''. '''LANGUAGE''' is a comma-separated list of language codes (''not locales'', though certain languages like pt_BR or cn_TW are regional variants) that sets a preference-ordered list of desired translations. It will override '''LANG''' but not '''LC_MESSAGES''' or '''LC_TIME'''.&lt;br /&gt;
&lt;br /&gt;
{{man note|MacOSX|Because of the way launching with Finder works, the environment variables for the Gramps.app bundle are hard-coded in &amp;lt;code&amp;gt;Gramps.app/Contents/MacOS/Gramps&amp;lt;/code&amp;gt;. If for some reason you need to change them, edit that file with TextEdit; be sure to save it back as plain text. See as well [[Run_GRAMPS_in_another_locale#Change_Mac_OS_X_application_defaults|setting locale]] for an alternative to using the '''LANG''' and '''LANGUAGE''' environment variables.}}&lt;br /&gt;
&lt;br /&gt;
===GRAMPSI18N===&lt;br /&gt;
* [[Translating_Gramps#.24GRAMPSI18N_.28for_your_locale.29| $GRAMPSI18N (for your locale) ]] - The LANG assumes the Gramps translations are installed globally. If this is not the case, you need to [[Translating_Gramps#.24GRAMPSI18N_.28for_your_locale.29|give Gramps the directory]] where the translations will be found. This can be used to temporarily [[Howto:Change_the_language_of_reports|change the language for Reports]] being generated.&lt;br /&gt;
&lt;br /&gt;
A translation is called &amp;lt;code&amp;gt;gramps.mo&amp;lt;/code&amp;gt;, you can find it in Linux with the locate command. For example, if you have Swedish in directory &amp;lt;code&amp;gt;/home/me/gramps/mo/sv/gramps.mo&amp;lt;/code&amp;gt;, you can direct Gramps there using: &lt;br /&gt;
 GRAMPSI18N=/home/me/gramps/mo LC_ALL=C.UTF-8 LANG=&amp;quot;sv&amp;quot; python3 gramps&lt;br /&gt;
&lt;br /&gt;
===GRAMPSDIR===&lt;br /&gt;
* The environment variable GRAMPSDIR is the path to your [[Translating_Gramps#gramps.sh|Gramps directory]].&lt;br /&gt;
&lt;br /&gt;
===GRAMPS_RESOURCES===&lt;br /&gt;
* The environment variable GRAMPS_RESOURCES is the path to Gramps built-in resources files. You should only change this if you are using Gramps from source code or a custom environment.  An indicator that you need to set this variable is if you receive one of the following errors:&lt;br /&gt;
** ''Encoding error while parsing resource path''&lt;br /&gt;
** ''Failed to open resource file''&lt;br /&gt;
** ''Resource Path {invalid/path/to/resources} is invalid''&lt;br /&gt;
** ''Unable to determine resource path''&lt;br /&gt;
&lt;br /&gt;
Example [[Linux:Build_from_source#Running_from_a_tarball_release|usage]]:&lt;br /&gt;
 GRAMPS_RESOURCES=/home/username/gramps/branches/maintenance/gramps51/build/lib.linux-x86_64-2.7/ PYTHONPATH=$GRAMPS_RESOURCES:$PYTHONPATH ./gramps&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Keybindings|Gramps 5.1 Wiki Manual - User Directory|5.1}} &lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Command_Line}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:Import_Merge_Tool&amp;diff=89702</id>
		<title>Addon:Import Merge Tool</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:Import_Merge_Tool&amp;diff=89702"/>
		<updated>2022-01-16T21:34:24Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: FAQ: When would it make sense to use 'Merge Original' vs 'Merge Imported'?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
{{man tip|Released for Gramps 5.0.x or greater versions}}&lt;br /&gt;
[[File:ImportMerge.png|thumb|right|350px|Import and Merge tool]]&lt;br /&gt;
The Import and Merge tool will {{man label|Import and merge a Gramps XML}} family tree derived from your own [[How_to_make_a_backup|Gramps XML family tree]] backup file.&lt;br /&gt;
== Purpose of this tool ==&lt;br /&gt;
This tool was specifically written to make importing and merging a Gramps [[Genealogy_Glossary#family_tree|Tree]] derived from your own Tree easier. &lt;br /&gt;
&lt;br /&gt;
Make no mistake, merging is '''''hard'''''! And this tool is not magic, it does not make the process simple but it ''is'' easier than the alternatives.&lt;br /&gt;
&lt;br /&gt;
{{man note|Important Note|This tool this requires that the Family Tree being merged must be a Gramps Family Tree ''derived from a version'' of the currently loaded Family Tree.}} &lt;br /&gt;
&lt;br /&gt;
A situation occurs occasionally after giving someone a copy of your tree in our native [[Gramps XML]] format. Then each person makes changes to the copy in their possession using Gramps locally. (You can verify the Trees differ and log those revisions with the [[Addon:Database_Differences_Report|Database Differences]] add-on report.)&lt;br /&gt;
&lt;br /&gt;
Programmers call this a 'fork.' (As in: when travelers come to a 'fork in the road' and each chooses different paths.)  But the bottom line is that you now have two tree variants derived from a common Tree and you want share your updated Tree. You can't just give the person a fresh copy of your Tree because then their changes would be overwritten.&lt;br /&gt;
&lt;br /&gt;
At some point, you may want to merge the forks into a common tree... without losing the useful changes from either tree.  That synchronization is what this tool is designed to facilitate. It depends on the two Trees sharing common internal handles (not just the user-editable IDs) to simplify ignoring unchanged records. Then the tool focuses you on just the changes.&lt;br /&gt;
&lt;br /&gt;
But say the other user doesn't use Gramps, so you exported with [[Gramps_and_GEDCOM|GEDCOM]] (or another format) and got it back?  Sorry... this tool won't be any easier than a manual merge after a standard import. You'd still need to hand compare every record.&lt;br /&gt;
&lt;br /&gt;
The derived trees need not be limited to those edited by someone else. I often take a copy of my tree on my laptop when traveling and sometimes I make updates while on the road.  But then I may forget to copy it back to my home desktop computer until after I've made more updates.  This tool helps to merge these back together.&lt;br /&gt;
{{man warn|1=Warning: Data Corruption Risk |2=Mass changes mean more potential for mangling the data.  Back up your current tree BEFORE using this tool to merge.&amp;lt;br /&amp;gt;If something goes wrong, you will have a way to go back and start over. See [[How to make a backup|make a Gramps XML backup]].}}&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
The tool can be installed like any other Addon; see {{man label|[[Third-party_Addons#Installing_Addons_in_Gramps|Installing Addons in Gramps]]}}&lt;br /&gt;
&lt;br /&gt;
Once installed, it is run by using the {{man menu|Tools -&amp;gt; Family Tree Processing -&amp;gt; Import and Merge tool...}}.&lt;br /&gt;
=== Running the Import Merge tool ===&lt;br /&gt;
The tool will start with an 'Undo history warning' that suggest that you back up your work.&lt;br /&gt;
&lt;br /&gt;
You are then presented with the import file dialog, which shows '.gramps' files from your import location.&lt;br /&gt;
&lt;br /&gt;
When you have selected a file to import, the main tool window comes up and some progress meters pop up indicating the import and comparison process.  When this is complete you end up with a three part window.  The bottom part provides control and 'Action' buttons and a hint that changes depending on what you are doing.&lt;br /&gt;
&lt;br /&gt;
=== Top Pane ===&lt;br /&gt;
The top pane is a scrollable and selectable view of individual items that were found to be different in your import.  Items that were the same (since they were derived from the common Gramps tree) are not shown.&lt;br /&gt;
&lt;br /&gt;
[[File:ImportMerge.png|thumb|right|569px|Import and Merge tool]]&lt;br /&gt;
The top pane shows a 'Status' which is one of '''Different''', '''Added''', or '''Missing'''.  '''Different''' items were found in both the current and imported trees, but had been changed in some way.  ''Added'' items are found only in your imported tree.  And '''Missing''' items were found in your current tree, but not in the imported tree.&lt;br /&gt;
&lt;br /&gt;
The top pane also shows the ''Object'' type ('''Person''', '''Family''', '''Media''' etc.), its Gramps ''ID'', an ''Object Name or Description'', and the selected ''Action'' (more later).&lt;br /&gt;
&lt;br /&gt;
You can search for items by Name by just typing characters to match.  The top pane must be active for this to work.  For example if you are looking for 'Smith, Magnes' in the 'sample.gramps' tree, you could type 'smi' which would jump the selection to the first of the lines containing these characters, and then use cursor up/down keys to find the 'Smith' you are looking for.  Or type 'magn' which is more likely to land on the right place.&lt;br /&gt;
&lt;br /&gt;
You can search for items by 'ID' field by typing '#' and then the characters to match.  For example type '#I0103' to search for the individual with ID I0103.&lt;br /&gt;
&lt;br /&gt;
You can sort the top pane by ''Status'' (''Object'' will be a sub-sort), ''Object'', ''ID'', ''Object Name/Description'' (will be grouped by ''Object'') and ''Action''.  Click on the column header to change the sort.&lt;br /&gt;
&lt;br /&gt;
=== Lower Pane ===&lt;br /&gt;
When an item in the top pane is selected, the lower pane shows the specific differences.  If no ''Action'' is made yet, the pane will show the 'Original &amp;gt;&amp;gt;' and 'Imported &amp;gt;&amp;gt;' state for each sub-object and item that has a difference.  If an ''Action'' has been selected, the pane also includes a 'Result &amp;gt;&amp;gt;' for each sub-object and item that has a difference.&lt;br /&gt;
&lt;br /&gt;
Sometimes it may be difficult to determine enough about the difference to figure out what is going on.  If so, you can check the {{man label|Show more details}} checkbox to see more about the difference.&lt;br /&gt;
&lt;br /&gt;
The lower pane tries to present the information as concisely but informatively as possible.  Apologies if the information seems a bit hard to interpret at times.  One area that might be confusing is when there are differences in 'lists'.  Many of Gramps objects have lists of other objects, families have lists of children, persons have lists of events or notes etc.  When a list has changes, the left side will have a list position number preceded by '#'.  For example:&lt;br /&gt;
{|&lt;br /&gt;
|Person, Event References #1, Event&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Original &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0012] Death: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Imported &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0011] Birth: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|Person, Event References #2, Event&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Original  &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0011] Birth: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Imported &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0012] Death: Smith Gus&lt;br /&gt;
|}&lt;br /&gt;
In this example list of event references, the imported tree somehow got the Birth and Death events swapped, compared to the original tree.&lt;br /&gt;
&lt;br /&gt;
==== Control buttons ====&lt;br /&gt;
&lt;br /&gt;
{{man button|Help}} brings up this wiki.&lt;br /&gt;
&lt;br /&gt;
{{man button|Edit import}} allows editing of the selected item.  Any changes are temporarily saved in your imported data, and will be kept only if that data is merged into your current tree.  If your editing creates new items, they will appear in the top pane list when you finish editing.  Changes here cause the 'Action' to be cleared, so be sure to choose an Action when finished.&lt;br /&gt;
&lt;br /&gt;
{{man button|Unmark}} clears any current Action.  If an item remains unmarked when you are done, it will be treated as if 'Ignored', that is, there will be no changes to your tree for that item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Ignore}} sets the action for the item so that there will be no changes to your tree for that item.  This is the same as leaving the item unmarked, but makes it clear that you have looked at that item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Done}} tells the tool that you are finished marking the various actions.  The tool will bring up a confirmation dialog, allowing you to save your work, cancel and return to marking, or abandon it.&lt;br /&gt;
&lt;br /&gt;
The remaining buttons are considered 'Actions' and depend on the Status of the item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Add}} appears for items with an 'Added' status.  When added, the imported data will be added to your current tree.&lt;br /&gt;
&lt;br /&gt;
{{man button|Delete}} appears for items with a 'Missing' status.  When selected, the data in your tree for this item will be deleted.&lt;br /&gt;
&lt;br /&gt;
{{man button|Replace}} appears for items with a 'Different' status.  When replaced, the imported data for the item will completely replace the same data in your current tree.&lt;br /&gt;
&lt;br /&gt;
{{man button|Merge Original}} appears for items with a 'Different' status.  When selected, the imported data for the item will be merged with the original tree and the IDs of the original item are retained.  The portions of the data that cannot be merged will remain as it is in your current tree data.&lt;br /&gt;
&lt;br /&gt;
{{man button|Merge Import}} appears for items with a 'Different' status.  When selected, the imported data for the item will be merged with the original tree and the IDs of the imported item are used.  The portions of the data that cannot be merged will be replaced by the import data.&lt;br /&gt;
 &lt;br /&gt;
When you select an 'Action' with one of the buttons, a hint will appear that states the action in more detail.&lt;br /&gt;
&lt;br /&gt;
You can change the 'Action' at any time on any item, it may be instructive to see the results of choosing the various choices in the lower pane.&lt;br /&gt;
&lt;br /&gt;
In general I recommend that you start marking your items with the 'Different' items first.  Within these, doing '''Families''' and '''Persons''' first will usually minimize the amount of work to merge your tree.  This tool starts up with the sort set to put these items first, so starting at the top is easy.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mark ===&lt;br /&gt;
&lt;br /&gt;
This tool includes the ability to automatically mark those items that are 'referred to' by the item you are currently marking.  For Example, if you {{man button|Add}} a person, the events, notes, media, citations and families that the person refers to will also be added.  The same process is applied for each of the various 'Action' buttons.&lt;br /&gt;
&lt;br /&gt;
The marks that are automatically generated are shown in the top pane action column with a '*' preceding the action.&lt;br /&gt;
&lt;br /&gt;
Occasionally you may mark items that create a conflict in the automatic marking.  For example you {{man button|Add}} a person that refers to a media, and then later {{man button|Ignore}}  a person that also refers to the same media.  In this case, the media item will be marked with a '?' and the action that tends to conserve more data will be used.  This means that Adds have priority over Ignore, Ignore over Delete etc.  &lt;br /&gt;
&lt;br /&gt;
You should review any items marked this way to make sure that you agree with the program.&lt;br /&gt;
&lt;br /&gt;
Note that families and persons in particular usually have a lot of references to other families or persons.  In fact if your imported file contains a whole new branch of your family tree, selecting any one of the people or families in that branch will automatically mark all the new people and families at once.  This is usually desirable, but not always.&lt;br /&gt;
&lt;br /&gt;
==== Automatic mark with Families ====&lt;br /&gt;
This tool is not ideal for selecting only parts of a tree for merging, but it can be done.  If you wish to include a person, but not his family (spouse and children) then you can uncheck the {{man label|Automark Families}} checkbox.  This applies to all persons found via the Automark as well.  The effect is that you can get ancestors (if {{man label|Automark Parent Families}} is checked) included but not all the descendants of those ancestors.&lt;br /&gt;
&lt;br /&gt;
If you wish to get a set of spouses and descendants included when adding a person but not all the ancestors of the spouses, then you can uncheck the {{man label|Automark Parent Families}} checkbox and leave the {{man label|Automark Families}} unchecked.&lt;br /&gt;
If you don't want any family or parent families automatically included, leave both {{man label|Automark Parent Families}} and {{man label|Automark Families}} unchecked.&lt;br /&gt;
&lt;br /&gt;
=== Finishing up ===&lt;br /&gt;
When you have marked up as many items as you want and reviewed the automatic marks to make sure they are what you desire, you can press the {{man button|Done}} button.&lt;br /&gt;
&lt;br /&gt;
The tool will bring up a confirmation dialog, allowing you to save your work, cancel and return to marking, or abandon it.  If you abandon, your markings are lost and no changes are made to your current tree.&lt;br /&gt;
&lt;br /&gt;
If you decide to save your work, the tool will perform a series of checks as it saves your work.  These checks make sure that any conflicts that may have been created will not result in errors in your database.  For example, if you selected a person to add, but decided to ignore a note attached to that person, the tool will 'clean up' the reference to the note on the person before saving it.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
;Why would I want to use the {{man button|Edit import}} button?&lt;br /&gt;
: If you had an item with a difference, where both the current tree and the imported tree made changes.  Because of some limitations of Gramps and this tool, you cannot choose between current and imported for every detail within an object.  For these details, you can only choose to keep your current data with {{man button|Ignore}} or {{man button|Merge Original}}, or use the imported data with {{man button|Replace}} or {{man button|Merge Import}}.  In either case some changes will be lost.  For example, if you have edited a Person and added a Nickname, and the imported tree had edited the same person to add a LDS Ordinance, you can only keep the information for one side.  In this case you might want to edit the imported person to change it to add the Nickname so that data will not be lost.&lt;br /&gt;
&lt;br /&gt;
;Why does the import file have to be derived from the same original source?&lt;br /&gt;
: If it is not, then the matching process will not find any items that are the same or even different.  Every item in the import file will end up showing as 'Added', and every item in the current tree will show as 'Missing'.  You can use this tool to add in part or all of the imported data, but it is not ideal for this purpose.  You would be better importing the data into a new tree, using all the Gramps views and filters to find what you do or don't want, make any deletions or edits and export to a new XML before importing that into your tree the usual way.&lt;br /&gt;
&lt;br /&gt;
;When would it make sense to use 'Merge Original' vs 'Merge Imported'?&lt;br /&gt;
: The difference between 'Merge Original' or 'Merge Imported' is which Gramps IDs are kept as the final object.  If you would like to keep your starting family tree the way you have set it up, use Merge Original.  If you think that the imported tree is better, has better IDs etc, then use the Merge Imported.&lt;br /&gt;
&lt;br /&gt;
;Why can't you use a GEDCOM file as the import source?&lt;br /&gt;
: One of the things that make this tool work is that every 'object' in the Gramps database has a unique ID called a handle (this is different than the ID shown in the GUI for each object).  The tool can compare objects with matching handles relatively easily, much more easily than guessing if John Smith in your tree is the one from 1722, 1854, or 2012.  &lt;br /&gt;
: At this time Gramps GEDCOM import and export has no way to save these handles to make this sort of matching possible.  A few of the other family tree tools can import and export the so called '_UID' GEDCOM tag (which is not standardized) which might be usable for this, but most tools will simply discard them or modify them to be unusable.  Even if these were available and not lost in translation, Gramps data model does not always match with GEDCOM data model.  So a GEDCOM export/import, even without any changes made by the user, would have a lot of differences.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If you are not sure exactly what an imported tree contains, you should use Gramps to examine it before using this tool.  Import the tree into a new family tree, and look it over with the various charts (I like the relationship chart myself) to see if there are branches that you don't want.  It is frequently easier to use Gramps filters or editing tools to remove items than to use the tool to exclude them, although the tool will suffice for simpler cases.  Even then you should take notes on the IDs of people or families that you don't want, to make it easier to find them with this tool.&lt;br /&gt;
&lt;br /&gt;
This is a new tool and fairly complex.  Please report any issues or desired enhancements to paulr2787 at gmail.com&lt;br /&gt;
&lt;br /&gt;
I have included a French translation of the tool, mostly as a test of the internationalization code.  Since I don't speak French (USA Texas version of English only), please excuse my French.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Addon:Database_Differences_Report|Database Differences Report]] - allows a mostly complete comparison between the currently opened database (Family Tree) and a Gramps XML file.&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Addon:Import_Merge_Tool&amp;diff=89701</id>
		<title>Addon:Import Merge Tool</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Addon:Import_Merge_Tool&amp;diff=89701"/>
		<updated>2022-01-16T21:28:56Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Clarify difference between Merge Original and Merge Import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Third-party plugin}}&lt;br /&gt;
{{man tip|Released for Gramps 5.0.x or greater versions}}&lt;br /&gt;
[[File:ImportMerge.png|thumb|right|350px|Import and Merge tool]]&lt;br /&gt;
The Import and Merge tool will {{man label|Import and merge a Gramps XML}} family tree derived from your own [[How_to_make_a_backup|Gramps XML family tree]] backup file.&lt;br /&gt;
== Purpose of this tool ==&lt;br /&gt;
This tool was specifically written to make importing and merging a Gramps [[Genealogy_Glossary#family_tree|Tree]] derived from your own Tree easier. &lt;br /&gt;
&lt;br /&gt;
Make no mistake, merging is '''''hard'''''! And this tool is not magic, it does not make the process simple but it ''is'' easier than the alternatives.&lt;br /&gt;
&lt;br /&gt;
{{man note|Important Note|This tool this requires that the Family Tree being merged must be a Gramps Family Tree ''derived from a version'' of the currently loaded Family Tree.}} &lt;br /&gt;
&lt;br /&gt;
A situation occurs occasionally after giving someone a copy of your tree in our native [[Gramps XML]] format. Then each person makes changes to the copy in their possession using Gramps locally. (You can verify the Trees differ and log those revisions with the [[Addon:Database_Differences_Report|Database Differences]] add-on report.)&lt;br /&gt;
&lt;br /&gt;
Programmers call this a 'fork.' (As in: when travelers come to a 'fork in the road' and each chooses different paths.)  But the bottom line is that you now have two tree variants derived from a common Tree and you want share your updated Tree. You can't just give the person a fresh copy of your Tree because then their changes would be overwritten.&lt;br /&gt;
&lt;br /&gt;
At some point, you may want to merge the forks into a common tree... without losing the useful changes from either tree.  That synchronization is what this tool is designed to facilitate. It depends on the two Trees sharing common internal handles (not just the user-editable IDs) to simplify ignoring unchanged records. Then the tool focuses you on just the changes.&lt;br /&gt;
&lt;br /&gt;
But say the other user doesn't use Gramps, so you exported with [[Gramps_and_GEDCOM|GEDCOM]] (or another format) and got it back?  Sorry... this tool won't be any easier than a manual merge after a standard import. You'd still need to hand compare every record.&lt;br /&gt;
&lt;br /&gt;
The derived trees need not be limited to those edited by someone else. I often take a copy of my tree on my laptop when traveling and sometimes I make updates while on the road.  But then I may forget to copy it back to my home desktop computer until after I've made more updates.  This tool helps to merge these back together.&lt;br /&gt;
{{man warn|1=Warning: Data Corruption Risk |2=Mass changes mean more potential for mangling the data.  Back up your current tree BEFORE using this tool to merge.&amp;lt;br /&amp;gt;If something goes wrong, you will have a way to go back and start over. See [[How to make a backup|make a Gramps XML backup]].}}&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
The tool can be installed like any other Addon; see {{man label|[[Third-party_Addons#Installing_Addons_in_Gramps|Installing Addons in Gramps]]}}&lt;br /&gt;
&lt;br /&gt;
Once installed, it is run by using the {{man menu|Tools -&amp;gt; Family Tree Processing -&amp;gt; Import and Merge tool...}}.&lt;br /&gt;
=== Running the Import Merge tool ===&lt;br /&gt;
The tool will start with an 'Undo history warning' that suggest that you back up your work.&lt;br /&gt;
&lt;br /&gt;
You are then presented with the import file dialog, which shows '.gramps' files from your import location.&lt;br /&gt;
&lt;br /&gt;
When you have selected a file to import, the main tool window comes up and some progress meters pop up indicating the import and comparison process.  When this is complete you end up with a three part window.  The bottom part provides control and 'Action' buttons and a hint that changes depending on what you are doing.&lt;br /&gt;
&lt;br /&gt;
=== Top Pane ===&lt;br /&gt;
The top pane is a scrollable and selectable view of individual items that were found to be different in your import.  Items that were the same (since they were derived from the common Gramps tree) are not shown.&lt;br /&gt;
&lt;br /&gt;
[[File:ImportMerge.png|thumb|right|569px|Import and Merge tool]]&lt;br /&gt;
The top pane shows a 'Status' which is one of '''Different''', '''Added''', or '''Missing'''.  '''Different''' items were found in both the current and imported trees, but had been changed in some way.  ''Added'' items are found only in your imported tree.  And '''Missing''' items were found in your current tree, but not in the imported tree.&lt;br /&gt;
&lt;br /&gt;
The top pane also shows the ''Object'' type ('''Person''', '''Family''', '''Media''' etc.), its Gramps ''ID'', an ''Object Name or Description'', and the selected ''Action'' (more later).&lt;br /&gt;
&lt;br /&gt;
You can search for items by Name by just typing characters to match.  The top pane must be active for this to work.  For example if you are looking for 'Smith, Magnes' in the 'sample.gramps' tree, you could type 'smi' which would jump the selection to the first of the lines containing these characters, and then use cursor up/down keys to find the 'Smith' you are looking for.  Or type 'magn' which is more likely to land on the right place.&lt;br /&gt;
&lt;br /&gt;
You can search for items by 'ID' field by typing '#' and then the characters to match.  For example type '#I0103' to search for the individual with ID I0103.&lt;br /&gt;
&lt;br /&gt;
You can sort the top pane by ''Status'' (''Object'' will be a sub-sort), ''Object'', ''ID'', ''Object Name/Description'' (will be grouped by ''Object'') and ''Action''.  Click on the column header to change the sort.&lt;br /&gt;
&lt;br /&gt;
=== Lower Pane ===&lt;br /&gt;
When an item in the top pane is selected, the lower pane shows the specific differences.  If no ''Action'' is made yet, the pane will show the 'Original &amp;gt;&amp;gt;' and 'Imported &amp;gt;&amp;gt;' state for each sub-object and item that has a difference.  If an ''Action'' has been selected, the pane also includes a 'Result &amp;gt;&amp;gt;' for each sub-object and item that has a difference.&lt;br /&gt;
&lt;br /&gt;
Sometimes it may be difficult to determine enough about the difference to figure out what is going on.  If so, you can check the {{man label|Show more details}} checkbox to see more about the difference.&lt;br /&gt;
&lt;br /&gt;
The lower pane tries to present the information as concisely but informatively as possible.  Apologies if the information seems a bit hard to interpret at times.  One area that might be confusing is when there are differences in 'lists'.  Many of Gramps objects have lists of other objects, families have lists of children, persons have lists of events or notes etc.  When a list has changes, the left side will have a list position number preceded by '#'.  For example:&lt;br /&gt;
{|&lt;br /&gt;
|Person, Event References #1, Event&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Original &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0012] Death: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Imported &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0011] Birth: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|Person, Event References #2, Event&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Original  &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0011] Birth: Smith Gus&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &amp;lt;font face=&amp;quot;monospace&amp;quot;&amp;gt;   Imported &amp;gt;&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
|your tree Event: [E0012] Death: Smith Gus&lt;br /&gt;
|}&lt;br /&gt;
In this example list of event references, the imported tree somehow got the Birth and Death events swapped, compared to the original tree.&lt;br /&gt;
&lt;br /&gt;
==== Control buttons ====&lt;br /&gt;
&lt;br /&gt;
{{man button|Help}} brings up this wiki.&lt;br /&gt;
&lt;br /&gt;
{{man button|Edit import}} allows editing of the selected item.  Any changes are temporarily saved in your imported data, and will be kept only if that data is merged into your current tree.  If your editing creates new items, they will appear in the top pane list when you finish editing.  Changes here cause the 'Action' to be cleared, so be sure to choose an Action when finished.&lt;br /&gt;
&lt;br /&gt;
{{man button|Unmark}} clears any current Action.  If an item remains unmarked when you are done, it will be treated as if 'Ignored', that is, there will be no changes to your tree for that item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Ignore}} sets the action for the item so that there will be no changes to your tree for that item.  This is the same as leaving the item unmarked, but makes it clear that you have looked at that item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Done}} tells the tool that you are finished marking the various actions.  The tool will bring up a confirmation dialog, allowing you to save your work, cancel and return to marking, or abandon it.&lt;br /&gt;
&lt;br /&gt;
The remaining buttons are considered 'Actions' and depend on the Status of the item.&lt;br /&gt;
&lt;br /&gt;
{{man button|Add}} appears for items with an 'Added' status.  When added, the imported data will be added to your current tree.&lt;br /&gt;
&lt;br /&gt;
{{man button|Delete}} appears for items with a 'Missing' status.  When selected, the data in your tree for this item will be deleted.&lt;br /&gt;
&lt;br /&gt;
{{man button|Replace}} appears for items with a 'Different' status.  When replaced, the imported data for the item will completely replace the same data in your current tree.&lt;br /&gt;
&lt;br /&gt;
{{man button|Merge Original}} appears for items with a 'Different' status.  When selected, the imported data for the item will be merged with the original tree and the IDs of the original item are retained.  The portions of the data that cannot be merged will remain as it is in your current tree data.&lt;br /&gt;
&lt;br /&gt;
{{man button|Merge Import}} appears for items with a 'Different' status.  When selected, the imported data for the item will be merged with the original tree and the IDs of the imported item are used.  The portions of the data that cannot be merged will be replaced by the import data.&lt;br /&gt;
 &lt;br /&gt;
When you select an 'Action' with one of the buttons, a hint will appear that states the action in more detail.&lt;br /&gt;
&lt;br /&gt;
You can change the 'Action' at any time on any item, it may be instructive to see the results of choosing the various choices in the lower pane.&lt;br /&gt;
&lt;br /&gt;
In general I recommend that you start marking your items with the 'Different' items first.  Within these, doing '''Families''' and '''Persons''' first will usually minimize the amount of work to merge your tree.  This tool starts up with the sort set to put these items first, so starting at the top is easy.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Mark ===&lt;br /&gt;
&lt;br /&gt;
This tool includes the ability to automatically mark those items that are 'referred to' by the item you are currently marking.  For Example, if you {{man button|Add}} a person, the events, notes, media, citations and families that the person refers to will also be added.  The same process is applied for each of the various 'Action' buttons.&lt;br /&gt;
&lt;br /&gt;
The marks that are automatically generated are shown in the top pane action column with a '*' preceding the action.&lt;br /&gt;
&lt;br /&gt;
Occasionally you may mark items that create a conflict in the automatic marking.  For example you {{man button|Add}} a person that refers to a media, and then later {{man button|Ignore}}  a person that also refers to the same media.  In this case, the media item will be marked with a '?' and the action that tends to conserve more data will be used.  This means that Adds have priority over Ignore, Ignore over Delete etc.  &lt;br /&gt;
&lt;br /&gt;
You should review any items marked this way to make sure that you agree with the program.&lt;br /&gt;
&lt;br /&gt;
Note that families and persons in particular usually have a lot of references to other families or persons.  In fact if your imported file contains a whole new branch of your family tree, selecting any one of the people or families in that branch will automatically mark all the new people and families at once.  This is usually desirable, but not always.&lt;br /&gt;
&lt;br /&gt;
==== Automatic mark with Families ====&lt;br /&gt;
This tool is not ideal for selecting only parts of a tree for merging, but it can be done.  If you wish to include a person, but not his family (spouse and children) then you can uncheck the {{man label|Automark Families}} checkbox.  This applies to all persons found via the Automark as well.  The effect is that you can get ancestors (if {{man label|Automark Parent Families}} is checked) included but not all the descendants of those ancestors.&lt;br /&gt;
&lt;br /&gt;
If you wish to get a set of spouses and descendants included when adding a person but not all the ancestors of the spouses, then you can uncheck the {{man label|Automark Parent Families}} checkbox and leave the {{man label|Automark Families}} unchecked.&lt;br /&gt;
If you don't want any family or parent families automatically included, leave both {{man label|Automark Parent Families}} and {{man label|Automark Families}} unchecked.&lt;br /&gt;
&lt;br /&gt;
=== Finishing up ===&lt;br /&gt;
When you have marked up as many items as you want and reviewed the automatic marks to make sure they are what you desire, you can press the {{man button|Done}} button.&lt;br /&gt;
&lt;br /&gt;
The tool will bring up a confirmation dialog, allowing you to save your work, cancel and return to marking, or abandon it.  If you abandon, your markings are lost and no changes are made to your current tree.&lt;br /&gt;
&lt;br /&gt;
If you decide to save your work, the tool will perform a series of checks as it saves your work.  These checks make sure that any conflicts that may have been created will not result in errors in your database.  For example, if you selected a person to add, but decided to ignore a note attached to that person, the tool will 'clean up' the reference to the note on the person before saving it.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
;Why would I want to use the {{man button|Edit import}} button?&lt;br /&gt;
: If you had an item with a difference, where both the current tree and the imported tree made changes.  Because of some limitations of Gramps and this tool, you cannot choose between current and imported for every detail within an object.  For these details, you can only choose to keep your current data with {{man button|Ignore}} or {{man button|Merge Original}}, or use the imported data with {{man button|Replace}} or {{man button|Merge Import}}.  In either case some changes will be lost.  For example, if you have edited a Person and added a Nickname, and the imported tree had edited the same person to add a LDS Ordinance, you can only keep the information for one side.  In this case you might want to edit the imported person to change it to add the Nickname so that data will not be lost.&lt;br /&gt;
&lt;br /&gt;
;Why does the import file have to be derived from the same original source?&lt;br /&gt;
: If it is not, then the matching process will not find any items that are the same or even different.  Every item in the import file will end up showing as 'Added', and every item in the current tree will show as 'Missing'.  You can use this tool to add in part or all of the imported data, but it is not ideal for this purpose.  You would be better importing the data into a new tree, using all the Gramps views and filters to find what you do or don't want, make any deletions or edits and export to a new XML before importing that into your tree the usual way.&lt;br /&gt;
&lt;br /&gt;
;Why can't you use a GEDCOM file as the import source?&lt;br /&gt;
: One of the things that make this tool work is that every 'object' in the Gramps database has a unique ID called a handle (this is different than the ID shown in the GUI for each object).  The tool can compare objects with matching handles relatively easily, much more easily than guessing if John Smith in your tree is the one from 1722, 1854, or 2012.  &lt;br /&gt;
: At this time Gramps GEDCOM import and export has no way to save these handles to make this sort of matching possible.  A few of the other family tree tools can import and export the so called '_UID' GEDCOM tag (which is not standardized) which might be usable for this, but most tools will simply discard them or modify them to be unusable.  Even if these were available and not lost in translation, Gramps data model does not always match with GEDCOM data model.  So a GEDCOM export/import, even without any changes made by the user, would have a lot of differences.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
If you are not sure exactly what an imported tree contains, you should use Gramps to examine it before using this tool.  Import the tree into a new family tree, and look it over with the various charts (I like the relationship chart myself) to see if there are branches that you don't want.  It is frequently easier to use Gramps filters or editing tools to remove items than to use the tool to exclude them, although the tool will suffice for simpler cases.  Even then you should take notes on the IDs of people or families that you don't want, to make it easier to find them with this tool.&lt;br /&gt;
&lt;br /&gt;
This is a new tool and fairly complex.  Please report any issues or desired enhancements to paulr2787 at gmail.com&lt;br /&gt;
&lt;br /&gt;
I have included a French translation of the tool, mostly as a test of the internationalization code.  Since I don't speak French (USA Texas version of English only), please excuse my French.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Addon:Database_Differences_Report|Database Differences Report]] - allows a mostly complete comparison between the currently opened database (Family Tree) and a Gramps XML file.&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Talk:Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89077</id>
		<title>Talk:Gramps 5.1 Wiki Manual - Keybindings</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Talk:Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89077"/>
		<updated>2022-01-03T15:37:49Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Highlighting differences in behavior between People Grouped and Place Tree&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;@Call_me_Dave&lt;br /&gt;
&lt;br /&gt;
Thanks for reviewing and making improvements to my recent changes to the keybinding page. My first instinct was to create a combined table for Grouped views like People Grouped and Place Tree because they have similar behaviors but I noticed at least one difference between the two:&lt;br /&gt;
&lt;br /&gt;
Pressing Enter in People Grouped view expands and collapses entries of the selected entry in Group mode, but in the Place Tree view, it actually edits the entry, so I decided to split them up. What would be a good way to highlight that in the current wiki?&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89048</id>
		<title>Gramps 5.1 Wiki Manual - Keybindings</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89048"/>
		<updated>2022-01-02T12:29:43Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add Pace View bindings section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - FAQ|Gramps 5.1 Wiki Manual - Command Line|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Keybindings}}&lt;br /&gt;
{{#vardefine:chapter|B}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
This appendix lists keybindings (also known as ''Keyboard shortcuts'' or ''hotkeys'') that can be used in the Gramps dialogs as an alternative to using the mouse.&lt;br /&gt;
&lt;br /&gt;
Some keybindings require the user to press a single key or a sequence of keys one after the other. Other keybindings require pressing and holding several keys simultaneously. &lt;br /&gt;
== List Views ==&lt;br /&gt;
=== Common keybindings ===&lt;br /&gt;
&lt;br /&gt;
{{man tip|Keyboards are not all the same!|&lt;br /&gt;
Keybindings may depend on the keyboard layout (localization) and on your computer&amp;amp;rsquo;s Operating System.{{-}}&lt;br /&gt;
[[File:windows_180x160.png|128px]] [[File:macos_200x200.png|128px]]  [[File:Linux_220x261.png|128px]]  [[File:Bsd daemon.png|128px]]}}&lt;br /&gt;
The following keybindings are available in all category [[Gramps_Glossary#view|views]].&lt;br /&gt;
{|{{prettytable}}&lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!macOS&lt;br /&gt;
!KDE/GNOME &lt;br /&gt;
|-&amp;lt;!--- ############ WARNING once an id=&amp;quot;x&amp;quot; number has been assigned do not change as referenced else where in UserManual --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;1&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Starting_a_new_Family_Tree|Manage family trees]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|O}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;2&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Importing_data|Import family tree]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|I}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|I}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|I}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;3&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Exporting_data|Export family tree]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|E}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;4&amp;quot; | Changes to the next [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]].&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|N}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|N}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|N}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;5&amp;quot; |Changes to the previous [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]].&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|P}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;45&amp;quot; |Change [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]]&amp;lt;br&amp;gt;to Category number 0/1/2/../9&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|3}} ...&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|1}}&amp;lt;br&amp;gt;{{Man key press|Cmd|2}}&amp;lt;br&amp;gt;{{Man key press|Cmd|3}}..&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|3}}..&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;6&amp;quot; |Within the Category changes the [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Views|view]]&amp;lt;br&amp;gt;to view mode number 0/1/2/../9&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Alt|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|3}} ...&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Opt|1}}&amp;lt;br&amp;gt;{{Man key press|Cmd|Opt|2}}&amp;lt;br&amp;gt;{{Man key press|Cmd|Opt|3}}..&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Alt|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|3}}..&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;8&amp;quot; |[[Gramps_5.1_Wiki_Manual_-_Navigation#Using_the_Clipboard|Open the Clipboard]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|B}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|B}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|B}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;9&amp;quot; |Add the selected item as a [[Gramps_5.1_Wiki_Manual_-_Navigation#Bookmarks|bookmark]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;10&amp;quot; |[[Gramps_5.1_Wiki_Manual_-_Navigation#Bookmarks|Organize the bookmarks]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|D}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;11&amp;quot; |Open the {{man label|[[Gramps_5.1_Wiki_Manual_-_Navigation#Edit|Undo History]]}} dialog&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|H}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|H}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|H}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;12&amp;quot; |Jump to a [[Gramps_5.1_Wiki_Manual_-_Settings#ID_Formats|Gramps ID]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|J}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|J}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|J}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;13&amp;quot; |Move to previous item in history&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Ctrl|Opt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;14&amp;quot; |Move to next item in history&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Ctrl|Opt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;15&amp;quot; |Go to the '''[[Gramps_5.1_Wiki_Manual_-_Settings#Setting_Home_person|Home Person]]'''&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Home}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Home}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;16&amp;quot; |Same action as the [[File:Gramps-config.png|20px]] Configure active view button&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|C}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|C}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|C}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;7&amp;quot; |Toggle the left gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Navigator|Navigator]] panel)&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|M}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;17&amp;quot; |Toggle the right gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Bottombar_and_Sidebar|Sidebar]])&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|R}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|R}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|R}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;18&amp;quot; |Toggle the bottom gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Bottombar_and_Sidebar|Bottombar]])&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|B}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|B}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|B}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;19&amp;quot; |Undo&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Z}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Z}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Z}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;20&amp;quot; |Do again&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|Z}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|Z}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|Z}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;21&amp;quot; |Quit Gramps&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Q}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Q}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Q}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;xx&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Navigation#Add|Add/Create]] a new object (Opens the related Editor)&amp;lt;br&amp;gt;Person&amp;lt;br&amp;gt;Family&amp;lt;br&amp;gt;Event&amp;lt;br&amp;gt;Place&amp;lt;br&amp;gt;Source&amp;lt;br&amp;gt;Citation&amp;lt;br&amp;gt;Repository&amp;lt;br&amp;gt;Media&amp;lt;br&amp;gt;Note&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|N}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|N}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|N}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== All List Views bindings ===&lt;br /&gt;
&lt;br /&gt;
The following bindings are available in all list views: People, Families, Events, Places, Sources, Citations, Repositories, Media and Notes View.&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;22&amp;quot; |Edits the selected list item &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Enter}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Enter}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;23&amp;quot; |Adds a new item to the database &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Insert}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Insert}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;24&amp;quot; |Deletes the selected list item &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Delete}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Delete}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;46&amp;quot; |Activate the {{man button|Find}} field&lt;br /&gt;
|!--  Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|!--  Mac OS --&amp;gt; |{{Man key press|Cmd|F}}&lt;br /&gt;
|!--  KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; | List view interactive search ahead / Quick search&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== People View bindings ===&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;25&amp;quot; |Expands and collapses entries of the selected surname in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Enter}} or&amp;lt;br&amp;gt;{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Enter}} or&amp;lt;br&amp;gt;{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;251&amp;quot; |Expands and contracts person selection in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Place View bindings ===&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;25&amp;quot; |Expands and collapses entries of places in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;251&amp;quot; |Expands and contracts place selection in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Editors==&lt;br /&gt;
&lt;br /&gt;
=== Editor Tab bindings ===&lt;br /&gt;
These bindings work on the tab pages of the editors (so not on the labels of the tabs!, press tab on label to move to tabpage content).&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;26&amp;quot; |Same action as the {{icon|Stock_edit}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Return}} or {{Man key press|Enter}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;27&amp;quot; |Same action as the {{icon|Stock_add}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Insert}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Insert}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;28&amp;quot; |Same action as the {{icon|Stock_remove}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Delete}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Delete}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;29&amp;quot; |Same action as the {{man button|Share}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|O}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;30&amp;quot; |Change tabpage to the tabpage to the left&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctrl|Opt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;31&amp;quot; |Change tabpage to the tabpage to the right&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctlr|Opt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Mouse Key&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;32&amp;quot; |Call up [https://en.wikipedia.org/wiki/Context_menu context menu] popup&lt;br /&gt;
!Right-click&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;33&amp;quot; |Same action as the {{icon|Stock_edit}}  {{man button|Edit}} button when that button is present&lt;br /&gt;
!Double-click&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;34&amp;quot; |Common action that is not the same as {{icon|Stock_edit}}   {{man button|Edit}} button. Eg: on Family Editor Child tab, edit child&lt;br /&gt;
!Middle-click&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Editor bindings ===&lt;br /&gt;
These bindings work on Editors by activating focus or by changing state of toggle buttons ([[Accessibility]]).&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;35&amp;quot; |Change the privacy status.&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|P}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;36&amp;quot; |Call the Date editor (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;37&amp;quot; |Activate the {{icon|Stock_add}}   {{man button|Add}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|A}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|A}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|A}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;38&amp;quot; |Activate the {{icon|Stock_edit}}    {{man button|Edit}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|E}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;39&amp;quot; |Activate the {{man button|Select}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|S}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|S}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|S}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;40&amp;quot; |Activate the {{man button|Father}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|F}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;41&amp;quot; |Activate the {{man button|Mother}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|M}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Handy Shortcuts==&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME &lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;42&amp;quot; |Full screen&lt;br /&gt;
|{{man key press|F11}}&lt;br /&gt;
|&lt;br /&gt;
|{{man key press|F11}}&lt;br /&gt;
|Maximizes Gramps to use the Full screen&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;43&amp;quot; |Show this user manual&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;44&amp;quot; |Select the {{man button|OK}} button&lt;br /&gt;
|{{man key press|Alt}}+{{man key press|O}}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Handy for use with low resolution screens&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;45&amp;quot; |Dismiss  (Select the {{man button|Cancel}} button)&lt;br /&gt;
|{{man key press|Esc}}&lt;br /&gt;
|{{Man key press|&amp;amp;#x238B; Esc}}&lt;br /&gt;
|{{man key press|Esc}}&lt;br /&gt;
|Handy for use with low resolution screens&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;46&amp;quot; |Toggle Open/Save dialog&amp;lt;br /&amp;gt;between breadcrumbs and filepaths&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|L}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctrl|L}}&amp;lt;br /&amp;gt;{{Man key press|Esc}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|L}}&lt;br /&gt;
|Handy for pasting filepaths&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Context menu==&lt;br /&gt;
A [https://wikipedia.org/wiki/Context_menu context pop-up menu] shows  limited number of choice related to the currently selected item in a Graphical User Interface. The menu appears with right-click on an item in operating systems with a 2 or 3 button mouse.  In the one button mouse macOS, a {{man button|Ctrl}}-click will bring up the [https://developer.apple.com/design/human-interface-guidelines/macos/menus/contextual-menus/ Contextual Menus]. &lt;br /&gt;
&lt;br /&gt;
Keybindings:&lt;br /&gt;
* In Windows, the '''[https://wikipedia.org/w/index.php?title=Menu_key Menu Key]''' (aka '''application key''') will show the context menu for the active field. Alternately, the {{man button|⇧ Shift}}+{{man button|F10}} [https://wikipedia.org/wiki/Keyboard_shortcut keyboard shortcut], or sometimes {{man button|Ctrl}}+{{man button|⇧ Shift}}+{{man button|F10}}&lt;br /&gt;
* In macOS, users will need to enable the Universal Access settings in the System Preferences. &lt;br /&gt;
&lt;br /&gt;
{{man tip|Quick navigation to an object|The clipboard has a navigation shortcut. Copy any object to the Clipboard (by drag'n'drop or by selecting and pressing the {{man key press|Ctrl|C}} [[Gramps_5.1_Wiki_Manual_-_Keybindings|keybinding]]), then select the object on the Clipboard and right-click to reveal the [[Gramps_5.1_Wiki_Manual_-_Navigation#Clipboard_context_menu|Clipboard's contextual pop-up menu]]. The bottom menu item will offer to make the selected object active.  The View will '''''not''''' navigate to the object's category.}}&lt;br /&gt;
&lt;br /&gt;
See [[Gramps_{{man version}}_Wiki_Manual_-_Settings#Context_menu|Context Menu]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts Table of keyboard shortcuts] - for major operating systems.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - FAQ|Gramps 5.1 Wiki Manual - Command Line|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Keybindings}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89047</id>
		<title>Gramps 5.1 Wiki Manual - Keybindings</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Keybindings&amp;diff=89047"/>
		<updated>2022-01-02T12:23:07Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add selection expansion key bindings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - FAQ|Gramps 5.1 Wiki Manual - Command Line|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Keybindings}}&lt;br /&gt;
{{#vardefine:chapter|B}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
This appendix lists keybindings (also known as ''Keyboard shortcuts'' or ''hotkeys'') that can be used in the Gramps dialogs as an alternative to using the mouse.&lt;br /&gt;
&lt;br /&gt;
Some keybindings require the user to press a single key or a sequence of keys one after the other. Other keybindings require pressing and holding several keys simultaneously. &lt;br /&gt;
== List Views ==&lt;br /&gt;
=== Common keybindings ===&lt;br /&gt;
&lt;br /&gt;
{{man tip|Keyboards are not all the same!|&lt;br /&gt;
Keybindings may depend on the keyboard layout (localization) and on your computer&amp;amp;rsquo;s Operating System.{{-}}&lt;br /&gt;
[[File:windows_180x160.png|128px]] [[File:macos_200x200.png|128px]]  [[File:Linux_220x261.png|128px]]  [[File:Bsd daemon.png|128px]]}}&lt;br /&gt;
The following keybindings are available in all category [[Gramps_Glossary#view|views]].&lt;br /&gt;
{|{{prettytable}}&lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!macOS&lt;br /&gt;
!KDE/GNOME &lt;br /&gt;
|-&amp;lt;!--- ############ WARNING once an id=&amp;quot;x&amp;quot; number has been assigned do not change as referenced else where in UserManual --&amp;gt;&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;1&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Starting_a_new_Family_Tree|Manage family trees]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|O}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;2&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Importing_data|Import family tree]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|I}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|I}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|I}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;3&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Manage_Family_Trees#Exporting_data|Export family tree]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|E}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;4&amp;quot; | Changes to the next [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]].&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|N}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|N}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|N}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;5&amp;quot; |Changes to the previous [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]].&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|P}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;45&amp;quot; |Change [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Categories|Category]]&amp;lt;br&amp;gt;to Category number 0/1/2/../9&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|3}} ...&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|1}}&amp;lt;br&amp;gt;{{Man key press|Cmd|2}}&amp;lt;br&amp;gt;{{Man key press|Cmd|3}}..&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|3}}..&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;6&amp;quot; |Within the Category changes the [[Gramps_5.1_Wiki_Manual_-_Main_Window#Switching_Views|view]]&amp;lt;br&amp;gt;to view mode number 0/1/2/../9&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Alt|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|3}} ...&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Opt|1}}&amp;lt;br&amp;gt;{{Man key press|Cmd|Opt|2}}&amp;lt;br&amp;gt;{{Man key press|Cmd|Opt|3}}..&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Alt|1}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|2}}&amp;lt;br&amp;gt;{{Man key press|Ctrl|Alt|3}}..&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;8&amp;quot; |[[Gramps_5.1_Wiki_Manual_-_Navigation#Using_the_Clipboard|Open the Clipboard]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|B}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|B}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|B}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;9&amp;quot; |Add the selected item as a [[Gramps_5.1_Wiki_Manual_-_Navigation#Bookmarks|bookmark]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;10&amp;quot; |[[Gramps_5.1_Wiki_Manual_-_Navigation#Bookmarks|Organize the bookmarks]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|D}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;11&amp;quot; |Open the {{man label|[[Gramps_5.1_Wiki_Manual_-_Navigation#Edit|Undo History]]}} dialog&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|H}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|H}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|H}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;12&amp;quot; |Jump to a [[Gramps_5.1_Wiki_Manual_-_Settings#ID_Formats|Gramps ID]]&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|J}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|J}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|J}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;13&amp;quot; |Move to previous item in history&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Ctrl|Opt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;14&amp;quot; |Move to next item in history&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Ctrl|Opt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;15&amp;quot; |Go to the '''[[Gramps_5.1_Wiki_Manual_-_Settings#Setting_Home_person|Home Person]]'''&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Home}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Home}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;16&amp;quot; |Same action as the [[File:Gramps-config.png|20px]] Configure active view button&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|C}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|C}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|C}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;7&amp;quot; |Toggle the left gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Navigator|Navigator]] panel)&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|M}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;17&amp;quot; |Toggle the right gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Bottombar_and_Sidebar|Sidebar]])&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|R}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|R}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|R}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;18&amp;quot; |Toggle the bottom gramplet sidebar ([[Gramps_5.1_Wiki_Manual_-_Main_Window#Bottombar_and_Sidebar|Bottombar]])&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|B}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|B}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|B}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;19&amp;quot; |Undo&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Z}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Z}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Z}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;20&amp;quot; |Do again&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Ctrl|Z}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Shift|Cmd|Z}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Shift|Ctrl|Z}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;21&amp;quot; |Quit Gramps&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Q}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |{{Man key press|Cmd|Q}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Q}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;xx&amp;quot; | [[Gramps_5.1_Wiki_Manual_-_Navigation#Add|Add/Create]] a new object (Opens the related Editor)&amp;lt;br&amp;gt;Person&amp;lt;br&amp;gt;Family&amp;lt;br&amp;gt;Event&amp;lt;br&amp;gt;Place&amp;lt;br&amp;gt;Source&amp;lt;br&amp;gt;Citation&amp;lt;br&amp;gt;Repository&amp;lt;br&amp;gt;Media&amp;lt;br&amp;gt;Note&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|N}}&lt;br /&gt;
|&amp;lt;!-- macOS --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Ctrl|Opt|N}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|P}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|F}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|E}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|L}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|S}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|C}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|R}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|M}}&amp;lt;br&amp;gt;{{Man key press|Shift|Alt|N}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== All List Views bindings ===&lt;br /&gt;
&lt;br /&gt;
The following bindings are available in all list views: People, Families, Events, Places, Sources, Citations, Repositories, Media and Notes View.&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;22&amp;quot; |Edits the selected list item &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Enter}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Enter}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;23&amp;quot; |Adds a new item to the database &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Insert}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Insert}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;24&amp;quot; |Deletes the selected list item &lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|Delete}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|Delete}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; |&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;46&amp;quot; |Activate the {{man button|Find}} field&lt;br /&gt;
|!--  Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|!--  Mac OS --&amp;gt; |{{Man key press|Cmd|F}}&lt;br /&gt;
|!--  KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|&amp;lt;!-- Note --&amp;gt; | List view interactive search ahead / Quick search&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== People View bindings ===&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;25&amp;quot; |Expands and collapses entries of the selected surname in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Enter}} or&amp;lt;br&amp;gt;{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Enter}} or&amp;lt;br&amp;gt;{{Man key press|Shift|Right}} (expand)&amp;lt;br&amp;gt;{{Man key press|Shift|Left}} (collapse)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;251&amp;quot; |Expands and contracts person selection in Group mode&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Shift|Up}} (Up arrow)&amp;lt;br&amp;gt;{{Man key press|Shift|Down}} (Down arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Editors==&lt;br /&gt;
&lt;br /&gt;
=== Editor Tab bindings ===&lt;br /&gt;
These bindings work on the tab pages of the editors (so not on the labels of the tabs!, press tab on label to move to tabpage content).&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;26&amp;quot; |Same action as the {{icon|Stock_edit}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Return}} or {{Man key press|Enter}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Enter}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;27&amp;quot; |Same action as the {{icon|Stock_add}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Insert}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Insert}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;28&amp;quot; |Same action as the {{icon|Stock_remove}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Delete}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Delete}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;29&amp;quot; |Same action as the {{man button|Share}} button when that button is present&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|O}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|O}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;30&amp;quot; |Change tabpage to the tabpage to the left&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctrl|Opt|Left}} (Left arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Left}} (Left arrow)&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;31&amp;quot; |Change tabpage to the tabpage to the right&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctlr|Opt|Right}} (Right arrow)&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Alt|Right}} (Right arrow)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Mouse Key&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;32&amp;quot; |Call up [https://en.wikipedia.org/wiki/Context_menu context menu] popup&lt;br /&gt;
!Right-click&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;33&amp;quot; |Same action as the {{icon|Stock_edit}}  {{man button|Edit}} button when that button is present&lt;br /&gt;
!Double-click&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;34&amp;quot; |Common action that is not the same as {{icon|Stock_edit}}   {{man button|Edit}} button. Eg: on Family Editor Child tab, edit child&lt;br /&gt;
!Middle-click&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Editor bindings ===&lt;br /&gt;
These bindings work on Editors by activating focus or by changing state of toggle buttons ([[Accessibility]]).&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;35&amp;quot; |Change the privacy status.&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|P}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|P}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;36&amp;quot; |Call the Date editor (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|D}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|D}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;37&amp;quot; |Activate the {{icon|Stock_add}}   {{man button|Add}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|A}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|A}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|A}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;38&amp;quot; |Activate the {{icon|Stock_edit}}    {{man button|Edit}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|E}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|E}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;39&amp;quot; |Activate the {{man button|Select}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|S}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|S}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|S}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;40&amp;quot; |Activate the {{man button|Father}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|F}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|F}}&lt;br /&gt;
|- &lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;41&amp;quot; |Activate the {{man button|Mother}} button (if present).&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Cmd|M}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|M}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Handy Shortcuts==&lt;br /&gt;
&lt;br /&gt;
{|{{prettytable}}  &lt;br /&gt;
!Action/Function&lt;br /&gt;
!Microsoft Windows&lt;br /&gt;
!Mac OS&lt;br /&gt;
!KDE/GNOME &lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;42&amp;quot; |Full screen&lt;br /&gt;
|{{man key press|F11}}&lt;br /&gt;
|&lt;br /&gt;
|{{man key press|F11}}&lt;br /&gt;
|Maximizes Gramps to use the Full screen&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;43&amp;quot; |Show this user manual&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|{{man key press|F1}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;44&amp;quot; |Select the {{man button|OK}} button&lt;br /&gt;
|{{man key press|Alt}}+{{man key press|O}}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Handy for use with low resolution screens&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;45&amp;quot; |Dismiss  (Select the {{man button|Cancel}} button)&lt;br /&gt;
|{{man key press|Esc}}&lt;br /&gt;
|{{Man key press|&amp;amp;#x238B; Esc}}&lt;br /&gt;
|{{man key press|Esc}}&lt;br /&gt;
|Handy for use with low resolution screens&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;!-- Action/Function --&amp;gt; id=&amp;quot;46&amp;quot; |Toggle Open/Save dialog&amp;lt;br /&amp;gt;between breadcrumbs and filepaths&lt;br /&gt;
|&amp;lt;!-- Microsoft Windows --&amp;gt; |{{Man key press|Ctrl|L}}&lt;br /&gt;
|&amp;lt;!-- Mac OS --&amp;gt; |{{Man key press|Ctrl|L}}&amp;lt;br /&amp;gt;{{Man key press|Esc}}&lt;br /&gt;
|&amp;lt;!-- KDE/GNOME --&amp;gt; |{{Man key press|Ctrl|L}}&lt;br /&gt;
|Handy for pasting filepaths&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Context menu==&lt;br /&gt;
A [https://wikipedia.org/wiki/Context_menu context pop-up menu] shows  limited number of choice related to the currently selected item in a Graphical User Interface. The menu appears with right-click on an item in operating systems with a 2 or 3 button mouse.  In the one button mouse macOS, a {{man button|Ctrl}}-click will bring up the [https://developer.apple.com/design/human-interface-guidelines/macos/menus/contextual-menus/ Contextual Menus]. &lt;br /&gt;
&lt;br /&gt;
Keybindings:&lt;br /&gt;
* In Windows, the '''[https://wikipedia.org/w/index.php?title=Menu_key Menu Key]''' (aka '''application key''') will show the context menu for the active field. Alternately, the {{man button|⇧ Shift}}+{{man button|F10}} [https://wikipedia.org/wiki/Keyboard_shortcut keyboard shortcut], or sometimes {{man button|Ctrl}}+{{man button|⇧ Shift}}+{{man button|F10}}&lt;br /&gt;
* In macOS, users will need to enable the Universal Access settings in the System Preferences. &lt;br /&gt;
&lt;br /&gt;
{{man tip|Quick navigation to an object|The clipboard has a navigation shortcut. Copy any object to the Clipboard (by drag'n'drop or by selecting and pressing the {{man key press|Ctrl|C}} [[Gramps_5.1_Wiki_Manual_-_Keybindings|keybinding]]), then select the object on the Clipboard and right-click to reveal the [[Gramps_5.1_Wiki_Manual_-_Navigation#Clipboard_context_menu|Clipboard's contextual pop-up menu]]. The bottom menu item will offer to make the selected object active.  The View will '''''not''''' navigate to the object's category.}}&lt;br /&gt;
&lt;br /&gt;
See [[Gramps_{{man version}}_Wiki_Manual_-_Settings#Context_menu|Context Menu]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts Table of keyboard shortcuts] - for major operating systems.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - FAQ|Gramps 5.1 Wiki Manual - Command Line|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Keybindings}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
	<entry>
		<id>https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_4&amp;diff=81688</id>
		<title>Gramps 5.1 Wiki Manual - Reports - part 4</title>
		<link rel="alternate" type="text/html" href="https://www.gramps-project.org/wiki/index.php?title=Gramps_5.1_Wiki_Manual_-_Reports_-_part_4&amp;diff=81688"/>
		<updated>2020-11-08T16:50:48Z</updated>

		<summary type="html">&lt;p&gt;Codefarmer: Add description of the family descendant tree.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{man index|Gramps 5.1 Wiki Manual - Reports - part 3|Gramps_5.1_Wiki_Manual_-_Reports_-_part_5|5.1}}&lt;br /&gt;
{{languages|Gramps_5.1_Wiki_Manual_-_Reports - part 4}}&lt;br /&gt;
{{#vardefine:chapter|11.4}}&lt;br /&gt;
{{#vardefine:figure|0}}&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
[[File:MenuOverview-Reports-GraphicalReports-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} {{man menu|Reports &amp;gt;Graphical Reports&amp;gt;...}} Menu overview]]&lt;br /&gt;
This section describes the different {{man label|Graphical Reports}} available in Gramps.&lt;br /&gt;
==Graphical Reports==&lt;br /&gt;
&lt;br /&gt;
Graphical reports represent information in forms of charts and graphs. Most of the options are common among graphical reports, therefore they will be described only once, at the end of this section. The few options which are specific to a given report will be described directly in that report's entry. See also [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2#Substitution_Values|substitution values]].&lt;br /&gt;
&lt;br /&gt;
The following graphical reports are available in Gramps:&lt;br /&gt;
&lt;br /&gt;
===Common options===&lt;br /&gt;
&lt;br /&gt;
Common options for text reports are the filename of the output, the format of the output, selected style, page size and orientation. For HTML reports, there is no page information. Instead, HTML options include the choice of the HTML template, either available in Gramps or a custom template defined by you. Optionally, the reports can be immediately opened with the default application.&lt;br /&gt;
&lt;br /&gt;
{{man tip|Tip|The options used in reports are persistent. Each report remembers the options previously used.}}&lt;br /&gt;
&lt;br /&gt;
The options which are specific to a given report will be described directly in that report's entry and on [[Gramps_5.1_Wiki_Manual_-_Command_Line#Action_options|Command line references]].&lt;br /&gt;
&lt;br /&gt;
For each report there is a screen with on the top part tabs (like Paper Options...) and on the bottom part the '''Document Options'''. The number of tabs varies with the report.&lt;br /&gt;
&lt;br /&gt;
====Paper Options====&lt;br /&gt;
&lt;br /&gt;
[[File:TextReports-PaperOptions-tab-defaults-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Paper Options - tab for Graphical Reports]]&lt;br /&gt;
&lt;br /&gt;
With the {{man label|Paper Options}} tab you can change:&lt;br /&gt;
* {{man label|Paper format}} &lt;br /&gt;
** {{man label|Size}} '''Letter'''(default)&lt;br /&gt;
** {{man label|Width}} (&amp;lt;code&amp;gt;8.50&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
** {{man label|Height}} (&amp;lt;code&amp;gt;11.00&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
** {{man label|Orientation}} '''Portrait'''(default)&lt;br /&gt;
* {{man label|Margins}}&lt;br /&gt;
** {{man label|Left}}(&amp;lt;code&amp;gt;1.00&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
** {{man label|Right}}(&amp;lt;code&amp;gt;1.00&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
** {{man label|Top}}(&amp;lt;code&amp;gt;1.00&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
** {{man label|Bottom}}(&amp;lt;code&amp;gt;1.00&amp;lt;/code&amp;gt; in. default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Metric}} : whether to use metric values or not (in. or cm.). (checkbox unchecked by default)&lt;br /&gt;
&lt;br /&gt;
See also {{man label|[[Gramps_5.1_Wiki_Manual_-_Error_and_Warning_Reference#Report_could_not_be_created|Report could not be created]]}} dialog which may occur if your custom page size is too large.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Document Options====&lt;br /&gt;
Options below will change slightly depending on the output format selected.&lt;br /&gt;
[[File:GraphicalReports-DocumentOptions-SVG-document-output-settings-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Document Options - SVG document - output selected - example]]&lt;br /&gt;
&lt;br /&gt;
*{{man label|Output Format}} choose the output format: &lt;br /&gt;
** ''SVG document'' : (Scalable Vector Graphics) for display with a web browser or editing with a suitable graphics editor. &lt;br /&gt;
** ''PostScript''&lt;br /&gt;
** ''OpenDocument Text'' (if you want to edit the report with Libreoffice/Openoffice)&lt;br /&gt;
** ''PDF document''&lt;br /&gt;
** ''Print...''&lt;br /&gt;
* {{checkbox|0}} {{man label|Open with default viewer}}: you can indicate to open the made document your default viewer. will open the created report using whatever program is defined on your system for handling the format selected.(checkbox unchecked by default)&lt;br /&gt;
* {{man label|Filename:}} default value is ''&amp;lt;code&amp;gt;/home/&amp;lt;username&amp;gt;/&amp;lt;Family Tree Name&amp;gt;&amp;lt;Report Name&amp;gt;.&amp;lt;output format extension&amp;gt;&amp;lt;/code&amp;gt;''. by default the filename is the same as the report type, and it will be placed in your home directory. (In Windows it defaults to one level up from &amp;quot;My documents&amp;quot;.)&lt;br /&gt;
* {{man label|Style:}} (default is ''default''). With the {{man button|[[Gramps_5.1_Wiki_Manual_-_Settings#Style_editor_dialog|Style Editor...]]}} button you can add Document Styles.&lt;br /&gt;
* {{man label|SVG Background color:}} ('''transparent background''' default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Select a person for the report selector====&lt;br /&gt;
The {{man label|Select a person for the report}} selector allows you to select an already existing person for the report and once selected they will be placed in {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Tree Options|Tree Options]]}} as the Centre Person. &lt;br /&gt;
[[File:SelectAPersonForTheReport-SelectorDialog-example-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} &amp;quot;Select a person for the report&amp;quot; - selector dialog - example]] &lt;br /&gt;
&lt;br /&gt;
It defaults to the current active person.&lt;br /&gt;
&lt;br /&gt;
You may check the {{checkbox|0}}{{man label|Show all}} box to show the entire list of persons in the tree (checkbox unchecked by default).  &lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Scale and Resize options====&lt;br /&gt;
The tree is first made on a canvas that can fit a tree of any size. From that canvas the following options can change how it is finally displayed on a page.  &lt;br /&gt;
{{-}}&lt;br /&gt;
====={{man label|Scale tree to fit}}:=====&lt;br /&gt;
This option will scale up/down the size of the report on the canvas to fit the size of the page (set in Paper Options) that you wish to print on. Currently you can:&lt;br /&gt;
&lt;br /&gt;
* '''Do not scale tree''' (Default)&lt;br /&gt;
* ''Scale tree to fit page width only''&lt;br /&gt;
* ''Scale tree to fit the size of the page'' (both width and height)&lt;br /&gt;
&lt;br /&gt;
{{man note|Note|For the last option, the report will scale to the lesser scale amount. If the report can be scaled up to fit the width, but needs to be scaled down further to fit the height, it will be scaled down leaving lots of room (empty white space) width-wise. Or if the report needs to be scaled down just a little for height and scaled down more for width, the report will be scaled down the most (width) leaving a gap (empty white space) at the bottom.}}&lt;br /&gt;
&lt;br /&gt;
Without the Check box:{{man label|Resize Page to Fit Tree size.}} option checked, the following occurs for the ''Scale tree to fit'' selections:&lt;br /&gt;
* ''Do not scale the tree'' may give you a report that spans multiple pages horizontally and/or vertically&lt;br /&gt;
* ''Scale tree to fit page width only'' may still give you a report that spans multiple pages vertically. No pages to the sides of others. Only one on top of another.&lt;br /&gt;
* ''Scale tree to fit the size of the page'' will give you a one page only report. The report will print on a page the size set in Paper Options.&lt;br /&gt;
&lt;br /&gt;
====={{man label|Resize Page to Fit Tree size}}=====&lt;br /&gt;
This option tells how big/small to resize the page we will print on. '''With this option unchecked''', the page size that is set in Paper Option. With this option checked the following happens based upon the three choices in {{man label|Scale tree to fit:}}.&lt;br /&gt;
&lt;br /&gt;
{{man warn|Overrides options in the 'Paper Option' tab|This option will create irregular page sizes.}}&lt;br /&gt;
&lt;br /&gt;
This overrides/ignores what is set on Paper Options and print on a page the same dimensions that the tree uses on the canvas. So taking the three options above, in scale tree to fit, this is what will happen if you select the 'Resize Page to Fit Tree size' option:&lt;br /&gt;
&lt;br /&gt;
* With ''Do not scale the tree'', this option will completely ignore what is set in Paper Options and print on a page that is large enough to display the entire tree&lt;br /&gt;
* With ''Scale tree to fit page width only'', this option will ignore Paper Height that is set in Paper Options only. The tree has already been scaled up/down to fit the page width, so it is set. Only the page Height is set upon the height of the tree we are printing.&lt;br /&gt;
* With ''Scale tree to fit the size of the page'', the tree has already been scaled to the size of the page. But as noted above, either the width or height will (more than likely) have a gap (empty white space) in it. The {{man label|Resize Page to Fit Tree size}} will narrow down this gap on the page to remove that gap.&lt;br /&gt;
&lt;br /&gt;
=====inter-box Y scale factor=====&lt;br /&gt;
&lt;br /&gt;
:Make the inter-box Y bigger or smaller&lt;br /&gt;
&lt;br /&gt;
=====box shadow scale factor=====&lt;br /&gt;
&lt;br /&gt;
:Make the box shadow bigger or smaller&lt;br /&gt;
&lt;br /&gt;
=====Know what you want to print on=====&lt;br /&gt;
Scaling a tree is an advanced function. The {{man label|Document Options}} → {{man label|Style}} sets the size of text that you can print. Scaling down is not very desirable as the text becomes more difficult to read. Scaling up is better but may have the some issues. So here are some pointers to make nice printed documents.&lt;br /&gt;
&lt;br /&gt;
First thing first. What paper sizes can you print on? Ask around and see what page sizes you can print on easily. Just knowing what paper sizes you can print on helps a lot. At Kinkos (in the U.S.A) there is a 3 foot wide printer with paper that is on a roll (any length). So we could use 'Scale report to fit page width only' and 'One page report' for this.&lt;br /&gt;
&lt;br /&gt;
It is also noteworthy to first make your report using {{man label|Scale tree to fit}}s ''Do not scale the report'' option and {{man label|Resize Page to Fit Tree size}} to know what the reports full dimensions (width and height) are. This will help you know how to better put this report on the pages you can print on. Here are some other quick things to take into account.&lt;br /&gt;
* A report that is very high and not too wide may print better with only the ''Scale report to fit page width only'' option.  &lt;br /&gt;
* With the reports normal width, which will print better? Landscape or Portrait?&lt;br /&gt;
* Since every boxes width is set by the widest box, can you use the Descendant reports → Replace option to abbreviate or remove very long parts that are not needed?&lt;br /&gt;
* The size of the title. If there is room, you may want to make the title larger. And if it is too large, it will set the width of the report.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Ancestor Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
[[File:GraphicalReports-AncestorTree-example-landscape-50.png|thumb|right|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report generates the chart of people who are ancestors of the Active Person.&lt;br /&gt;
&lt;br /&gt;
You can choose the Ancestor Tree report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Ancestor Tree...}}&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
==== Tree Options ====&lt;br /&gt;
&lt;br /&gt;
[[File:AncestorTree-GraphicalReports-TreeOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - Tree Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
The {{man button|Center Person}} is chosen here. The Active person will be the default.&lt;br /&gt;
&lt;br /&gt;
* {{man label|[ ] Include siblings of the center person}}&lt;br /&gt;
&lt;br /&gt;
With the input field {{man label|Generations}} you can change the number of generations considered.&lt;br /&gt;
&lt;br /&gt;
{{man label|Display unknown generations}} will allow you to select how many generations of empty boxes to display when the tree is not completely full.&lt;br /&gt;
&lt;br /&gt;
Here is also the check box {{man label|Compress tree}}.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Report Options ====&lt;br /&gt;
&lt;br /&gt;
[[File:AncestorTree-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - Report Options - tab default options (Gramps 5.1.0; Microsoft Windows 10) ]]&lt;br /&gt;
&lt;br /&gt;
This tab gives you the option to include other items on the report.&lt;br /&gt;
&lt;br /&gt;
{{man label|Report title}} allows you to choose a title for the report.  &lt;br /&gt;
* ''Do not print a title''&lt;br /&gt;
* ''Include Report Title''&lt;br /&gt;
&lt;br /&gt;
And this tab also includes check boxes for {{man label|Include a border}}, {{man label|Include page numbers}}, and {{man label|Include blank pages}}.&lt;br /&gt;
&lt;br /&gt;
This tab also allows you to {{man label|Include a note}} to one of the corners of the report.&lt;br /&gt;
&lt;br /&gt;
“$T” within the note will display the day that the report was made. Regular date formatting (see [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2|Substitution Values]]) applies.&lt;br /&gt;
&lt;br /&gt;
Currently a note will be attached to a corner.  If a person box writes over it, the note box will not move.  Select another corner to see the note tab if this happens.&lt;br /&gt;
&lt;br /&gt;
{{man label|Scale tree to fit}} will make the tree larger or smaller to fit the page as desired.  The options are:&lt;br /&gt;
* Do not Scale the tree&lt;br /&gt;
* Scale tree to fit page width only&lt;br /&gt;
* Scale tree to fit the size of the page&lt;br /&gt;
&lt;br /&gt;
where {{man label|Resize page to fit tree}} will make the page larger or smaller to fit the tree &lt;br /&gt;
&lt;br /&gt;
If both are selected, the options happen in that order; scale the tree first, then the page.&lt;br /&gt;
&lt;br /&gt;
These two options are better described in [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]  with tips for making nicer reports.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:AncestorTree-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format}}: Select the format to display names. Choose from '''Surname, Given Suffix''' (default) / Given Surname Suffix/ Given/ Main Surnames, Given Patronymic Suffix Prefix&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Translation}}: The translation to be used for the report. Language selector&lt;br /&gt;
* {{man label|Date Format}}: Select the format to display dates. Choose from '''YYYY-MM-DD (ISO)(2018-04-08)'''(default) / Numerical (8/4/2018) / Month Day, Year (April 8, 2018) / Mon Day, Year (Apr 8, 2018)/ Day Month Year (8 April 2018)/ Day Mon Year (8 Apr 2018)&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Display ====&lt;br /&gt;
&lt;br /&gt;
[[File:AncestorTree-GraphicalReports-Display-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - Display - tab default options]]&lt;br /&gt;
&lt;br /&gt;
This tab allows you to determine the {{man label|Father Display Format}} to be used for the report. All fathers, grandfathers, etc. will use this format.&lt;br /&gt;
&lt;br /&gt;
The {{man label|Mother Display Format}} to be used for all mothers, grandmothers, etc. will use this format.&lt;br /&gt;
&lt;br /&gt;
The {} around the death information line states that the text 'd. ' will display ONLY when there is death information.  See [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2|Substitution Values]] for more information, including how to include places and attributes, and format names and dates and places.&lt;br /&gt;
&lt;br /&gt;
{{man label|Center person uses which format:}} allows you to specify if the center person uses the father display format or the mother display format found on the Display tab.&lt;br /&gt;
&lt;br /&gt;
{{man label|Include Marriage box}} specifies to display an extra box between a father and mother that contains marriage information. {{man label|The Marriage Display Format}} (see [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2|Substitution Values]]) specifies what will print in this box.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Advanced ====&lt;br /&gt;
&lt;br /&gt;
[[File:AncestorTree-GraphicalReports-Advanced-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Ancestor Tree - Graphical Reports - Advanced - tab default options]]&lt;br /&gt;
* {{man label|Replace Display Format: 'Replace this'/'With this'}}: This allows you to put in pairs of strings separated by '/' that specify text you want to replace with other text. For example, &amp;lt;pre&amp;gt;United States of America/USA&amp;lt;/pre&amp;gt; replaces the United States of America with USA.&lt;br /&gt;
** {{checkbox|0}} {{man label|Include a note}} You may check the Include a note box to add a note (checkbox unchecked by default). The {{man label|Note}} specifies text the note will contain.&lt;br /&gt;
* {{man label|Note location}}: Specify where on the page to place the note (default is bottom left).&lt;br /&gt;
* {{man label|inter-box scale factor}}: Make the inter-box bigger or smaller (default is 1.00 in.).&lt;br /&gt;
* {{man label|box shadow scale factor}}: Make the box shadow bigger or smaller (default is 1.00 in.).&lt;br /&gt;
&lt;br /&gt;
These two options are better described in [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_5.1|Size options]] with tips for making nicer reports.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Calendar&amp;lt;/u&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[File:GraphicalReports-Calendar-example-landscape-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Calendar - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report produces a calendar with birthdays and anniversaries on a page by month.&lt;br /&gt;
&lt;br /&gt;
You can choose the Calendar report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Calendar...}}&lt;br /&gt;
&lt;br /&gt;
You can print the same information but in text format by using the  [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_6#Birthday_and_Anniversary_Report|Birthday and Anniversary Report]].&lt;br /&gt;
&lt;br /&gt;
See [[Calendar_tools_holidays|Calendar tools holidays]] for an explanation of how to add or change the holidays appearing on the output of this calendar.&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
====Report Options====&lt;br /&gt;
&lt;br /&gt;
[[File:Calendar-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Calendar - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Filter:}} choose between&lt;br /&gt;
** '''Entire Database''' (Default)&lt;br /&gt;
** Descendants of active person&lt;br /&gt;
** Descendant families of active person&lt;br /&gt;
** Ancestors of active person&lt;br /&gt;
** People with common ancestor with active person&lt;br /&gt;
* {{man label|Center Person:}} The center person for the report usually the active person unless you use the :&lt;br /&gt;
** {{man button:Select a different person}} button to use {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Select_a_person_for_the_report_selector|Select a person for the report]]}} selector dialog.&lt;br /&gt;
* {{man label|Text Area 1:}} (&amp;lt;code&amp;gt;My Calendar&amp;lt;/code&amp;gt; default) First line of text at bottom of calendar.&lt;br /&gt;
* {{man label|Text Area 2:}} (&amp;lt;code&amp;gt;Produced by Gramps&amp;lt;/code&amp;gt; default) Second line of text at bottom of calendar.&lt;br /&gt;
* {{man label|Text Area 3:}} (&amp;lt;code&amp;gt;http://gramps-project.org/&amp;lt;/code&amp;gt; default) Third line of text at bottom of calendar.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:Calendar-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Calendar - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format:}} Select the format to display the names. Choose from '''Surname, Given Suffix'''(default) / Given Surname Suffix / Given / Main Surnames, Given Patronymic Suffix / SURNAME, Given (Common)&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
** {{checkbox|1}} {{man label|Include only living people}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Translation:}} The translation to be used for the report. Language selector&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Content====&lt;br /&gt;
&lt;br /&gt;
[[File:Calendar-GraphicalReports-Content-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Calendar - Graphical Reports - Content - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Year of report:}} fill in the year. Defaults to current Year.&lt;br /&gt;
* {{man label|Country for holidays:}} Select the country to see associated holidays.&lt;br /&gt;
* {{man label|First day of week:}} (Default: '''Monday''') Select the first day of the week for the report. &lt;br /&gt;
* {{man label|Birthday surname:}} Select married women's displayed surname.&lt;br /&gt;
** '''Wives use their own surname''' (Default)&lt;br /&gt;
** Wives use husband's surname (from first family listed)&lt;br /&gt;
** Wives use husband's surname (from last family listed)&lt;br /&gt;
* {{checkbox|1}} {{man label|Include birthdays}} : include or not birthdays in the calendar (checkbox checked by default)&lt;br /&gt;
* {{checkbox|1}} {{man label|Include anniversaries}} : include or not anniversaries in the calendar (checkbox checked by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Descendant Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[File:GraphicalReports-DescendantTree-example-portrait-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report generates a chart of people who are descendants of the starting person. Alternatively it may generate a chart of descendants of the parents of the starting person.&lt;br /&gt;
&lt;br /&gt;
You can choose the Descendant Tree report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Descendant Tree...}}&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
==== Tree Options ====&lt;br /&gt;
&lt;br /&gt;
[[File:DescendantTree-GraphicalReports-TreeOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - Tree Options - tab default options]]&lt;br /&gt;
{{man label|Report for:}} selects the starting person for the report. It defaults to the current active person. &lt;br /&gt;
&lt;br /&gt;
{{man label|Generations}} (&amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; default ). The number of generations to show on the chart (including the starting person). If {{man label|Start with the parent(s) of the selected first}} is selected, the chart will include one more generation. (Example 1 was run with {{man label|Generations}}=3, Example 2 with {{man label|Generations}}=2.)&lt;br /&gt;
&lt;br /&gt;
{{man label|Level of spouses}} specifies how deep to display spouses.  &lt;br /&gt;
&lt;br /&gt;
{{man label|Start with the parent(s) of the selected first}} will draw a descendancy chart from the parents of the starting person,&lt;br /&gt;
if they are in the database. The [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Examples|Example]] is based on the same family as the first example and shows the result of starting with &amp;quot;Child 2 Davies&amp;quot; and ticking this box.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
Example 1 was obtained by selecting Allan Davies as the starting person and then running the report without this box ticked, with all other options the same except {{man label|Generations}}. The differences between the two examples are:&lt;br /&gt;
* The format of the first generation is changed. Because the parents of the starting person must be adjacent, spouses in the first generation may be shown out of order.&lt;br /&gt;
* For the purpose of the {{man label|Level of spouses}} setting, both parents are considered direct descendants, rather than spouses. (Although the mother uses the {{man label|Spousal display format }}on the Display tab.)&lt;br /&gt;
This means that other spouses (if any) of both of them will be shown to the number of &lt;br /&gt;
levels specified by {{man label|Level of spouses}}. In example 2, Mike Morris is shown even though {{man label|Level of spouses}} is set to 1.&lt;br /&gt;
* The title of the report (if selected on the Include tab) is changed to include both parents of the starting person. Only two people are shown in the title. In example 2, Mike Morris is not listed in the title even though his descendants are shown.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the example:  &lt;br /&gt;
&lt;br /&gt;
* Abe is a direct descendant&lt;br /&gt;
** Abe has/had married Barbra and had two children&lt;br /&gt;
** Abe also married Bridget and had one child&lt;br /&gt;
*** Bridget has/had married Carl.  &lt;br /&gt;
**** Carl and Denise had a child.&lt;br /&gt;
&lt;br /&gt;
Given the above example, this is what will be displayed for the first three {{man label|Level of spouses}} options.&lt;br /&gt;
* 0 means that only direct descendants will be shown. Nothing on the Secondary tab will be shown (Spousal information or Marriage information). For the example above, only Abe will be shown with three children directly under him&lt;br /&gt;
* 1 means that only spouses of the direct descendants will be shown. For the example above, Abe will be shown with two pieces of marriage information. Under the first will be two children and one child under the second.&lt;br /&gt;
* 2 means that spouses of spouses are shown. Same as 1 but Bridget will also show her other marriage. If they had any children, they would be shown too.&lt;br /&gt;
* 3 means that everyone in the example above will be displayed.&lt;br /&gt;
Any option above 1 is very hard to read on the report without the {{man label|Indent Spouses}} option on the Display tab.&lt;br /&gt;
&lt;br /&gt;
And last but not least is the {{man label|Compress Tree}} option which tries to move everyone up as far as they can go (compress) and still have a readable report. If {{man label|Start with the parent(s) of the selected first}} is ticked, {{man label|Compress Tree}} does not have any affect on the first generation.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options====&lt;br /&gt;
[[File:DescendantTree-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
{{man label|Report title}} allows you to choose a title for the report. Options are:&lt;br /&gt;
* ''Do not include a title''&lt;br /&gt;
* ''Descendant Chart for [selected person(s)]''&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;Start with Parents of Selected&amp;quot; is ticked on the &amp;quot;Tree Options&amp;quot; tab, both parents of the selected person are shown. Only two people will be listed in the title. If &amp;quot;level of spouses&amp;quot; is two or more, descendants of &amp;quot;spouses of spouses&amp;quot; are included on the chart, but are not listed in the title.&lt;br /&gt;
&lt;br /&gt;
{{man label|Scale tree to fit }} Scale tree to fit will make the tree larger or smaller to fit the page as desired. The options are:&lt;br /&gt;
* ''Do not scale the tree (Default)''&lt;br /&gt;
*'' Scale tree to fit page width only''&lt;br /&gt;
* ''Scale tree to fit the size of the page''&lt;br /&gt;
*{{checkbox|0}} {{man label|Resize page to fit tree}}: Resize page to fit tree (unchecked by default) will make the page larger or smaller to fit the tree. If selected with the &amp;quot;Scale tree to fit&amp;quot;, the options happen in that order; scale the tree first, then the page. There is a combined effect with each option:&lt;br /&gt;
** With &amp;quot;Do not scale the tree&amp;quot;, both the page width and height is resized to fit the tree. &lt;br /&gt;
** With &amp;quot;Scale tree to fit page width only&amp;quot;, the page height is resized to fit the tree height.&lt;br /&gt;
** With &amp;quot;Scale tree to fit the size of the page&amp;quot;, the page is resized to remove any gap in both height and width.&lt;br /&gt;
&lt;br /&gt;
{{man note|Overrides options in the Paper Option tab.| Resize page to fit tree overrides options in the Paper Option. }}&lt;br /&gt;
These two options are better described in [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]] with tips for making nicer reports.&lt;br /&gt;
This tab also includes check boxes to {{man label|Include a border}}, {{man label|Include page numbers}}, and {{man label|Include blank pages}}.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:DescendantTree-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format}}: Select the format to display names. Choose from '''Surname, Given Suffix''' (default) / Given Surname Suffix/ Given/ Main Surnames, Given Patronymic Suffix Prefix&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
* {{man label|Translation}}: The translation to be used for the report. Language selector&lt;br /&gt;
* {{man label|Date Format}}: Select the format to display dates. Choose from '''YYYY-MM-DD (ISO)(2018-04-08)'''(default) / Numerical (8/4/2018) / Month Day, Year (April 8, 2018) / Mon Day, Year (Apr 8, 2018)/ Day Month Year (8 April 2018)/ Day Mon Year (8 Apr 2018)&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Display ====&lt;br /&gt;
&lt;br /&gt;
[[File:DescendantTree-GraphicalReports-Display-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - Display - tab default options]]&lt;br /&gt;
&lt;br /&gt;
{{man label|Descendant Display Format}} sets the display for all descendants in the tree. The default is:&lt;br /&gt;
&amp;lt;pre&amp;gt;$n&lt;br /&gt;
b. $b&lt;br /&gt;
{d. $d}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which displays the name, birth date and death date on consecutive lines in the formats set on the Display tab in Gramps preferences. The {} on the third line states that the text 'd. ' will display ONLY when $d has a value, i.e. there is something in the death date field of the database for this person.  See [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2|Substitution Values]] for more information, including how to include places and attributes, and select different formats for names and dates and places.&lt;br /&gt;
&lt;br /&gt;
The check box {{man label|Bold direct descendants}} causes the names and other information about direct descendants to be in the bold font selected in the style editor.&lt;br /&gt;
&lt;br /&gt;
{{man label|Spousal Display format}} specifies what is displayed for each spouse.  The default is the same as for descendants. If you do not wish to have a separate box for marriage information, it can be displayed in the spouse box, for example by adding a line with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
m. $m &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which displays the date of the marriage.&lt;br /&gt;
&lt;br /&gt;
{{man label|Indent spouses}} will indent the spouse and marriage boxes from the descendant boxes. In the Family Descendant Chart, it does not affect the starting family or the parents of the starting family, but it does affect any other spouses of those three couples.&lt;br /&gt;
&lt;br /&gt;
{{man label|Include marriage box}} will display a separate box on the tree for each marriage. The display format is set in {{man label|Marriage Display format}}. The default is  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
m. $m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which displays the date of the marriage. If this box is not ticked, marriage information will not be displayed unless you specify it in the spousal display format as described above.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Advanced ====&lt;br /&gt;
[[File:DescendantTree-GraphicalReports-Advanced-tab-50.png|right|thumb|400px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Descendant Tree - Graphical Reports - Advanced - tab default options]]&lt;br /&gt;
&lt;br /&gt;
Pairs of strings separated by a slash '/' specify what you want to replace and what you want to replace it with.  &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;The United States of America/USA&lt;br /&gt;
United Kingdom of Great Britain and Northern Ireland/UK&lt;br /&gt;
Llanfair&amp;amp;shy;pwllgwyn&amp;amp;shy;gyllgo&amp;amp;shy;gerychwyrn&amp;amp;shy;drobwll&amp;amp;shy;llanty&amp;amp;shy;silio&amp;amp;shy;gogogoch/Llanfairpwll&amp;lt;/pre&amp;gt;&lt;br /&gt;
Each column width is defined by the widest box in the report. So if one box happens to be a lot wider than the rest, a lot of space will be wasted. The replace string option allows you to remove, or abbreviate, parts of the string that is not needed, or that can be cut down, so the amount of space wasted is minimal.&lt;br /&gt;
&lt;br /&gt;
In this tab you can also {{man label|Include a note}} in one of the corners of the report.  &lt;br /&gt;
&lt;br /&gt;
For example, adding the “$T” variable in the note box will display the day the report was created.&lt;br /&gt;
Regular date formatting (see [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2#Substitution_Values|Substitution Values]]) applies.&lt;br /&gt;
&lt;br /&gt;
{{man warn|Currently a note will be attached to a corner.|If a person box writes over it, the note box will not move.  Select another corner to see the note tab if this happens.}}&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
{{stub}}&lt;br /&gt;
[[Image:Descendant_tree_example1.png|left|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}}  Descendant Tree Report, Example 1. Allan Davies had three spouses.]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Descendant_tree_example2.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}}  Descendant Tree Report, Example 2.]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man label|Report for:}} selects the starting person for the report. It defaults to the current active person.  &lt;br /&gt;
&lt;br /&gt;
{{man label|Start with the parent(s) of the selected first}} will draw a descendancy chart from the parents of the starting person,&lt;br /&gt;
if they are in the database. The example below is based on the same family as the first example and shows the result of starting with &amp;quot;Child 2 Davies&amp;quot; and ticking this box.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
Example 1 was obtained by selecting Allan Davies as the starting person and then running the report without this box ticked, with all other options the same except {{man label|Generations}}. The differences between the two examples are:&lt;br /&gt;
* The format of the first generation is changed. Because the parents of the starting person must be adjacent, spouses in the first generation may be shown out of order.&lt;br /&gt;
* For the purpose of the {{man label|Level of spouses}} setting, both parents are considered direct descendants, rather than spouses. (Although the mother uses the {{man label|Spousal display format }}on the Display tab.)&lt;br /&gt;
This means that other spouses (if any) of both of them will be shown to the number of &lt;br /&gt;
levels specified by {{man label|Level of spouses}}. In example 2, Mike Morris is shown even though {{man label|Level of spouses}} is set to 1.&lt;br /&gt;
* The title of the report (if selected on the Include tab) is changed to include both parents of the starting person. Only two people are shown in the title. In example 2, Mike Morris is not listed in the title even though his descendants are shown.&lt;br /&gt;
&lt;br /&gt;
{{man label|Generations}} The number of generations to show on the report (including the starting person). If {{man label|Start with the parent(s) of the selected first}} is selected, the chart will include one more generation. (Example 1 was run with {{man label|Generations}}=3, Example 2 with {{man label|Generations}}=2.)&lt;br /&gt;
&lt;br /&gt;
{{man label|Level of spouses}} specifies how deep to display spouses.  &lt;br /&gt;
&lt;br /&gt;
For the example:  &lt;br /&gt;
&lt;br /&gt;
* Abe is a direct descendant&lt;br /&gt;
** Abe has/had married Barbra and had two children&lt;br /&gt;
** Abe also married Bridget and had one child&lt;br /&gt;
*** Bridget has/had married Carl.  &lt;br /&gt;
**** Carl and Denise had a child.&lt;br /&gt;
&lt;br /&gt;
Given the above example, this is what will be displayed for the first three {{man label|Level of spouses}} options.&lt;br /&gt;
* 0 means that only direct descendants will be shown. Nothing on the Secondary tab will be shown (Spousal information or Marriage information). For the example above, only Abe will be shown with three children directly under him&lt;br /&gt;
* 1 means that only spouses of the direct descendants will be shown. For the example above, Abe will be shown with two pieces of marriage information. Under the first will be two children and one child under the second.&lt;br /&gt;
* 2 means that spouses of spouses are shown. Same as 1 but Bridget will also show her other marriage. If they had any children, they would be shown too.&lt;br /&gt;
* 3 means that everyone in the example above will be displayed.&lt;br /&gt;
Any option above 1 is very hard to read on the report without the {{man label|Indent Spouses}} option on the Display tab.&lt;br /&gt;
&lt;br /&gt;
And last but not least is the {{man label|Compress Tree}} option which tries to move everyone up as far as they can go (compress) and still have a readable report. If {{man label|Start with the parent(s) of the selected first}} is ticked, {{man label|Compress Tree}} does not have any affect on the first generation.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Family Descendant Tree&amp;lt;/u&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
{{man note|Shared options with the [[#Descendant Tree|Descendant Tree report]]|This report has the same options as the 'Descendant Tree' report, except that there are more options for the report title on the Include tab. Also, some of the options have a different effect.&amp;lt;br&amp;gt;Options are only described here if they differ between the two reports.}}&lt;br /&gt;
&lt;br /&gt;
[[File:GraphicalReports-FamilyDescendantTree-example-portrait-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report generates a chart of people who are descendants of the Active Family.&lt;br /&gt;
&lt;br /&gt;
You can choose the Family Descendant Tree report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Family Descendant Tree...}}&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
==== Tree Options ====&lt;br /&gt;
[[File:FamilyDescendantTree-GraphicalReports-TreeOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - Tree Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
{{man button|Report for:}} will select the starting family (Father and Mother) for this report. It defaults to the currently active family.&lt;br /&gt;
&lt;br /&gt;
{{man label|Generations}} (&amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; default ). The number of generations to show on the chart (including the starting person). If {{man label|Start with the parent(s) of the selected first}} is selected, the chart will include one more generation. (Example 1 was run with {{man label|Generations}}=3, Example 2 with {{man label|Generations}}=2.)&lt;br /&gt;
&lt;br /&gt;
{{man label|Level of spouses}} specifies how deep to display spouses.&lt;br /&gt;
&lt;br /&gt;
{{man label|Start with the parent(s) of the selected first}} If this box is ticked, the report shows both parents of the starting father and mother (if they are in the database),&lt;br /&gt;
and all descendants of both sets of parents for the selected number of generations. The total number of generations&lt;br /&gt;
in the chart is therefore 1 more than the number selected in the generations box. (The example chart above was made&lt;br /&gt;
with generations=2.)&lt;br /&gt;
&lt;br /&gt;
The starting father and mother have to be in the center of the chart.&lt;br /&gt;
They will therefore not be shown in birth order with their siblings - instead they will be shown as the last and first&lt;br /&gt;
child of their parents respectively. This is shown in the [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Examples|Examples]] chart, where the children in both families&lt;br /&gt;
have been named Child 1,2,3 in their birth order. Furthermore, if the starting father or mother have other spouses they will be shown twice. This also applies to the parents of the starting father or mother.&lt;br /&gt;
&lt;br /&gt;
If this box is not ticked, the report is the same as the descendant tree report, except that the&lt;br /&gt;
number of generations is increased by one, the format of the first generation is different,&lt;br /&gt;
and you get extra options for the chart title.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options====&lt;br /&gt;
[[File:FamilyDescendantTree-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
{{man label|Report title}} allows you to choose a title for the report. Options are:&lt;br /&gt;
* ''Do not include a title''&lt;br /&gt;
* ''Descendant Chart for [selected person(s)]''&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;Start with Parents of Selected&amp;quot; is ticked on the &amp;quot;Tree Options&amp;quot; tab, both parents of the selected person are shown. Only two people will be listed in the title. If &amp;quot;level of spouses&amp;quot; is two or more, descendants of &amp;quot;spouses of spouses&amp;quot; are included on the chart, but are not listed in the title.&lt;br /&gt;
&lt;br /&gt;
{{man label|Scale tree to fit }} Scale tree to fit will make the tree larger or smaller to fit the page as desired. The options are:&lt;br /&gt;
* ''Do not scale the tree (Default)''&lt;br /&gt;
*'' Scale tree to fit page width only''&lt;br /&gt;
* ''Scale tree to fit the size of the page''&lt;br /&gt;
*{{checkbox|0}} {{man label|Resize page to fit tree}}: Resize page to fit tree (unchecked by default) will make the page larger or smaller to fit the tree. If selected with the &amp;quot;Scale tree to fit&amp;quot;, the options happen in that order; scale the tree first, then the page. There is a combined effect with each option:&lt;br /&gt;
** With &amp;quot;Do not scale the tree&amp;quot;, both the page width and height is resized to fit the tree. &lt;br /&gt;
** With &amp;quot;Scale tree to fit page width only&amp;quot;, the page height is resized to fit the tree height.&lt;br /&gt;
** With &amp;quot;Scale tree to fit the size of the page&amp;quot;, the page is resized to remove any gap in both height and width.&lt;br /&gt;
&lt;br /&gt;
{{man note|Overrides options in the Paper Option tab.| Resize page to fit tree overrides options in the Paper Option. }}&lt;br /&gt;
These two options are better described in [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]] with tips for making nicer reports.&lt;br /&gt;
This tab also includes check boxes to {{man label|Include a border}}, {{man label|Include page numbers}}, and {{man label|Include blank pages}}.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:FamilyDescendantTree-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format}}: Select the format to display names. Choose from '''Surname, Given Suffix''' (default) / Given Surname Suffix/ Given/ Main Surnames, Given Patronymic Suffix Prefix&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
* {{man label|Translation}}: The translation to be used for the report. Language selector&lt;br /&gt;
* {{man label|Date Format}}: Select the format to display dates. Choose from '''YYYY-MM-DD (ISO)(2018-04-08)'''(default) / Numerical (8/4/2018) / Month Day, Year (April 8, 2018) / Mon Day, Year (Apr 8, 2018)/ Day Month Year (8 April 2018)/ Day Mon Year (8 Apr 2018)&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Display ====&lt;br /&gt;
&lt;br /&gt;
[[File:FamilyDescendantTree-GraphicalReports-Display-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - Display - tab default options]]&lt;br /&gt;
&lt;br /&gt;
{{man label|Descendant Display Format}} sets the display for all descendants in the tree. The default is:&lt;br /&gt;
&amp;lt;pre&amp;gt;$n&lt;br /&gt;
b. $b&lt;br /&gt;
{d. $d}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which displays the name, birth date and death date on consecutive lines in the formats set on the Display tab in Gramps preferences. The {} on the third line states that the text 'd. ' will display ONLY when $d has a value, i.e. there is something in the death date field of the database for this person.  See [[Gramps_5.1_Wiki_Manual_-_Reports_-_part_2|Substitution Values]] for more information, including how to include places and attributes, and select different formats for names and dates and places.&lt;br /&gt;
&lt;br /&gt;
{{man label|Spousal Display format}} specifies what is displayed for each spouse.  The default is the same as for descendants. If you do not wish to have a separate box for marriage information, it can be displayed in the spouse box, for example by adding a line with&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
m. $m &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which displays the date of the marriage.&lt;br /&gt;
&lt;br /&gt;
{{man label|Indent spouses}} will indent the spouse and marriage boxes from the descendant boxes. In the Family Descendant Chart, it does not affect the starting family or the parents of the starting family, but it does affect any other spouses of those three couples.&lt;br /&gt;
&lt;br /&gt;
{{man label|Include marriage box}} will display a separate box on the tree for each marriage. The display format is set in {{man label|Marriage Display format}}. The default is  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
m. $m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which displays the date of the marriage. If this box is not ticked, marriage information will not be displayed unless you specify it in the spousal display format as described above.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
==== Advanced ====&lt;br /&gt;
&lt;br /&gt;
[[File:FamilyDescendantTree-GraphicalReports-Advanced-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Family Descendant Tree - Graphical Reports - Advanced - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Replace Display Format: 'Replace this'/'With this'}}: This allows you to put in pairs of strings separated by '/' that specify text you want to replace with other text. For example, &amp;lt;pre&amp;gt;United States of America/USA&amp;lt;/pre&amp;gt; replaces the United States of America with USA.&lt;br /&gt;
** {{checkbox|0}} {{man label|Include a note}} You may check the Include a note box to add a note (checkbox unchecked by default). The {{man label|Note}} specifies text the note will contain.&lt;br /&gt;
* {{man label|Note location}}: Specify where on the page to place the note (default is bottom left).&lt;br /&gt;
* {{man label|inter-box scale factor}}: Make the inter-box bigger or smaller (default is 1.00 in.).&lt;br /&gt;
* {{man label|box shadow scale factor}}: Make the box shadow bigger or smaller (default is 1.00 in.).&lt;br /&gt;
&lt;br /&gt;
These two options are better described in [[Gramps_5.1_Wiki_Manual_-_Reports_-_part 4#Common options|common options]] with tips for making nicer reports.&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Fan Chart&amp;lt;/u&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[File:GraphicalReports-FanChart-example-landscape-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Fan Chart - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report produces a chart resembling a fan, with Active person in the center, parents the semicircle next to it, grandparents in the next semicircle, and so on, for a total of five generations.&lt;br /&gt;
&lt;br /&gt;
You can choose the Fan Chart report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Fan Chart...}}&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
====Report Options====&lt;br /&gt;
&lt;br /&gt;
[[File:FanChart-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Fan Chart - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Center Person:}} The center person for the report.&lt;br /&gt;
{{man warn|'''CAVEAT'''|A &amp;quot;Person ____ is not in the Database&amp;quot; error will appear if the Center Person is Private or Living while the filtering Report Options (2) settings do not allow Private or Living Persons.}}&lt;br /&gt;
* {{man label|Generations:}} (&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; default ) The number of generations to include in the report.&lt;br /&gt;
* {{man label|Type of graph:}} The form of the graph.&lt;br /&gt;
** full circle&lt;br /&gt;
** '''half circle'''(Default)&lt;br /&gt;
** quarter circle&lt;br /&gt;
* {{man label|Background color:}} Background color is either white or '''generation dependent'''(Default).&lt;br /&gt;
* {{man label|Orientation of radial texts:}} Print radial text '''upright'''(Default) or roundabout.&lt;br /&gt;
* {{checkbox|1}} {{man label|Draw empty boxes}}: Draw the background although there is no information (checkbox checked by default)&lt;br /&gt;
* {{checkbox|1}} {{man label|Use one font style for all generations}} : You can customize font and color for each generation in the style editor (checkbox checked by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:FanChart-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Fan Chart - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
* {{man label|Translation}}: The translation to be used for the report. Language selector&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Statistics Charts&amp;lt;/u&amp;gt;===&lt;br /&gt;
This report displays statistical data about your Family Tree.&lt;br /&gt;
&amp;lt;gallery caption= &amp;quot;Statistics Charts - Graphical Reports - example output overview (Gramps 5.1.0; Microsoft Windows 10; data from example.gramps)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:GraphicalReports-StatisticsCharts-Chart1-example-portrait-50.png|right|thumb|250px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Chart 1 (Birth Month) ]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:GraphicalReports-StatisticsCharts-Chart3-Gender-example-portrait-50.png|right|thumb|250px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Chart 3 (Gender) ]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:GraphicalReports-StatisticsCharts-Chart3-example-portrait-50.png|right|thumb|250px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Chart 3 (Number of children) -  ]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can choose the Statistics Charts report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Statistics Charts...}}&lt;br /&gt;
&lt;br /&gt;
Specific options include filter, sorting methods, and additional birth- and gender-based limit for inclusion into statistics. You can also set the minimum number of items to qualify for the bar chart, so that the charts with fewer items will generate a pie chart instead. The {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Charts_1|Charts 1]]}}, {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Charts_2|Charts 2]]}} and {{man label|[[Gramps_5.1_Wiki_Manual_-_Reports_-_part_4#Charts_3|Charts 3]]}}tabs allows you to select which additional information to include on each individual chart in your report.&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
====Report Options====&lt;br /&gt;
&lt;br /&gt;
[[File:StatisticsCharts-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|right|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Statistics Charts - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Filter:}} choose between&lt;br /&gt;
** '''Entire Database''' (Default)&lt;br /&gt;
** Descendants of active person&lt;br /&gt;
** Descendant families of active person&lt;br /&gt;
** Ancestors of active person&lt;br /&gt;
** People with common ancestor with active person&lt;br /&gt;
* {{man label|Filter Person:}} The center person for the report.&lt;br /&gt;
* {{man label|Sort chart items by:}} Select how the statistical data is sorted:&lt;br /&gt;
** '''Item count''' (default)&lt;br /&gt;
** Item name&lt;br /&gt;
* {{checkbox|0}} {{man label|Sort in reverse order}} (checkbox unchecked by default)&lt;br /&gt;
* {{man label|People born after:}} (&amp;lt;code&amp;gt;1700&amp;lt;/code&amp;gt; default) Birth year from which to include people: fill in a year to start from&lt;br /&gt;
* {{man label|People born before:}} (&amp;lt;code&amp;gt;Current year&amp;lt;/code&amp;gt; default) Birth year until which to include people: fill in a year &lt;br /&gt;
* {{checkbox|0}} {{man label|Include people without known birth years}} (checkbox unchecked by default)&lt;br /&gt;
* {{man label|Genders included:}} Select which genders are included into statistics.&lt;br /&gt;
** '''Both'''(Default)&lt;br /&gt;
** Men&lt;br /&gt;
** Women&lt;br /&gt;
* {{man label|Max. items for a pie:}} (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; default) With fewer items pie chart and legend will be used instead of a bar chart.&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:StatisticsCharts-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Statistics Charts - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format:}} Select the format to display the names. Choose from '''Surname, Given Suffix'''(default) / Given Surname Suffix / Given / Main Surnames, Given Patronymic Suffix / SURNAME, Given (Common)&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
* {{man label|Translation}}: The translation to be used for the report. Language selector&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Charts 1====&lt;br /&gt;
&lt;br /&gt;
[[File:StatisticsCharts-GraphicalReports-Charts1-tab-50.png|right|thumb|450px|right|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Statistics Charts - Graphical Reports - Charts 1 - tab default options]]&lt;br /&gt;
&lt;br /&gt;
Displays '''Birth Month''' statistics by default and you can include any of the following the indicated data on a chart:&lt;br /&gt;
* {{checkbox|0}} {{man label|Age}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Age at death}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Age at marriage}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Age when first child born}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Age when last child born}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|1}} {{man label|Birth month}} (checkbox checked by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Charts 2====&lt;br /&gt;
&lt;br /&gt;
[[File:StatisticsCharts-GraphicalReports-Charts2-tab-50.png|right|thumb|450px|right|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Statistics Charts - Graphical Reports - Charts 2 - tab default options]]&lt;br /&gt;
&lt;br /&gt;
Displays '''Number of children''' statistics by default and you can include any of the following the indicated data on a chart:&lt;br /&gt;
* {{checkbox|0}} {{man label|Birth place}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Birth year}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Death month}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Death place}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Death year}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Event type}} (checkbox unchecked by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Charts 3====&lt;br /&gt;
[[File:StatisticsCharts-GraphicalReports-Charts3-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Statistics Charts - Graphical Reports - Charts 3 - tab default options]]&lt;br /&gt;
&lt;br /&gt;
Displays '''Gender''' statistics by default and you can include any of the following the indicated data on a chart:&lt;br /&gt;
* {{checkbox|0}} {{man label|Forename}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|1}} {{man label|Gender}} (checkbox checked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Marriage place}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|1}} {{man label|Number of children}} (checkbox checked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Number of relationships}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Surname}} (checkbox unchecked by default)&lt;br /&gt;
* {{checkbox|0}} {{man label|Title}} (checkbox unchecked by default)&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;u&amp;gt;Timeline Chart&amp;lt;/u&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[File:GraphicalReports-TimelineChart-example-landscape-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Timeline Chart - Graphical Reports - example output overview]]&lt;br /&gt;
&lt;br /&gt;
This report outputs the list of people with their lifetimes represented by intervals on a common chronological scale. &lt;br /&gt;
&lt;br /&gt;
You can choose the Timeline Chart report with {{man menu|Reports -&amp;gt;Graphical Reports -&amp;gt; Timeline Chart...}}&lt;br /&gt;
{{-}}&lt;br /&gt;
See also [[Gramps_5.1_Wiki_Manual_-_Reports - part 4#Common options|common options]]&lt;br /&gt;
{{-}}&lt;br /&gt;
==== Report Options ====&lt;br /&gt;
&lt;br /&gt;
[[File:TimelineChart-GraphicalReports-ReportOptions-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Timeline Chart - Graphical Reports - Report Options - tab default options]]&lt;br /&gt;
&lt;br /&gt;
* {{man label|Filter:}} choose between&lt;br /&gt;
** '''Entire Database''' (Default)&lt;br /&gt;
** Descendants of active person&lt;br /&gt;
** Descendant families of active person&lt;br /&gt;
** Ancestors of active person&lt;br /&gt;
** People with common ancestor with active person&lt;br /&gt;
* {{man label|Filter Person:}} The center person for the report.&lt;br /&gt;
* {{man label|Sort by:}} Sorting method to use.&lt;br /&gt;
** '''Birth Date''' (Default)&lt;br /&gt;
** Name&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
====Report Options (2)====&lt;br /&gt;
[[File:TimelineChart-GraphicalReports-ReportOptions2-tab-50.png|right|thumb|450px|Fig. {{#var:chapter}}.{{#vardefineecho:figure|{{#expr:{{#var:figure}}+1}}}} Timeline Chart - Graphical Reports - Report Options (2) - tab default options]]&lt;br /&gt;
* {{man label|Name Format:}} Select the format to display the names. Choose from '''Surname, Given Suffix'''(default) / Given Surname Suffix / Given / Main Surnames, Given Patronymic Suffix / SURNAME, Given (Common)&lt;br /&gt;
** {{checkbox|1}} {{man label|Include data marked private}} (checkbox checked by default)&lt;br /&gt;
* {{man label|Living people}}: Select to  include or not living persons in the report. Choose from '''Include, and all data''' (default) / Full names, but data removed / Given names replaced, and data removed / Complete names replaced, and data removed/ Not included&lt;br /&gt;
* {{man label|Years from death to consider living}}: Select the number of years since death to consider persons for the report. Allows for the inclusion or exclusion of recently-dead persons in the report. Default value is 0 years.&lt;br /&gt;
* {{man label|Translation:}} The translation to be used for the report. Language selector&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Back to [[Gramps_5.1_Wiki_Manual_-_Reports|Index of Reports]].&lt;br /&gt;
{{-}}&lt;br /&gt;
{{man index|Gramps 5.1 Wiki Manual - Reports - part 3|Gramps_5.1_Wiki_Manual_-_Reports_-_part_5|5.1}}&lt;br /&gt;
{{languages|Gramps 5.1 Wiki Manual - Reports - part 4}}&lt;br /&gt;
{{grampsmanualcopyright}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Codefarmer</name></author>
		
	</entry>
</feed>