* src/EditRepository.py: modified to use find_backlink_handles and fixed subtle bug * src/RelLib/_Source.py: added reporef_list to referent object lists so that backref are put in reference_map * test/GrampsDb/GrampsDbBase_Test.py: added unittest for source/reference backlinks * test/GrampsDb/GrampsDbTestBase.py: added unittest for source/reference backlinks svn: r5616
		
			
				
	
	
		
			161 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import tempfile
 | 
						|
import shutil
 | 
						|
import time
 | 
						|
import traceback
 | 
						|
import sys
 | 
						|
 | 
						|
sys.path.append('../src')
 | 
						|
 | 
						|
try:
 | 
						|
    set()
 | 
						|
except NameError:
 | 
						|
    from sets import Set as set
 | 
						|
    
 | 
						|
import GrampsDb
 | 
						|
import const
 | 
						|
import RelLib
 | 
						|
 | 
						|
logger = logging.getLogger('Gramps.GrampsDbTestBase')
 | 
						|
 | 
						|
class GrampsDbBaseTest(unittest.TestCase):
 | 
						|
    """Base class for unittest that need to be able to create
 | 
						|
    test databases."""
 | 
						|
    
 | 
						|
    def setUp(self):        
 | 
						|
        self._tmpdir = tempfile.mkdtemp()
 | 
						|
        self._filename = os.path.join(self._tmpdir,'test.grdb')
 | 
						|
        
 | 
						|
        self._db = GrampsDb.gramps_db_factory(const.app_gramps)()
 | 
						|
        self._db.load(self._filename,
 | 
						|
                      None, # callback
 | 
						|
                      "w")
 | 
						|
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        shutil.rmtree(self._tmpdir)
 | 
						|
 | 
						|
    def _populate_database(self,
 | 
						|
                           num_sources = 1,
 | 
						|
                           num_persons = 0,
 | 
						|
                           num_families = 0,
 | 
						|
                           num_events = 0,
 | 
						|
                           num_places = 0,
 | 
						|
                           num_media_objects = 0,
 | 
						|
                           num_links = 1):
 | 
						|
 | 
						|
        # start with sources
 | 
						|
        sources = []
 | 
						|
        for i in xrange(0,num_sources):
 | 
						|
            sources.append(self._add_source())
 | 
						|
 | 
						|
        # now for each of the other tables. Give each entry a link
 | 
						|
        # to num_link sources, sources are chosen on a round robin
 | 
						|
        # basis
 | 
						|
 | 
						|
        for num, add_func in ((num_persons, self._add_person_with_sources),
 | 
						|
                              (num_families, self._add_family_with_sources),
 | 
						|
                              (num_events, self._add_event_with_sources),
 | 
						|
                              (num_places, self._add_place_with_sources),
 | 
						|
                              (num_media_objects, self._add_media_object_with_sources)):
 | 
						|
                                   
 | 
						|
            source_idx = 1
 | 
						|
            for person_idx in xrange(0,num):
 | 
						|
 | 
						|
                # Get the list of sources to link
 | 
						|
                lnk_sources = set()
 | 
						|
                for i in xrange(0,num_links):
 | 
						|
                    lnk_sources.add(sources[source_idx-1])
 | 
						|
                    source_idx = (source_idx+1) % len(sources)
 | 
						|
 | 
						|
                try:
 | 
						|
                    add_func(lnk_sources)
 | 
						|
                except:
 | 
						|
                    print "person_idx = ", person_idx
 | 
						|
                    print "lnk_sources = ", repr(lnk_sources)
 | 
						|
                    raise
 | 
						|
 | 
						|
        return
 | 
						|
 | 
						|
    def _add_source(self,repos=None):
 | 
						|
        # Add a Source
 | 
						|
        
 | 
						|
        tran = self._db.transaction_begin()
 | 
						|
        source = RelLib.Source()
 | 
						|
        if repos != None:
 | 
						|
            repo_ref = RelLib.RepoRef()
 | 
						|
            repo_ref.set_reference_handle(repos.get_handle())
 | 
						|
            source.add_repo_reference(repo_ref)
 | 
						|
        self._db.add_source(source,tran)
 | 
						|
        self._db.commit_source(source,tran)
 | 
						|
        self._db.transaction_commit(tran, "Add Source")
 | 
						|
 | 
						|
        return source
 | 
						|
 | 
						|
    def _add_repository(self):
 | 
						|
        # Add a Repository
 | 
						|
        
 | 
						|
        tran = self._db.transaction_begin()
 | 
						|
        repos = RelLib.Repository()
 | 
						|
        self._db.add_repository(repos,tran)
 | 
						|
        self._db.commit_repository(repos,tran)
 | 
						|
        self._db.transaction_commit(tran, "Add Repository")
 | 
						|
 | 
						|
        return repos
 | 
						|
 | 
						|
                           
 | 
						|
    def _add_object_with_source(self,sources,object_class,add_method,commit_method):
 | 
						|
 | 
						|
        object = object_class()
 | 
						|
 | 
						|
        for source in sources:
 | 
						|
            src_ref = RelLib.SourceRef()
 | 
						|
            src_ref.set_base_handle(source.get_handle())
 | 
						|
            object.add_source_reference(src_ref)
 | 
						|
 | 
						|
 | 
						|
        tran = self._db.transaction_begin()
 | 
						|
        add_method(object,tran)
 | 
						|
        commit_method(object,tran)
 | 
						|
        self._db.transaction_commit(tran, "Add Object")
 | 
						|
 | 
						|
        return object
 | 
						|
 | 
						|
    def _add_person_with_sources(self,sources):
 | 
						|
 | 
						|
        return self._add_object_with_source(sources,
 | 
						|
                                            RelLib.Person,
 | 
						|
                                            self._db.add_person,
 | 
						|
                                            self._db.commit_person)
 | 
						|
 | 
						|
    def _add_family_with_sources(self,sources):
 | 
						|
 | 
						|
        return self._add_object_with_source(sources,
 | 
						|
                                            RelLib.Family,
 | 
						|
                                            self._db.add_family,
 | 
						|
                                            self._db.commit_family)
 | 
						|
 | 
						|
    def _add_event_with_sources(self,sources):
 | 
						|
 | 
						|
        return self._add_object_with_source(sources,
 | 
						|
                                            RelLib.Event,
 | 
						|
                                            self._db.add_event,
 | 
						|
                                            self._db.commit_event)
 | 
						|
 | 
						|
    def _add_place_with_sources(self,sources):
 | 
						|
 | 
						|
        return self._add_object_with_source(sources,
 | 
						|
                                            RelLib.Place,
 | 
						|
                                            self._db.add_place,
 | 
						|
                                            self._db.commit_place)
 | 
						|
 | 
						|
    def _add_media_object_with_sources(self,sources):
 | 
						|
 | 
						|
        return self._add_object_with_source(sources,
 | 
						|
                                            RelLib.MediaObject,
 | 
						|
                                            self._db.add_object,
 | 
						|
                                            self._db.commit_media_object)
 | 
						|
    
 |