diff --git a/src/webapp/dbdjango.py b/src/webapp/dbdjango.py index c2851db92..79fa001c4 100644 --- a/src/webapp/dbdjango.py +++ b/src/webapp/dbdjango.py @@ -224,6 +224,8 @@ class DbDjango(DbWriteBase, DbReadBase): self.dji.add_note_detail(obj.serialize()) elif isinstance(obj, gen.lib.MediaObject): self.dji.add_media_detail(obj.serialize()) + elif isinstance(obj, gen.lib.Tag): + self.dji.add_tag_detail(obj.serialize()) self.use_import_cache = False self.import_cache = {} @@ -234,7 +236,8 @@ class DbDjango(DbWriteBase, DbReadBase): pass def request_rebuild(self): - self.dji.rebuild_caches() + #self.dji.rebuild_caches() + pass def get_undodb(self): return None @@ -765,7 +768,7 @@ class DbDjango(DbWriteBase, DbReadBase): return self.dji.Place.count() def get_number_of_tags(self): - return 0 # self.dji.Tag.count() + return self.dji.Tag.count() def get_number_of_families(self): return self.dji.Family.count() diff --git a/src/webapp/empty.sql b/src/webapp/empty.sql index 120d385a1..734e32282 100644 --- a/src/webapp/empty.sql +++ b/src/webapp/empty.sql @@ -100,93 +100,111 @@ INSERT INTO "auth_permission" VALUES(90,'Can delete config',30,'delete_config'); INSERT INTO "auth_permission" VALUES(91,'Can add tag',31,'add_tag'); INSERT INTO "auth_permission" VALUES(92,'Can change tag',31,'change_tag'); INSERT INTO "auth_permission" VALUES(93,'Can delete tag',31,'delete_tag'); -INSERT INTO "auth_permission" VALUES(94,'Can add person',32,'add_person'); -INSERT INTO "auth_permission" VALUES(95,'Can change person',32,'change_person'); -INSERT INTO "auth_permission" VALUES(96,'Can delete person',32,'delete_person'); -INSERT INTO "auth_permission" VALUES(97,'Can add family',33,'add_family'); -INSERT INTO "auth_permission" VALUES(98,'Can change family',33,'change_family'); -INSERT INTO "auth_permission" VALUES(99,'Can delete family',33,'delete_family'); -INSERT INTO "auth_permission" VALUES(100,'Can add citation',34,'add_citation'); -INSERT INTO "auth_permission" VALUES(101,'Can change citation',34,'change_citation'); -INSERT INTO "auth_permission" VALUES(102,'Can delete citation',34,'delete_citation'); -INSERT INTO "auth_permission" VALUES(103,'Can add source',35,'add_source'); -INSERT INTO "auth_permission" VALUES(104,'Can change source',35,'change_source'); -INSERT INTO "auth_permission" VALUES(105,'Can delete source',35,'delete_source'); -INSERT INTO "auth_permission" VALUES(106,'Can add event',36,'add_event'); -INSERT INTO "auth_permission" VALUES(107,'Can change event',36,'change_event'); -INSERT INTO "auth_permission" VALUES(108,'Can delete event',36,'delete_event'); -INSERT INTO "auth_permission" VALUES(109,'Can add repository',37,'add_repository'); -INSERT INTO "auth_permission" VALUES(110,'Can change repository',37,'change_repository'); -INSERT INTO "auth_permission" VALUES(111,'Can delete repository',37,'delete_repository'); -INSERT INTO "auth_permission" VALUES(112,'Can add place',38,'add_place'); -INSERT INTO "auth_permission" VALUES(113,'Can change place',38,'change_place'); -INSERT INTO "auth_permission" VALUES(114,'Can delete place',38,'delete_place'); -INSERT INTO "auth_permission" VALUES(115,'Can add media',39,'add_media'); -INSERT INTO "auth_permission" VALUES(116,'Can change media',39,'change_media'); -INSERT INTO "auth_permission" VALUES(117,'Can delete media',39,'delete_media'); -INSERT INTO "auth_permission" VALUES(118,'Can add note',40,'add_note'); -INSERT INTO "auth_permission" VALUES(119,'Can change note',40,'change_note'); -INSERT INTO "auth_permission" VALUES(120,'Can delete note',40,'delete_note'); -INSERT INTO "auth_permission" VALUES(121,'Can add surname',41,'add_surname'); -INSERT INTO "auth_permission" VALUES(122,'Can change surname',41,'change_surname'); -INSERT INTO "auth_permission" VALUES(123,'Can delete surname',41,'delete_surname'); -INSERT INTO "auth_permission" VALUES(124,'Can add name',42,'add_name'); -INSERT INTO "auth_permission" VALUES(125,'Can change name',42,'change_name'); -INSERT INTO "auth_permission" VALUES(126,'Can delete name',42,'delete_name'); -INSERT INTO "auth_permission" VALUES(127,'Can add lds',43,'add_lds'); -INSERT INTO "auth_permission" VALUES(128,'Can change lds',43,'change_lds'); -INSERT INTO "auth_permission" VALUES(129,'Can delete lds',43,'delete_lds'); -INSERT INTO "auth_permission" VALUES(130,'Can add markup',44,'add_markup'); -INSERT INTO "auth_permission" VALUES(131,'Can change markup',44,'change_markup'); -INSERT INTO "auth_permission" VALUES(132,'Can delete markup',44,'delete_markup'); -INSERT INTO "auth_permission" VALUES(133,'Can add source datamap',45,'add_sourcedatamap'); -INSERT INTO "auth_permission" VALUES(134,'Can change source datamap',45,'change_sourcedatamap'); -INSERT INTO "auth_permission" VALUES(135,'Can delete source datamap',45,'delete_sourcedatamap'); -INSERT INTO "auth_permission" VALUES(136,'Can add citation datamap',46,'add_citationdatamap'); -INSERT INTO "auth_permission" VALUES(137,'Can change citation datamap',46,'change_citationdatamap'); -INSERT INTO "auth_permission" VALUES(138,'Can delete citation datamap',46,'delete_citationdatamap'); -INSERT INTO "auth_permission" VALUES(139,'Can add address',47,'add_address'); -INSERT INTO "auth_permission" VALUES(140,'Can change address',47,'change_address'); -INSERT INTO "auth_permission" VALUES(141,'Can delete address',47,'delete_address'); -INSERT INTO "auth_permission" VALUES(142,'Can add location',48,'add_location'); -INSERT INTO "auth_permission" VALUES(143,'Can change location',48,'change_location'); -INSERT INTO "auth_permission" VALUES(144,'Can delete location',48,'delete_location'); -INSERT INTO "auth_permission" VALUES(145,'Can add url',49,'add_url'); -INSERT INTO "auth_permission" VALUES(146,'Can change url',49,'change_url'); -INSERT INTO "auth_permission" VALUES(147,'Can delete url',49,'delete_url'); -INSERT INTO "auth_permission" VALUES(148,'Can add attribute',50,'add_attribute'); -INSERT INTO "auth_permission" VALUES(149,'Can change attribute',50,'change_attribute'); -INSERT INTO "auth_permission" VALUES(150,'Can delete attribute',50,'delete_attribute'); -INSERT INTO "auth_permission" VALUES(151,'Can add log',51,'add_log'); -INSERT INTO "auth_permission" VALUES(152,'Can change log',51,'change_log'); -INSERT INTO "auth_permission" VALUES(153,'Can delete log',51,'delete_log'); -INSERT INTO "auth_permission" VALUES(154,'Can add note ref',52,'add_noteref'); -INSERT INTO "auth_permission" VALUES(155,'Can change note ref',52,'change_noteref'); -INSERT INTO "auth_permission" VALUES(156,'Can delete note ref',52,'delete_noteref'); -INSERT INTO "auth_permission" VALUES(157,'Can add event ref',53,'add_eventref'); -INSERT INTO "auth_permission" VALUES(158,'Can change event ref',53,'change_eventref'); -INSERT INTO "auth_permission" VALUES(159,'Can delete event ref',53,'delete_eventref'); -INSERT INTO "auth_permission" VALUES(160,'Can add repository ref',54,'add_repositoryref'); -INSERT INTO "auth_permission" VALUES(161,'Can change repository ref',54,'change_repositoryref'); -INSERT INTO "auth_permission" VALUES(162,'Can delete repository ref',54,'delete_repositoryref'); -INSERT INTO "auth_permission" VALUES(163,'Can add person ref',55,'add_personref'); -INSERT INTO "auth_permission" VALUES(164,'Can change person ref',55,'change_personref'); -INSERT INTO "auth_permission" VALUES(165,'Can delete person ref',55,'delete_personref'); -INSERT INTO "auth_permission" VALUES(166,'Can add citation ref',56,'add_citationref'); -INSERT INTO "auth_permission" VALUES(167,'Can change citation ref',56,'change_citationref'); -INSERT INTO "auth_permission" VALUES(168,'Can delete citation ref',56,'delete_citationref'); -INSERT INTO "auth_permission" VALUES(169,'Can add child ref',57,'add_childref'); -INSERT INTO "auth_permission" VALUES(170,'Can change child ref',57,'change_childref'); -INSERT INTO "auth_permission" VALUES(171,'Can delete child ref',57,'delete_childref'); -INSERT INTO "auth_permission" VALUES(172,'Can add media ref',58,'add_mediaref'); -INSERT INTO "auth_permission" VALUES(173,'Can change media ref',58,'change_mediaref'); -INSERT INTO "auth_permission" VALUES(174,'Can delete media ref',58,'delete_mediaref'); -INSERT INTO "auth_permission" VALUES(175,'Can add report',59,'add_report'); -INSERT INTO "auth_permission" VALUES(176,'Can change report',59,'change_report'); -INSERT INTO "auth_permission" VALUES(177,'Can delete report',59,'delete_report'); -INSERT INTO "auth_permission" VALUES(178,'Can add result',60,'add_result'); -INSERT INTO "auth_permission" VALUES(179,'Can change result',60,'change_result'); -INSERT INTO "auth_permission" VALUES(180,'Can delete result',60,'delete_result'); +INSERT INTO "auth_permission" VALUES(94,'Can add person family order',32,'add_personfamilyorder'); +INSERT INTO "auth_permission" VALUES(95,'Can change person family order',32,'change_personfamilyorder'); +INSERT INTO "auth_permission" VALUES(96,'Can delete person family order',32,'delete_personfamilyorder'); +INSERT INTO "auth_permission" VALUES(97,'Can add person parent family order',33,'add_personparentfamilyorder'); +INSERT INTO "auth_permission" VALUES(98,'Can change person parent family order',33,'change_personparentfamilyorder'); +INSERT INTO "auth_permission" VALUES(99,'Can delete person parent family order',33,'delete_personparentfamilyorder'); +INSERT INTO "auth_permission" VALUES(100,'Can add person tag',34,'add_persontag'); +INSERT INTO "auth_permission" VALUES(101,'Can change person tag',34,'change_persontag'); +INSERT INTO "auth_permission" VALUES(102,'Can delete person tag',34,'delete_persontag'); +INSERT INTO "auth_permission" VALUES(103,'Can add family tag',35,'add_familytag'); +INSERT INTO "auth_permission" VALUES(104,'Can change family tag',35,'change_familytag'); +INSERT INTO "auth_permission" VALUES(105,'Can delete family tag',35,'delete_familytag'); +INSERT INTO "auth_permission" VALUES(106,'Can add media tag',36,'add_mediatag'); +INSERT INTO "auth_permission" VALUES(107,'Can change media tag',36,'change_mediatag'); +INSERT INTO "auth_permission" VALUES(108,'Can delete media tag',36,'delete_mediatag'); +INSERT INTO "auth_permission" VALUES(109,'Can add note tag',37,'add_notetag'); +INSERT INTO "auth_permission" VALUES(110,'Can change note tag',37,'change_notetag'); +INSERT INTO "auth_permission" VALUES(111,'Can delete note tag',37,'delete_notetag'); +INSERT INTO "auth_permission" VALUES(112,'Can add person',38,'add_person'); +INSERT INTO "auth_permission" VALUES(113,'Can change person',38,'change_person'); +INSERT INTO "auth_permission" VALUES(114,'Can delete person',38,'delete_person'); +INSERT INTO "auth_permission" VALUES(115,'Can add family',39,'add_family'); +INSERT INTO "auth_permission" VALUES(116,'Can change family',39,'change_family'); +INSERT INTO "auth_permission" VALUES(117,'Can delete family',39,'delete_family'); +INSERT INTO "auth_permission" VALUES(118,'Can add citation',40,'add_citation'); +INSERT INTO "auth_permission" VALUES(119,'Can change citation',40,'change_citation'); +INSERT INTO "auth_permission" VALUES(120,'Can delete citation',40,'delete_citation'); +INSERT INTO "auth_permission" VALUES(121,'Can add source',41,'add_source'); +INSERT INTO "auth_permission" VALUES(122,'Can change source',41,'change_source'); +INSERT INTO "auth_permission" VALUES(123,'Can delete source',41,'delete_source'); +INSERT INTO "auth_permission" VALUES(124,'Can add event',42,'add_event'); +INSERT INTO "auth_permission" VALUES(125,'Can change event',42,'change_event'); +INSERT INTO "auth_permission" VALUES(126,'Can delete event',42,'delete_event'); +INSERT INTO "auth_permission" VALUES(127,'Can add repository',43,'add_repository'); +INSERT INTO "auth_permission" VALUES(128,'Can change repository',43,'change_repository'); +INSERT INTO "auth_permission" VALUES(129,'Can delete repository',43,'delete_repository'); +INSERT INTO "auth_permission" VALUES(130,'Can add place',44,'add_place'); +INSERT INTO "auth_permission" VALUES(131,'Can change place',44,'change_place'); +INSERT INTO "auth_permission" VALUES(132,'Can delete place',44,'delete_place'); +INSERT INTO "auth_permission" VALUES(133,'Can add media',45,'add_media'); +INSERT INTO "auth_permission" VALUES(134,'Can change media',45,'change_media'); +INSERT INTO "auth_permission" VALUES(135,'Can delete media',45,'delete_media'); +INSERT INTO "auth_permission" VALUES(136,'Can add note',46,'add_note'); +INSERT INTO "auth_permission" VALUES(137,'Can change note',46,'change_note'); +INSERT INTO "auth_permission" VALUES(138,'Can delete note',46,'delete_note'); +INSERT INTO "auth_permission" VALUES(139,'Can add surname',47,'add_surname'); +INSERT INTO "auth_permission" VALUES(140,'Can change surname',47,'change_surname'); +INSERT INTO "auth_permission" VALUES(141,'Can delete surname',47,'delete_surname'); +INSERT INTO "auth_permission" VALUES(142,'Can add name',48,'add_name'); +INSERT INTO "auth_permission" VALUES(143,'Can change name',48,'change_name'); +INSERT INTO "auth_permission" VALUES(144,'Can delete name',48,'delete_name'); +INSERT INTO "auth_permission" VALUES(145,'Can add lds',49,'add_lds'); +INSERT INTO "auth_permission" VALUES(146,'Can change lds',49,'change_lds'); +INSERT INTO "auth_permission" VALUES(147,'Can delete lds',49,'delete_lds'); +INSERT INTO "auth_permission" VALUES(148,'Can add markup',50,'add_markup'); +INSERT INTO "auth_permission" VALUES(149,'Can change markup',50,'change_markup'); +INSERT INTO "auth_permission" VALUES(150,'Can delete markup',50,'delete_markup'); +INSERT INTO "auth_permission" VALUES(151,'Can add source datamap',51,'add_sourcedatamap'); +INSERT INTO "auth_permission" VALUES(152,'Can change source datamap',51,'change_sourcedatamap'); +INSERT INTO "auth_permission" VALUES(153,'Can delete source datamap',51,'delete_sourcedatamap'); +INSERT INTO "auth_permission" VALUES(154,'Can add citation datamap',52,'add_citationdatamap'); +INSERT INTO "auth_permission" VALUES(155,'Can change citation datamap',52,'change_citationdatamap'); +INSERT INTO "auth_permission" VALUES(156,'Can delete citation datamap',52,'delete_citationdatamap'); +INSERT INTO "auth_permission" VALUES(157,'Can add address',53,'add_address'); +INSERT INTO "auth_permission" VALUES(158,'Can change address',53,'change_address'); +INSERT INTO "auth_permission" VALUES(159,'Can delete address',53,'delete_address'); +INSERT INTO "auth_permission" VALUES(160,'Can add location',54,'add_location'); +INSERT INTO "auth_permission" VALUES(161,'Can change location',54,'change_location'); +INSERT INTO "auth_permission" VALUES(162,'Can delete location',54,'delete_location'); +INSERT INTO "auth_permission" VALUES(163,'Can add url',55,'add_url'); +INSERT INTO "auth_permission" VALUES(164,'Can change url',55,'change_url'); +INSERT INTO "auth_permission" VALUES(165,'Can delete url',55,'delete_url'); +INSERT INTO "auth_permission" VALUES(166,'Can add attribute',56,'add_attribute'); +INSERT INTO "auth_permission" VALUES(167,'Can change attribute',56,'change_attribute'); +INSERT INTO "auth_permission" VALUES(168,'Can delete attribute',56,'delete_attribute'); +INSERT INTO "auth_permission" VALUES(169,'Can add log',57,'add_log'); +INSERT INTO "auth_permission" VALUES(170,'Can change log',57,'change_log'); +INSERT INTO "auth_permission" VALUES(171,'Can delete log',57,'delete_log'); +INSERT INTO "auth_permission" VALUES(172,'Can add note ref',58,'add_noteref'); +INSERT INTO "auth_permission" VALUES(173,'Can change note ref',58,'change_noteref'); +INSERT INTO "auth_permission" VALUES(174,'Can delete note ref',58,'delete_noteref'); +INSERT INTO "auth_permission" VALUES(175,'Can add event ref',59,'add_eventref'); +INSERT INTO "auth_permission" VALUES(176,'Can change event ref',59,'change_eventref'); +INSERT INTO "auth_permission" VALUES(177,'Can delete event ref',59,'delete_eventref'); +INSERT INTO "auth_permission" VALUES(178,'Can add repository ref',60,'add_repositoryref'); +INSERT INTO "auth_permission" VALUES(179,'Can change repository ref',60,'change_repositoryref'); +INSERT INTO "auth_permission" VALUES(180,'Can delete repository ref',60,'delete_repositoryref'); +INSERT INTO "auth_permission" VALUES(181,'Can add person ref',61,'add_personref'); +INSERT INTO "auth_permission" VALUES(182,'Can change person ref',61,'change_personref'); +INSERT INTO "auth_permission" VALUES(183,'Can delete person ref',61,'delete_personref'); +INSERT INTO "auth_permission" VALUES(184,'Can add citation ref',62,'add_citationref'); +INSERT INTO "auth_permission" VALUES(185,'Can change citation ref',62,'change_citationref'); +INSERT INTO "auth_permission" VALUES(186,'Can delete citation ref',62,'delete_citationref'); +INSERT INTO "auth_permission" VALUES(187,'Can add child ref',63,'add_childref'); +INSERT INTO "auth_permission" VALUES(188,'Can change child ref',63,'change_childref'); +INSERT INTO "auth_permission" VALUES(189,'Can delete child ref',63,'delete_childref'); +INSERT INTO "auth_permission" VALUES(190,'Can add media ref',64,'add_mediaref'); +INSERT INTO "auth_permission" VALUES(191,'Can change media ref',64,'change_mediaref'); +INSERT INTO "auth_permission" VALUES(192,'Can delete media ref',64,'delete_mediaref'); +INSERT INTO "auth_permission" VALUES(193,'Can add report',65,'add_report'); +INSERT INTO "auth_permission" VALUES(194,'Can change report',65,'change_report'); +INSERT INTO "auth_permission" VALUES(195,'Can delete report',65,'delete_report'); +INSERT INTO "auth_permission" VALUES(196,'Can add result',66,'add_result'); +INSERT INTO "auth_permission" VALUES(197,'Can change result',66,'change_result'); +INSERT INTO "auth_permission" VALUES(198,'Can delete result',66,'delete_result'); CREATE TABLE "auth_group_permissions" ( "id" integer NOT NULL PRIMARY KEY, "group_id" integer NOT NULL, @@ -222,8 +240,8 @@ CREATE TABLE "auth_user" ( "last_login" datetime NOT NULL, "date_joined" datetime NOT NULL ); -INSERT INTO "auth_user" VALUES(1,'admin','','','bugs@gramps-project.org','sha1$7f568$508734ae545aeeb0897ee9eb842353f473efd9af',1,1,1,'2012-06-18 21:25:23.952110','2012-06-18 21:25:23.952110'); -INSERT INTO "auth_user" VALUES(2,'admin1','','','bugs@gramps-project.org','sha1$d0f39$4a5d0323022eaf3cf511fd3ada65444328a37452',1,1,1,'2012-06-18 21:25:29.831944','2012-06-18 21:25:29.831944'); +INSERT INTO "auth_user" VALUES(1,'admin','','','bugs@gramps-project.org','sha1$79844$2e75313e057aa61a683a05fd30873de252a22b14',1,1,1,'2012-07-27 01:29:11.642056','2012-07-27 01:29:11.642056'); +INSERT INTO "auth_user" VALUES(2,'admin1','','','bugs@gramps-project.org','sha1$7c119$6f386d33297d05700ccd580db301bba00027b3c0',1,1,1,'2012-07-27 01:29:16.458202','2012-07-27 01:29:16.458202'); CREATE TABLE "auth_message" ( "id" integer NOT NULL PRIMARY KEY, "user_id" integer NOT NULL REFERENCES "auth_user" ("id"), @@ -267,35 +285,41 @@ INSERT INTO "django_content_type" VALUES(28,'date new year type','grampsdb','dat INSERT INTO "django_content_type" VALUES(29,'theme type','grampsdb','themetype'); INSERT INTO "django_content_type" VALUES(30,'config','grampsdb','config'); INSERT INTO "django_content_type" VALUES(31,'tag','grampsdb','tag'); -INSERT INTO "django_content_type" VALUES(32,'person','grampsdb','person'); -INSERT INTO "django_content_type" VALUES(33,'family','grampsdb','family'); -INSERT INTO "django_content_type" VALUES(34,'citation','grampsdb','citation'); -INSERT INTO "django_content_type" VALUES(35,'source','grampsdb','source'); -INSERT INTO "django_content_type" VALUES(36,'event','grampsdb','event'); -INSERT INTO "django_content_type" VALUES(37,'repository','grampsdb','repository'); -INSERT INTO "django_content_type" VALUES(38,'place','grampsdb','place'); -INSERT INTO "django_content_type" VALUES(39,'media','grampsdb','media'); -INSERT INTO "django_content_type" VALUES(40,'note','grampsdb','note'); -INSERT INTO "django_content_type" VALUES(41,'surname','grampsdb','surname'); -INSERT INTO "django_content_type" VALUES(42,'name','grampsdb','name'); -INSERT INTO "django_content_type" VALUES(43,'lds','grampsdb','lds'); -INSERT INTO "django_content_type" VALUES(44,'markup','grampsdb','markup'); -INSERT INTO "django_content_type" VALUES(45,'source datamap','grampsdb','sourcedatamap'); -INSERT INTO "django_content_type" VALUES(46,'citation datamap','grampsdb','citationdatamap'); -INSERT INTO "django_content_type" VALUES(47,'address','grampsdb','address'); -INSERT INTO "django_content_type" VALUES(48,'location','grampsdb','location'); -INSERT INTO "django_content_type" VALUES(49,'url','grampsdb','url'); -INSERT INTO "django_content_type" VALUES(50,'attribute','grampsdb','attribute'); -INSERT INTO "django_content_type" VALUES(51,'log','grampsdb','log'); -INSERT INTO "django_content_type" VALUES(52,'note ref','grampsdb','noteref'); -INSERT INTO "django_content_type" VALUES(53,'event ref','grampsdb','eventref'); -INSERT INTO "django_content_type" VALUES(54,'repository ref','grampsdb','repositoryref'); -INSERT INTO "django_content_type" VALUES(55,'person ref','grampsdb','personref'); -INSERT INTO "django_content_type" VALUES(56,'citation ref','grampsdb','citationref'); -INSERT INTO "django_content_type" VALUES(57,'child ref','grampsdb','childref'); -INSERT INTO "django_content_type" VALUES(58,'media ref','grampsdb','mediaref'); -INSERT INTO "django_content_type" VALUES(59,'report','grampsdb','report'); -INSERT INTO "django_content_type" VALUES(60,'result','grampsdb','result'); +INSERT INTO "django_content_type" VALUES(32,'person family order','grampsdb','personfamilyorder'); +INSERT INTO "django_content_type" VALUES(33,'person parent family order','grampsdb','personparentfamilyorder'); +INSERT INTO "django_content_type" VALUES(34,'person tag','grampsdb','persontag'); +INSERT INTO "django_content_type" VALUES(35,'family tag','grampsdb','familytag'); +INSERT INTO "django_content_type" VALUES(36,'media tag','grampsdb','mediatag'); +INSERT INTO "django_content_type" VALUES(37,'note tag','grampsdb','notetag'); +INSERT INTO "django_content_type" VALUES(38,'person','grampsdb','person'); +INSERT INTO "django_content_type" VALUES(39,'family','grampsdb','family'); +INSERT INTO "django_content_type" VALUES(40,'citation','grampsdb','citation'); +INSERT INTO "django_content_type" VALUES(41,'source','grampsdb','source'); +INSERT INTO "django_content_type" VALUES(42,'event','grampsdb','event'); +INSERT INTO "django_content_type" VALUES(43,'repository','grampsdb','repository'); +INSERT INTO "django_content_type" VALUES(44,'place','grampsdb','place'); +INSERT INTO "django_content_type" VALUES(45,'media','grampsdb','media'); +INSERT INTO "django_content_type" VALUES(46,'note','grampsdb','note'); +INSERT INTO "django_content_type" VALUES(47,'surname','grampsdb','surname'); +INSERT INTO "django_content_type" VALUES(48,'name','grampsdb','name'); +INSERT INTO "django_content_type" VALUES(49,'lds','grampsdb','lds'); +INSERT INTO "django_content_type" VALUES(50,'markup','grampsdb','markup'); +INSERT INTO "django_content_type" VALUES(51,'source datamap','grampsdb','sourcedatamap'); +INSERT INTO "django_content_type" VALUES(52,'citation datamap','grampsdb','citationdatamap'); +INSERT INTO "django_content_type" VALUES(53,'address','grampsdb','address'); +INSERT INTO "django_content_type" VALUES(54,'location','grampsdb','location'); +INSERT INTO "django_content_type" VALUES(55,'url','grampsdb','url'); +INSERT INTO "django_content_type" VALUES(56,'attribute','grampsdb','attribute'); +INSERT INTO "django_content_type" VALUES(57,'log','grampsdb','log'); +INSERT INTO "django_content_type" VALUES(58,'note ref','grampsdb','noteref'); +INSERT INTO "django_content_type" VALUES(59,'event ref','grampsdb','eventref'); +INSERT INTO "django_content_type" VALUES(60,'repository ref','grampsdb','repositoryref'); +INSERT INTO "django_content_type" VALUES(61,'person ref','grampsdb','personref'); +INSERT INTO "django_content_type" VALUES(62,'citation ref','grampsdb','citationref'); +INSERT INTO "django_content_type" VALUES(63,'child ref','grampsdb','childref'); +INSERT INTO "django_content_type" VALUES(64,'media ref','grampsdb','mediaref'); +INSERT INTO "django_content_type" VALUES(65,'report','grampsdb','report'); +INSERT INTO "django_content_type" VALUES(66,'result','grampsdb','result'); CREATE TABLE "django_session" ( "session_key" varchar(40) NOT NULL PRIMARY KEY, "session_data" text NOT NULL, @@ -633,15 +657,191 @@ INSERT INTO "grampsdb_themetype" VALUES(8,'Web_Visually.css',7); INSERT INTO "grampsdb_themetype" VALUES(9,'Web_Basic-Spruce.css',8); CREATE TABLE "grampsdb_config" ( "id" integer NOT NULL PRIMARY KEY, - "setting" varchar(25) NOT NULL, - "description" text NOT NULL, - "value_type" varchar(25) NOT NULL, + "setting" varchar(50) NOT NULL, + "description" text, + "value_type" varchar(80) NOT NULL, "value" text NOT NULL ); INSERT INTO "grampsdb_config" VALUES(1,'sitename','site name of family tree','str','Gramps-Connect'); INSERT INTO "grampsdb_config" VALUES(2,'db_version','database scheme version','str','0.6.1'); -INSERT INTO "grampsdb_config" VALUES(3,'db_created','database creation date/time','str','2012-06-18 21:24'); -INSERT INTO "grampsdb_config" VALUES(4,'geography.center-lat','','','40.3621673584'); +INSERT INTO "grampsdb_config" VALUES(3,'db_created','database creation date/time','str','2012-07-27 01:28'); +INSERT INTO "grampsdb_config" VALUES(4,'htmlview.url-handler',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(5,'htmlview.start-url',NULL,'str','http://gramps-project.org'); +INSERT INTO "grampsdb_config" VALUES(6,'paths.recent-export-dir',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(7,'paths.report-directory',NULL,'unicode','/home/dblank'); +INSERT INTO "grampsdb_config" VALUES(8,'paths.quick-backup-filename',NULL,'str','%(filename)s_%(year)d-%(month)02d-%(day)02d.%(extension)s'); +INSERT INTO "grampsdb_config" VALUES(9,'paths.recent-import-dir',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(10,'paths.quick-backup-directory',NULL,'unicode','/home/dblank'); +INSERT INTO "grampsdb_config" VALUES(11,'paths.recent-file',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(12,'paths.website-directory',NULL,'unicode','/home/dblank'); +INSERT INTO "grampsdb_config" VALUES(13,'preferences.family-warn',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(14,'preferences.no-surname-text',NULL,'unicode','[Missing Surname]'); +INSERT INTO "grampsdb_config" VALUES(15,'preferences.family-relation-type',NULL,'int','3'); +INSERT INTO "grampsdb_config" VALUES(16,'preferences.private-surname-text',NULL,'unicode','[Living]'); +INSERT INTO "grampsdb_config" VALUES(17,'preferences.fprefix',NULL,'str','F%04d'); +INSERT INTO "grampsdb_config" VALUES(18,'preferences.default-source',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(19,'preferences.calendar-format-report',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(20,'preferences.oprefix',NULL,'str','O%04d'); +INSERT INTO "grampsdb_config" VALUES(21,'preferences.nprefix',NULL,'str','N%04d'); +INSERT INTO "grampsdb_config" VALUES(22,'preferences.use-last-view',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(23,'preferences.paper-preference',NULL,'str','Letter'); +INSERT INTO "grampsdb_config" VALUES(24,'preferences.use-bsddb3',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(25,'preferences.hide-ep-msg',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(26,'preferences.iprefix',NULL,'str','I%04d'); +INSERT INTO "grampsdb_config" VALUES(27,'preferences.rprefix',NULL,'str','R%04d'); +INSERT INTO "grampsdb_config" VALUES(28,'preferences.sprefix',NULL,'str','S%04d'); +INSERT INTO "grampsdb_config" VALUES(29,'preferences.no-given-text',NULL,'unicode','[Missing Given Name]'); +INSERT INTO "grampsdb_config" VALUES(30,'preferences.paper-metric',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(31,'preferences.age-display-precision',NULL,'int','1'); +INSERT INTO "grampsdb_config" VALUES(32,'preferences.cprefix',NULL,'str','C%04d'); +INSERT INTO "grampsdb_config" VALUES(33,'preferences.invalid-date-format',NULL,'str','%s'); +INSERT INTO "grampsdb_config" VALUES(34,'preferences.last-views',NULL,'list','[]'); +INSERT INTO "grampsdb_config" VALUES(35,'preferences.pprefix',NULL,'str','P%04d'); +INSERT INTO "grampsdb_config" VALUES(36,'preferences.eprefix',NULL,'str','E%04d'); +INSERT INTO "grampsdb_config" VALUES(37,'preferences.name-format',NULL,'int','1'); +INSERT INTO "grampsdb_config" VALUES(38,'preferences.private-record-text',NULL,'unicode','[Private Record]'); +INSERT INTO "grampsdb_config" VALUES(39,'preferences.online-maps',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(40,'preferences.no-record-text',NULL,'unicode','[Missing Record]'); +INSERT INTO "grampsdb_config" VALUES(41,'preferences.date-format',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(42,'preferences.last-view',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(43,'preferences.patronimic-surname',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(44,'preferences.private-given-text',NULL,'unicode','[Living]'); +INSERT INTO "grampsdb_config" VALUES(45,'plugin.hiddenplugins',NULL,'list','[''htmlview'']'); +INSERT INTO "grampsdb_config" VALUES(46,'plugin.addonplugins',NULL,'list','[]'); +INSERT INTO "grampsdb_config" VALUES(47,'researcher.researcher-locality',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(48,'researcher.researcher-country',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(49,'researcher.researcher-name',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(50,'researcher.researcher-phone',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(51,'researcher.researcher-email',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(52,'researcher.researcher-state',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(53,'researcher.researcher-postal',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(54,'researcher.researcher-city',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(55,'researcher.researcher-addr',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(56,'export.proxy-order',NULL,'list','[[''privacy'', 0], [''living'', 0], [''person'', 0], [''note'', 0], [''reference'', 0]]'); +INSERT INTO "grampsdb_config" VALUES(57,'behavior.use-tips',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(58,'behavior.generation-depth',NULL,'int','15'); +INSERT INTO "grampsdb_config" VALUES(59,'behavior.last-check-for-updates',NULL,'str','1970/01/01'); +INSERT INTO "grampsdb_config" VALUES(60,'behavior.startup',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(61,'behavior.autoload',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(62,'behavior.pop-plugin-status',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(63,'behavior.do-not-show-previously-seen-updates',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(64,'behavior.check-for-updates',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(65,'behavior.recent-export-type',NULL,'int','1'); +INSERT INTO "grampsdb_config" VALUES(66,'behavior.addmedia-image-dir',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(67,'behavior.date-about-range',NULL,'int','50'); +INSERT INTO "grampsdb_config" VALUES(68,'behavior.date-after-range',NULL,'int','50'); +INSERT INTO "grampsdb_config" VALUES(69,'behavior.owner-warn',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(70,'behavior.date-before-range',NULL,'int','50'); +INSERT INTO "grampsdb_config" VALUES(71,'behavior.min-generation-years',NULL,'int','13'); +INSERT INTO "grampsdb_config" VALUES(72,'behavior.welcome',NULL,'int','100'); +INSERT INTO "grampsdb_config" VALUES(73,'behavior.max-sib-age-diff',NULL,'int','20'); +INSERT INTO "grampsdb_config" VALUES(74,'behavior.previously-seen-updates',NULL,'list','[]'); +INSERT INTO "grampsdb_config" VALUES(75,'behavior.addmedia-relative-path',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(76,'behavior.spellcheck',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(77,'behavior.surname-guessing',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(78,'behavior.check-for-update-types',NULL,'list','[''new'']'); +INSERT INTO "grampsdb_config" VALUES(79,'behavior.avg-generation-gap',NULL,'int','20'); +INSERT INTO "grampsdb_config" VALUES(80,'behavior.database-path',NULL,'unicode','/home/dblank/.gramps/grampsdb'); +INSERT INTO "grampsdb_config" VALUES(81,'behavior.betawarn',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(82,'behavior.max-age-prob-alive',NULL,'int','110'); +INSERT INTO "grampsdb_config" VALUES(83,'behavior.web-search-url',NULL,'str','http://google.com/#&q=%(text)s'); +INSERT INTO "grampsdb_config" VALUES(84,'interface.family-height',NULL,'int','500'); +INSERT INTO "grampsdb_config" VALUES(85,'interface.sidebar-text',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(86,'interface.source-ref-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(87,'interface.address-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(88,'interface.mapservice',NULL,'str','OpenStreetMap'); +INSERT INTO "grampsdb_config" VALUES(89,'interface.pedview-layout',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(90,'interface.family-width',NULL,'int','700'); +INSERT INTO "grampsdb_config" VALUES(91,'interface.toolbar-on',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(92,'interface.citation-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(93,'interface.location-height',NULL,'int','250'); +INSERT INTO "grampsdb_config" VALUES(94,'interface.person-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(95,'interface.address-width',NULL,'int','650'); +INSERT INTO "grampsdb_config" VALUES(96,'interface.edit-rule-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(97,'interface.filter-editor-width',NULL,'int','400'); +INSERT INTO "grampsdb_config" VALUES(98,'interface.child-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(99,'interface.person-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(100,'interface.repo-width',NULL,'int','650'); +INSERT INTO "grampsdb_config" VALUES(101,'interface.pedview-tree-size',NULL,'int','5'); +INSERT INTO "grampsdb_config" VALUES(102,'interface.citation-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(103,'interface.edit-rule-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(104,'interface.place-width',NULL,'int','650'); +INSERT INTO "grampsdb_config" VALUES(105,'interface.place-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(106,'interface.source-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(107,'interface.repo-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(108,'interface.source-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(109,'interface.clipboard-height',NULL,'int','300'); +INSERT INTO "grampsdb_config" VALUES(110,'interface.fullscreen',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(111,'interface.attribute-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(112,'interface.lds-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(113,'interface.edit-filter-width',NULL,'int','500'); +INSERT INTO "grampsdb_config" VALUES(114,'interface.clipboard-width',NULL,'int','300'); +INSERT INTO "grampsdb_config" VALUES(115,'interface.media-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(116,'interface.person-ref-height',NULL,'int','350'); +INSERT INTO "grampsdb_config" VALUES(117,'interface.citation-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(118,'interface.person-width',NULL,'int','750'); +INSERT INTO "grampsdb_config" VALUES(119,'interface.lds-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(120,'interface.name-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(121,'interface.event-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(122,'interface.child-ref-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(123,'interface.filter',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(124,'interface.view',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(125,'interface.media-ref-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(126,'interface.family-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(127,'interface.pedview-show-marriage',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(128,'interface.height',NULL,'int','500'); +INSERT INTO "grampsdb_config" VALUES(129,'interface.media-width',NULL,'int','650'); +INSERT INTO "grampsdb_config" VALUES(130,'interface.event-ref-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(131,'interface.repo-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(132,'interface.media-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(133,'interface.width',NULL,'int','775'); +INSERT INTO "grampsdb_config" VALUES(134,'interface.size-checked',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(135,'interface.media-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(136,'interface.source-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(137,'interface.surname-box-height',NULL,'int','150'); +INSERT INTO "grampsdb_config" VALUES(138,'interface.repo-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(139,'interface.name-height',NULL,'int','350'); +INSERT INTO "grampsdb_config" VALUES(140,'interface.event-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(141,'interface.note-width',NULL,'int','700'); +INSERT INTO "grampsdb_config" VALUES(142,'interface.statusbar',NULL,'int','1'); +INSERT INTO "grampsdb_config" VALUES(143,'interface.person-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(144,'interface.note-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(145,'interface.view-categories',NULL,'list','[''Gramplets'', ''People'', ''Relationships'', ''Families'', ''Ancestry'', ''Events'', ''Places'', ''Geography'', ''Sources'', ''Citations'', ''Repositories'', ''Media'', ''Notes'']'); +INSERT INTO "grampsdb_config" VALUES(146,'interface.repo-ref-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(147,'interface.event-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(148,'interface.note-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(149,'interface.person-height',NULL,'int','550'); +INSERT INTO "grampsdb_config" VALUES(150,'interface.repo-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(151,'interface.attribute-height',NULL,'int','350'); +INSERT INTO "grampsdb_config" VALUES(152,'interface.event-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(153,'interface.source-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(154,'interface.edit-filter-height',NULL,'int','420'); +INSERT INTO "grampsdb_config" VALUES(155,'interface.pedview-tree-direction',NULL,'int','2'); +INSERT INTO "grampsdb_config" VALUES(156,'interface.family-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(157,'interface.source-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(158,'interface.url-height',NULL,'int','150'); +INSERT INTO "grampsdb_config" VALUES(159,'interface.filter-editor-height',NULL,'int','350'); +INSERT INTO "grampsdb_config" VALUES(160,'interface.media-ref-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(161,'interface.pedview-show-unknown-people',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(162,'interface.location-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(163,'interface.place-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(164,'interface.citation-sel-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(165,'interface.pedview-show-images',NULL,'bool','True'); +INSERT INTO "grampsdb_config" VALUES(166,'interface.url-width',NULL,'int','600'); +INSERT INTO "grampsdb_config" VALUES(167,'interface.event-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(168,'interface.note-height',NULL,'int','500'); +INSERT INTO "grampsdb_config" VALUES(169,'interface.open-with-default-viewer',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(170,'interface.place-sel-height',NULL,'int','450'); +INSERT INTO "grampsdb_config" VALUES(171,'interface.dont-ask',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(172,'geography.map',NULL,'str','person'); +INSERT INTO "grampsdb_config" VALUES(173,'geography.zoom_when_center',NULL,'int','12'); +INSERT INTO "grampsdb_config" VALUES(174,'geography.center-lon',NULL,'float','0.0'); +INSERT INTO "grampsdb_config" VALUES(175,'geography.show_cross',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(176,'geography.zoom',NULL,'int','0'); +INSERT INTO "grampsdb_config" VALUES(177,'geography.map_service',NULL,'int','1'); +INSERT INTO "grampsdb_config" VALUES(178,'geography.lock',NULL,'bool','False'); +INSERT INTO "grampsdb_config" VALUES(179,'geography.path',NULL,'str',''); +INSERT INTO "grampsdb_config" VALUES(180,'geography.center-lat',NULL,'float','0.0'); CREATE TABLE "grampsdb_tag" ( "id" integer NOT NULL PRIMARY KEY, "handle" varchar(19) NOT NULL UNIQUE, @@ -653,23 +853,41 @@ CREATE TABLE "grampsdb_tag" ( "color" varchar(13), "priority" integer ); -CREATE TABLE "grampsdb_person_families" ( +CREATE TABLE "grampsdb_personfamilyorder" ( "id" integer NOT NULL PRIMARY KEY, "person_id" integer NOT NULL, "family_id" integer NOT NULL, - UNIQUE ("person_id", "family_id") + "order" integer unsigned NOT NULL ); -CREATE TABLE "grampsdb_person_tags" ( +CREATE TABLE "grampsdb_personparentfamilyorder" ( + "id" integer NOT NULL PRIMARY KEY, + "person_id" integer NOT NULL, + "family_id" integer NOT NULL, + "order" integer unsigned NOT NULL +); +CREATE TABLE "grampsdb_persontag" ( "id" integer NOT NULL PRIMARY KEY, "person_id" integer NOT NULL, "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), - UNIQUE ("person_id", "tag_id") + "order" integer unsigned NOT NULL ); -CREATE TABLE "grampsdb_person_parent_families" ( +CREATE TABLE "grampsdb_familytag" ( "id" integer NOT NULL PRIMARY KEY, - "person_id" integer NOT NULL, "family_id" integer NOT NULL, - UNIQUE ("person_id", "family_id") + "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), + "order" integer unsigned NOT NULL +); +CREATE TABLE "grampsdb_mediatag" ( + "id" integer NOT NULL PRIMARY KEY, + "media_id" integer NOT NULL, + "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), + "order" integer unsigned NOT NULL +); +CREATE TABLE "grampsdb_notetag" ( + "id" integer NOT NULL PRIMARY KEY, + "note_id" integer NOT NULL, + "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), + "order" integer unsigned NOT NULL ); CREATE TABLE "grampsdb_person" ( "id" integer NOT NULL PRIMARY KEY, @@ -687,12 +905,6 @@ CREATE TABLE "grampsdb_person" ( "birth_ref_index" integer NOT NULL, "death_ref_index" integer NOT NULL ); -CREATE TABLE "grampsdb_family_tags" ( - "id" integer NOT NULL PRIMARY KEY, - "family_id" integer NOT NULL, - "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), - UNIQUE ("family_id", "tag_id") -); CREATE TABLE "grampsdb_family" ( "id" integer NOT NULL PRIMARY KEY, "handle" varchar(19) NOT NULL UNIQUE, @@ -799,12 +1011,6 @@ CREATE TABLE "grampsdb_place" ( "long" text NOT NULL, "lat" text NOT NULL ); -CREATE TABLE "grampsdb_media_tags" ( - "id" integer NOT NULL PRIMARY KEY, - "media_id" integer NOT NULL, - "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), - UNIQUE ("media_id", "tag_id") -); CREATE TABLE "grampsdb_media" ( "calendar" integer NOT NULL, "modifier" integer NOT NULL, @@ -832,12 +1038,6 @@ CREATE TABLE "grampsdb_media" ( "mime" text, "desc" text NOT NULL ); -CREATE TABLE "grampsdb_note_tags" ( - "id" integer NOT NULL PRIMARY KEY, - "note_id" integer NOT NULL, - "tag_id" integer NOT NULL REFERENCES "grampsdb_tag" ("id"), - UNIQUE ("note_id", "tag_id") -); CREATE TABLE "grampsdb_note" ( "id" integer NOT NULL PRIMARY KEY, "handle" varchar(19) NOT NULL UNIQUE, @@ -1127,8 +1327,10 @@ INSERT INTO "grampsdb_report" VALUES(14,'R0014','simple_book_title','simple_book INSERT INTO "grampsdb_report" VALUES(15,'R0015','summary','summary','report',NULL); INSERT INTO "grampsdb_report" VALUES(16,'R0016','Export','gedcom_export','export','off=ged'); INSERT INTO "grampsdb_report" VALUES(17,'R0017','Gramps XML Export','ex_gpkg','export','off=gramps'); -INSERT INTO "grampsdb_report" VALUES(18,'R0018','Import','im_ged','import','iff=ged i=http://arborvita.free.fr/Kennedy/Kennedy.ged'); -INSERT INTO "grampsdb_report" VALUES(19,'R0019','Gramps package (portable XML) Import','im_gpkg','import','iff=gramps i=http://gramps.svn.sourceforge.net/viewvc/gramps/trunk/example/gramps/example.gramps?revision=18333'); +INSERT INTO "grampsdb_report" VALUES(18,'R0018','Import','im_ged','import','iff=ged +i=http://arborvita.free.fr/Kennedy/Kennedy.ged'); +INSERT INTO "grampsdb_report" VALUES(19,'R0019','Gramps package (portable XML) Import','im_gpkg','import','iff=gramps +i=http://gramps.svn.sourceforge.net/viewvc/gramps/trunk/example/gramps/example.gramps'); CREATE TABLE "grampsdb_result" ( "id" integer NOT NULL PRIMARY KEY, "name" text, @@ -1155,17 +1357,21 @@ CREATE INDEX "django_session_3da3d3d8" ON "django_session" ("expire_date"); CREATE INDEX "django_admin_log_403f60f" ON "django_admin_log" ("user_id"); CREATE INDEX "django_admin_log_1bb8f392" ON "django_admin_log" ("content_type_id"); CREATE INDEX "grampsdb_profile_71d2bf68" ON "grampsdb_profile" ("theme_type_id"); -CREATE INDEX "grampsdb_person_families_21b911c5" ON "grampsdb_person_families" ("person_id"); -CREATE INDEX "grampsdb_person_families_330df8aa" ON "grampsdb_person_families" ("family_id"); -CREATE INDEX "grampsdb_person_tags_21b911c5" ON "grampsdb_person_tags" ("person_id"); -CREATE INDEX "grampsdb_person_tags_3747b463" ON "grampsdb_person_tags" ("tag_id"); -CREATE INDEX "grampsdb_person_parent_families_21b911c5" ON "grampsdb_person_parent_families" ("person_id"); -CREATE INDEX "grampsdb_person_parent_families_330df8aa" ON "grampsdb_person_parent_families" ("family_id"); +CREATE INDEX "grampsdb_personfamilyorder_21b911c5" ON "grampsdb_personfamilyorder" ("person_id"); +CREATE INDEX "grampsdb_personfamilyorder_330df8aa" ON "grampsdb_personfamilyorder" ("family_id"); +CREATE INDEX "grampsdb_personparentfamilyorder_21b911c5" ON "grampsdb_personparentfamilyorder" ("person_id"); +CREATE INDEX "grampsdb_personparentfamilyorder_330df8aa" ON "grampsdb_personparentfamilyorder" ("family_id"); +CREATE INDEX "grampsdb_persontag_21b911c5" ON "grampsdb_persontag" ("person_id"); +CREATE INDEX "grampsdb_persontag_3747b463" ON "grampsdb_persontag" ("tag_id"); +CREATE INDEX "grampsdb_familytag_330df8aa" ON "grampsdb_familytag" ("family_id"); +CREATE INDEX "grampsdb_familytag_3747b463" ON "grampsdb_familytag" ("tag_id"); +CREATE INDEX "grampsdb_mediatag_11f50c51" ON "grampsdb_mediatag" ("media_id"); +CREATE INDEX "grampsdb_mediatag_3747b463" ON "grampsdb_mediatag" ("tag_id"); +CREATE INDEX "grampsdb_notetag_14a186ec" ON "grampsdb_notetag" ("note_id"); +CREATE INDEX "grampsdb_notetag_3747b463" ON "grampsdb_notetag" ("tag_id"); CREATE INDEX "grampsdb_person_79775e9" ON "grampsdb_person" ("gender_type_id"); CREATE INDEX "grampsdb_person_3a672176" ON "grampsdb_person" ("birth_id"); CREATE INDEX "grampsdb_person_bf9c6d5" ON "grampsdb_person" ("death_id"); -CREATE INDEX "grampsdb_family_tags_330df8aa" ON "grampsdb_family_tags" ("family_id"); -CREATE INDEX "grampsdb_family_tags_3747b463" ON "grampsdb_family_tags" ("tag_id"); CREATE INDEX "grampsdb_family_656bfb9c" ON "grampsdb_family" ("father_id"); CREATE INDEX "grampsdb_family_3800eb51" ON "grampsdb_family" ("mother_id"); CREATE INDEX "grampsdb_family_75e9c8a0" ON "grampsdb_family" ("family_rel_type_id"); @@ -1173,10 +1379,6 @@ CREATE INDEX "grampsdb_citation_7607617b" ON "grampsdb_citation" ("source_id"); CREATE INDEX "grampsdb_event_349f2f81" ON "grampsdb_event" ("event_type_id"); CREATE INDEX "grampsdb_event_3bc6e294" ON "grampsdb_event" ("place_id"); CREATE INDEX "grampsdb_repository_5f9de118" ON "grampsdb_repository" ("repository_type_id"); -CREATE INDEX "grampsdb_media_tags_11f50c51" ON "grampsdb_media_tags" ("media_id"); -CREATE INDEX "grampsdb_media_tags_3747b463" ON "grampsdb_media_tags" ("tag_id"); -CREATE INDEX "grampsdb_note_tags_14a186ec" ON "grampsdb_note_tags" ("note_id"); -CREATE INDEX "grampsdb_note_tags_3747b463" ON "grampsdb_note_tags" ("tag_id"); CREATE INDEX "grampsdb_note_71afbcea" ON "grampsdb_note" ("note_type_id"); CREATE INDEX "grampsdb_surname_5489fd8b" ON "grampsdb_surname" ("name_origin_type_id"); CREATE INDEX "grampsdb_surname_632e075f" ON "grampsdb_surname" ("name_id"); diff --git a/src/webapp/grampsdb/models.py b/src/webapp/grampsdb/models.py index fc80237b5..690b50763 100644 --- a/src/webapp/grampsdb/models.py +++ b/src/webapp/grampsdb/models.py @@ -459,6 +459,26 @@ class PrimaryObject(models.Model): return "/%s/%s" % (self.__class__.__name__.lower(), self.handle) +class PersonTag(models.Model): + person = models.ForeignKey("Person") + tag = models.ForeignKey("Tag") + order = models.PositiveIntegerField(default=1) + +class FamilyTag(models.Model): + family = models.ForeignKey("Family") + tag = models.ForeignKey("Tag") + order = models.PositiveIntegerField(default=1) + +class MediaTag(models.Model): + media = models.ForeignKey("Media") + tag = models.ForeignKey("Tag") + order = models.PositiveIntegerField(default=1) + +class NoteTag(models.Model): + note = models.ForeignKey("Note") + tag = models.ForeignKey("Tag") + order = models.PositiveIntegerField(default=1) + class Person(PrimaryObject): """ The model for the person object @@ -479,7 +499,7 @@ class Person(PrimaryObject): birth_ref_index = models.IntegerField("Birth Reference Index", default=-1) death_ref_index = models.IntegerField("Death Reference Index", default=-1) - tags = models.ManyToManyField('Tag', blank=True, null=True) + tags = models.ManyToManyField('Tag', blank=True, null=True, through="PersonTag") # Others keys here: # .name_set @@ -508,7 +528,7 @@ class Family(PrimaryObject): mother = models.ForeignKey('Person', related_name="mother_ref", null=True, blank=True) family_rel_type = models.ForeignKey('FamilyRelType', verbose_name="Type") - tags = models.ManyToManyField('Tag', blank=True, null=True) + tags = models.ManyToManyField('Tag', blank=True, null=True, through="FamilyTag") def make_tag_list(self): return tuple() @@ -603,7 +623,7 @@ class Media(DateObject, PrimaryObject): references = generic.GenericRelation('MediaRef', related_name="refs", content_type_field="object_type", object_id_field="object_id") - tags = models.ManyToManyField('Tag', blank=True, null=True) + tags = models.ManyToManyField('Tag', blank=True, null=True, through="MediaTag") def make_tag_list(self): return tuple() @@ -618,7 +638,7 @@ class Note(PrimaryObject): references = generic.GenericRelation('NoteRef', related_name="refs", content_type_field="object_type", object_id_field="object_id") - tags = models.ManyToManyField('Tag', blank=True, null=True) + tags = models.ManyToManyField('Tag', blank=True, null=True, through="NoteTag") def make_tag_list(self): return tuple() @@ -1022,6 +1042,12 @@ TABLES = [ ("ref", PersonRef), ("ref", ChildRef), ("ref", MediaRef), + ("ref", PersonFamilyOrder), + ("ref", PersonParentFamilyOrder), + ("ref", PersonTag), + ("ref", FamilyTag), + ("ref", MediaTag), + ("ref", NoteTag), ("system", Config), ("system", Report), ("system", Result), diff --git a/src/webapp/grampsdb/view/family.py b/src/webapp/grampsdb/view/family.py index 832742cd9..b3f27d7d9 100644 --- a/src/webapp/grampsdb/view/family.py +++ b/src/webapp/grampsdb/view/family.py @@ -70,7 +70,10 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa ref_obj = Family.objects.get(handle=ref_handle) if item == "child": dji.add_child_ref_default(ref_obj, person) # add person to family - person.parent_families.add(ref_obj) # add family to child + #person.parent_families.add(ref_obj) # add family to child + pfo = PersonParentFamilyOrder(person=person, family=ref_obj, + order=len(person.parent_families.all())+1) + pfo.save() elif item == "spouse": if person.gender_type.name == "Female": ref_obj.mother = person @@ -78,7 +81,10 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa ref_obj.father = person else: ref_obj.father = person # FIXME: Unknown gender, add to open - person.families.add(ref_obj) # add family to person + #person.families.add(ref_obj) # add family to person + pfo = PersonFamilyOrder(person=person, family=ref_obj, + order=len(person.families.all())+1) + pfo.save() ref_obj.save() person.save() dji.rebuild_cache(person) # rebuild child @@ -125,10 +131,16 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa # FIXME: remove family from previous mother/father? if family.mother: if family not in family.mother.families.all(): - family.mother.families.add(family) + #family.mother.families.add(family) + pfo = PersonFamilyOrder(person=family.mother, family=family, + order=len(family.mother.families.all())+1) + pfo.save() if family.father: if family not in family.father.families.all(): - family.father.families.add(family) + #family.father.families.add(family) + pfo = PersonFamilyOrder(person=family.father, family=family, + order=len(family.father.families.all())+1) + pfo.save() dji.rebuild_cache(family) act = "view" else: @@ -146,17 +158,26 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa # FIXME: remove family from previous mother/father? if family.mother: if family not in family.mother.families.all(): - family.mother.families.add(family) + #family.mother.families.add(family) + pfo = PersonFamilyOrder(person=family.mother, family=family, + order=len(family.mother.families.all())+1) + pfo.save() if family.father: if family not in family.father.families.all(): - family.father.families.add(family) + #family.father.families.add(family) + pfo = PersonFamilyOrder(person=family.father, family=family, + order=len(family.father.families.all())+1) + pfo.save() dji.rebuild_cache(family) if add_to: # add child or spouse to family item, handle = add_to person = Person.objects.get(handle=handle) if item == "child": dji.add_child_ref_default(family, person) # add person to family - person.parent_families.add(family) # add family to child + #person.parent_families.add(family) # add family to child + pfo = PersonParentFamilyOrder(person=person, family=family, + order=len(person.parent_families.all())+1) + pfo.save() elif item == "spouse": if person.gender_type.name == "Female": family.mother = person @@ -164,7 +185,10 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa family.father = person else: family.father = person # FIXME: Unknown gender, add to open - person.families.add(family) # add family to person + #person.families.add(family) # add family to person + pfo = PersonFamilyOrder(person=person, family=family, + order=len(person.families.all())+1) + pfo.save() family.save() person.save() dji.rebuild_cache(person) # rebuild child diff --git a/src/webapp/grampsdb/views.py b/src/webapp/grampsdb/views.py index 8a096cc15..5c68b649b 100644 --- a/src/webapp/grampsdb/views.py +++ b/src/webapp/grampsdb/views.py @@ -193,7 +193,7 @@ def process_report_run(request, handle): args = {"off": "pdf", "iff": "ged"} # basic defaults # override from given defaults in table: if report.options: - for pair in str(report.options).split(" "): + for pair in str(report.options).split("\\n"): if "=" in pair: key, value = [x.strip() for x in pair.split("=", 1)] if key and value: @@ -539,8 +539,8 @@ def action(request, view, handle, act, add_to=None): raise Http404(_("Requested %s does not exist.") % view) override = {} if obj.options: - for pair in obj.options.split(" "): - key, value = pair.split("=") + for pair in obj.options.split("\\n"): + key, value = pair.split("=", 1) override[key] = value db = DbDjango() opt_default, opt_help = get_plugin_options(db, obj.handle) @@ -601,7 +601,7 @@ def build_person_query(request, search): """ protect = not request.user.is_authenticated() ### Build the order: - terms = ["surname", "given"] + terms = ["surname", "given", "tag"] if protect: # Do this to get the names sorted by private/alive query = Q(private=False) & Q(person__private=False) @@ -659,6 +659,8 @@ def build_person_query(request, search): query &= build_string_query("person__gramps_id", value, exact, startswith, endswith) elif field == "gender": query &= Q(person__gender_type__name=value.title()) + elif field == "tag": + query &= build_string_query("person__tags__name", value, exact, startswith, endswith) else: make_message(request, "Invalid query field '%s'" % field) else: # no search fields, just raw search @@ -683,7 +685,7 @@ def build_family_query(request, search): Build and return a Django QuerySet and sort order for the Family table. """ - terms = ["father", "mother", "id", "type", "surnames", "father.name.first_name", "mother.name.first_name"] + terms = ["father", "mother", "id", "type", "surnames", "father.name.first_name", "mother.name.first_name", "tag"] protect = not request.user.is_authenticated() if protect: query = (Q(private=False) & Q(father__private=False) & @@ -736,6 +738,8 @@ def build_family_query(request, search): query &= build_string_query("family_rel_type__name", value, exact, startswith, endswith) elif field == "id": query &= build_string_query("gramps_id", value, exact, startswith, endswith) + elif field == "tag": + query &= build_string_query("tags__name", value, exact, startswith, endswith) else: make_message(request, message="Invalid query field '%s'" % field) else: # no search fields, just raw search @@ -755,7 +759,7 @@ def build_family_query(request, search): return query, order, terms def build_media_query(request, search): - terms = ["id", "path", "description", "mime"] + terms = ["id", "path", "description", "mime", "tag"] protect = not request.user.is_authenticated() if protect: query = Q(private=False) # general privacy @@ -795,6 +799,8 @@ def build_media_query(request, search): query &= build_string_query("desc", value, exact, startswith, endswith) elif field == "mime": query &= build_string_query("mime", value, exact, startswith, endswith) + elif field == "tag": + query &= build_string_query("tags__name", value, exact, startswith, endswith) else: request.user.message_set.create(message="Invalid query field '%s'" % field) else: # no search fields, just raw search @@ -813,7 +819,7 @@ def build_media_query(request, search): return query, order, terms def build_note_query(request, search): - terms = ["id", "type", "text"] + terms = ["id", "type", "text", "tag"] protect = not request.user.is_authenticated() if protect: query = Q(private=False) # general privacy @@ -851,6 +857,8 @@ def build_note_query(request, search): query &= build_string_query("note_type__name", value, exact, startswith, endswith) elif field == "text": query &= build_string_query("text", value, exact, startswith, endswith) + elif field == "tag": + query &= build_string_query("tags__name", value, exact, startswith, endswith) else: request.user.message_set.create(message="Invalid query field '%s'" % field) else: # no search fields, just raw search @@ -1311,6 +1319,8 @@ def process_list_item(request, view, handle, act, item, index): "attribute": "#tab-attributes", "media": "#tab-media", "lds": "#tab-lds", + "parentfamily": "#tab-references", + "family": "#tab-references", } if view == "person": obj = dji.Person.get(handle=handle) @@ -1328,6 +1338,10 @@ def process_list_item(request, view, handle, act, item, index): elif item == "citationref": refs = dji.CitationRef.filter(object_id=obj.id, object_type=obj_type).order_by("order") + elif item == "parentfamily": + refs = dji.PersonParentFamilyOrder.filter(person=obj).order_by("order") + elif item == "family": + refs = dji.PersonFamilyOrder.filter(person=obj).order_by("order") # Next, perform action: if act == "remove": count = 1 diff --git a/src/webapp/init.py b/src/webapp/init.py index 0766eb0e5..6ecc306f9 100644 --- a/src/webapp/init.py +++ b/src/webapp/init.py @@ -143,12 +143,12 @@ for table, entries in [("grampsdb.config", (("name", '"Import"'), ('gramps_id', '"R0018"'), ("handle", '"im_ged"'), - ("options", '"iff=ged i=http://arborvita.free.fr/Kennedy/Kennedy.ged"'), + ("options", '"iff=ged\\ni=http://arborvita.free.fr/Kennedy/Kennedy.ged"'), ("report_type", '"import"')), (("name", '"Gramps package (portable XML) Import"'), ('gramps_id', '"R0019"'), ("handle", '"im_gpkg"'), - ("options", '"iff=gramps i=http://gramps.svn.sourceforge.net/viewvc/gramps/trunk/example/gramps/example.gramps?revision=18333"'), + ("options", '"iff=gramps\\ni=http://gramps.svn.sourceforge.net/viewvc/gramps/trunk/example/gramps/example.gramps"'), ("report_type", '"import"')), ])]: entry_count = 0 diff --git a/src/webapp/libdjango.py b/src/webapp/libdjango.py index 703f30b19..24c0d061a 100644 --- a/src/webapp/libdjango.py +++ b/src/webapp/libdjango.py @@ -31,15 +31,23 @@ import sys import cPickle import base64 +#------------------------------------------------------------------------ +# +# Django Modules +# +#------------------------------------------------------------------------ +from django.contrib.contenttypes.models import ContentType +from django.db import transaction + #------------------------------------------------------------------------ # # Gramps Modules # #------------------------------------------------------------------------ import webapp.grampsdb.models as models -from django.contrib.contenttypes.models import ContentType import webapp import gen +from gen.utils.id import create_id # To get a django person from a django database: # djperson = dji.Person.get(handle='djhgsdh324hjg234hj24') @@ -259,10 +267,12 @@ class DjangoInterface(object): return map(self.pack_event_ref, eventrefs) def get_family_list(self, person): # person has families - return [fam.handle for fam in person.families.all()] + return [fam.family.handle for fam in + self.PersonFamilyOrder.filter(person=person).order_by("order")] - def get_parent_family_list(self, person): - return [fam.handle for fam in person.parent_families.all()] + def get_parent_family_list(self, person): # person's parents has families + return [fam.family.handle for fam in + self.PersonParentFamilyOrder.filter(person=person).order_by("order")] def get_person_ref_list(self, person): obj_type = ContentType.objects.get_for_model(person) @@ -715,6 +725,44 @@ class DjangoInterface(object): for attribute_data in attribute_list: self.add_attribute(obj, attribute_data) + def add_tag_list(self, otype, obj, tag_list): + for tag_handle in tag_list: + try: + tag = models.Tag.objects.get(handle=tag_handle) + except: + print >> sys.stderr, ("ERROR: Tag does not exist: '%s'" % + tag_handle) + self.add_tag_to_obj(otype, obj, tag) + + def add_tag_to_obj(self, field, obj, tag): + if field == "person": + tagref = models.PersonTag( + person=obj, + tag=tag, + order=len(models.PersonTag.objects.filter(person=obj)) + 1) + tagref.save() + elif field == "family": + tagref = models.FamilyTag( + family=obj, + tag=tag, + order=len(models.FamilyTag.objects.filter(family=obj)) + 1) + tagref.save() + elif field == "media": + tagref = models.MediaTag( + media=obj, + tag=tag, + order=len(models.MediaTag.objects.filter(media=obj)) + 1) + tagref.save() + elif field == "note": + tagref = models.NoteTag( + note=obj, + tag=tag, + order=len(models.NoteTag.objects.filter(note=obj)) + 1) + tagref.save() + else: + raise AttributeError("invalid field '%s' to attach tag" % + field) + def add_url_list(self, field, obj, url_list): if not url_list: return None count = 1 @@ -883,6 +931,7 @@ class DjangoInterface(object): return citation.source = source self.add_date(citation, date) + citation.cache = self.encode_raw(citation_data) citation.save() self.add_note_list(citation, note_list) self.add_media_ref_list(citation, media_list) @@ -992,7 +1041,10 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Family does not exist: '%s'" % handle) return - obj.families.add(family) + #obj.families.add(family) + pfo = models.PersonFamilyOrder(person=obj, family=family, + order=len(self.PersonFamilyOrder.filter(person=obj)) + 1) + pfo.save() obj.save() ## Export individual objects: @@ -1124,7 +1176,10 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Family does not exist: '%s'" % parent_family_handle) return - person.parent_families.add(family) + #person.parent_families.add(family) + pfo = models.PersonParentFamilyOrder(person=person, family=family, + order=len(self.PersonParentFamilyOrder.filter(person=person)) + 1) + pfo.save() person.save() def add_date(self, obj, date): @@ -1269,6 +1324,7 @@ class DjangoInterface(object): self.add_citation_list(person, pcitation_list) self.add_address_list("person", person, address_list) self.add_lds_list("person", person, lds_ord_list) + self.add_tag_list("person", person, tag_list) # set person.birth and birth.death to correct events: obj_type = ContentType.objects.get_for_model(person) @@ -1289,14 +1345,18 @@ class DjangoInterface(object): if events: person.death = events[0].ref_object person.death_ref_index = lookup_role_index(models.EventType.DEATH, all_events) + person.cache = self.encode_raw(data) person.save() return person def add_note_detail(self, data): - """ - Dummy method for consistency with other two-pass adds. - """ - pass + # Unpack from the BSDDB: + (handle, gid, styled_text, format, note_type, + change, tag_list, private) = data + note = models.Note.objects.get(handle=handle) + note.cache = self.encode_raw(data) + note.save() + self.add_tag_list("note", note, tag_list) def save_note_markup(self, note, markup_list): # delete any prexisting markup: @@ -1372,6 +1432,7 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Mother does not exist: '%s'" % mother_handle) family.mother = None + family.cache = self.encode_raw(data) family.save() self.add_child_ref_list(family, child_ref_list) self.add_note_list(family, note_list) @@ -1380,6 +1441,7 @@ class DjangoInterface(object): self.add_media_ref_list(family, media_list) self.add_event_ref_list(family, event_ref_list) self.add_lds_list("family", family, lds_seal_list) + self.add_tag_list("family", family, tag_list) def add_source(self, data): (handle, gid, title, @@ -1411,6 +1473,8 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Source does not exist: '%s'" % handle) return + source.cache = self.encode_raw(data) + source.save() self.add_note_list(source, note_list) self.add_media_ref_list(source, media_list) self.add_source_datamap_dict(source, datamap) @@ -1438,6 +1502,8 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Repository does not exist: '%s'" % handle) return + repository.cache = self.encode_raw(data) + repository.save() self.add_note_list(repository, note_list) self.add_url_list("repository", repository, url_list) self.add_address_list("repository", repository, address_list) @@ -1507,6 +1573,8 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Place does not exist: '%s'" % handle) return + place.cache = self.encode_raw(data) + place.save() self.add_url_list("place", place, url_list) self.add_media_ref_list(place, media_list) self.add_citation_list(place, citation_list) @@ -1517,8 +1585,29 @@ class DjangoInterface(object): self.add_location("place", place, loc_data, count) count + 1 + def add_tag_detail(self, data): + (handle, + name, + color, + priority, + change) = data + tag = models.Tag.objects.get(handle=handle) + tag.cache = self.encode_raw(data) + tag.save() + def add_tag(self, data): - print "FIXME: libdjango.add_tag()" + (handle, + name, + color, + priority, + change) = data + tag = models.Tag(handle=handle, + gramps_id=create_id(), + name=name, + color=color, + priority=priority, + last_changed=todate(change)) + tag.save() def add_media(self, data): (handle, gid, path, mime, desc, @@ -1552,9 +1641,12 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Media does not exist: '%s'" % handle) return + media.cache = self.encode_raw(data) + media.save() self.add_note_list(media, note_list) self.add_citation_list(media, citation_list) self.add_attribute_list(media, attribute_list) + self.add_tag_list("media", media, tag_list) def add_event(self, data): (handle, gid, the_type, date, description, place_handle, @@ -1580,6 +1672,8 @@ class DjangoInterface(object): print >> sys.stderr, ("ERROR: Event does not exist: '%s'" % handle) return + event.cache = self.encode_raw(data) + event.save() self.add_place_ref(event, place_handle) self.add_note_list(event, note_list) self.add_attribute_list(event, attribute_list) @@ -1616,17 +1710,26 @@ class DjangoInterface(object): """ Resets the cache version of an object, but doesn't save it to the database. """ + item.cache = self.get_cache(item) + + def encode_raw(self, raw): + return base64.encodestring(cPickle.dumps(raw)) + + def get_cache(self, item): + """ + Gets the cache version of an object. + """ raw = self.get_raw(item) - item.cache = base64.encodestring(cPickle.dumps(raw)) + return base64.encodestring(cPickle.dumps(raw)) def rebuild_cache(self, item): """ Resets the cache version of an object, and saves it to the database. """ - raw = self.get_raw(item) - item.cache = base64.encodestring(cPickle.dumps(raw)) + self.reset_cache(item) item.save() + @transaction.commit_on_success def rebuild_caches(self, callback=None): """ Call this to rebuild the caches for all primary models. @@ -1643,63 +1746,153 @@ class DjangoInterface(object): self.Repository.all().count() + self.Place.all().count() + self.Media.all().count() + - self.Source.all().count()) + self.Source.all().count() + + self.Citation.all().count() + + self.Tag.all().count()) for item in self.Person.all(): raw = self.get_person(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Family.all(): raw = self.get_family(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Source.all(): raw = self.get_source(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Event.all(): raw = self.get_event(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Repository.all(): raw = self.get_repository(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Place.all(): raw = self.get_place(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) for item in self.Media.all(): raw = self.get_media(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) - for item in self.Note.all(): - raw = self.get_note(item) + for item in self.Citation.all(): + raw = self.get_citation(item) item.cache = base64.encodestring(cPickle.dumps(raw)) item.save() - callback(100 * count/total) count += 1 + callback(100 * (count/total if total else 0)) + for item in self.Tag.all(): + raw = self.get_tag(item) + item.cache = base64.encodestring(cPickle.dumps(raw)) + item.save() + count += 1 + callback(100) + + def check_caches(self, callback=None): + """ + Call this to check the caches for all primary models. + """ + if not callable(callback): + callback = lambda (percent): None # dummy + + callback(0) + count = 0.0 + total = (self.Note.all().count() + + self.Person.all().count() + + self.Event.all().count() + + self.Family.all().count() + + self.Repository.all().count() + + self.Place.all().count() + + self.Media.all().count() + + self.Source.all().count() + + self.Citation.all().count() + + self.Tag.all().count()) + + for item in self.Person.all(): + raw = self.get_person(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Family.all(): + raw = self.get_family(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Source.all(): + raw = self.get_source(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Event.all(): + raw = self.get_event(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Repository.all(): + raw = self.get_repository(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Place.all(): + raw = self.get_place(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Media.all(): + raw = self.get_media(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Citation.all(): + raw = self.get_citation(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 + callback(100 * (count/total if total else 0)) + + for item in self.Tag.all(): + raw = self.get_tag(item) + if item.cache == base64.encodestring(cPickle.dumps(raw)): + print "Different!", item + count += 1 callback(100) diff --git a/src/webapp/reports.py b/src/webapp/reports.py index 385fedda6..e8020ba04 100644 --- a/src/webapp/reports.py +++ b/src/webapp/reports.py @@ -83,9 +83,9 @@ def import_file(db, filename, user): etype, exception, traceback = error_tuple print "ERROR:", name, exception return False - retval = import_function = getattr(mod, pdata.import_function) + import_function = getattr(mod, pdata.import_function) db.prepare_import() - import_function(db, filename, user) + retval = import_function(db, filename, user) db.commit_import() # FIXME: need to call probably_alive for person in Person.objects.all(): diff --git a/src/webapp/utils.py b/src/webapp/utils.py index 446a35fb7..f44cc49ab 100644 --- a/src/webapp/utils.py +++ b/src/webapp/utils.py @@ -68,6 +68,8 @@ from cli.grampscli import CLIManager _ = lambda msg: msg +TAB_HEIGHT = 200 + util_filters = [ 'nbsp', 'date_as_text', @@ -200,7 +202,7 @@ class Table(object): >>> table.row("4", "5", "6") >>> table.get_html() """ - def __init__(self, id): + def __init__(self, id, style=None): self.id = id # css id self.db = DbDjango() self.access = SimpleAccess(self.db) @@ -231,7 +233,7 @@ class Table(object): Html('div', class_="content", id=self.id, - style="overflow: auto; height:150px; background-color: #f4f0ec;")] + style=("overflow: auto; height:%spx; background-color: #f4f0ec;" % TAB_HEIGHT) if not style else style)] def columns(self, *args): self.table.columns(*args) @@ -249,12 +251,13 @@ class Table(object): self.table.set_link_col(links) def get_html(self): + retval = "" # The HTML writer escapes data: self.table.write(self.doc, self.column_widths) # forces to htmllist # FIXME: do once, or once per table? self.doc.doc.build_style_declaration(self.id) # can pass id, for whole # FIXME: don't want to repeat this, unless diff for each table: - retval = "" % self.doc.doc.style_declaration + retval += "" % self.doc.doc.style_declaration # We have a couple of HTML bits that we want to unescape: return retval + str(self.doc.doc.htmllist[0]).replace(" ", " ") @@ -686,24 +689,60 @@ def reference_table(obj, user, act, url=None, *args): return retval def person_reference_table(obj, user, act): - retval = "" - table = Table("person_reference_table") - table.columns( - _("Type"), + retval = """
""" % TAB_HEIGHT + text1 = "" + text2 = "" + table1 = Table("person_reference_table", style="background-color: #f4f0ec;") + table1.columns( + "As Spouse", + _("ID"), _("Reference"), - _("ID")) + ) + table1.column_widths = [10, 10, 82] + table2 = Table("person_reference_table", style="background-color: #f4f0ec;") + table2.columns( + "As Child", + _("ID"), + _("Reference"), + ) + table2.column_widths = [10, 10, 82] if user.is_authenticated() and act != "add": - for reference in obj.families.all(): - table.row( - _("Family (spouse in)"), + count = 1 + for through in models.PersonFamilyOrder.objects.filter(person=obj).order_by("order"): + reference = through.family + table1.row( + Link("[[x%d]][[^%d]][[v%d]]" % (count, count, count)) if user.is_superuser else "", + reference.gramps_id, reference, - reference.gramps_id) - for reference in obj.parent_families.all(): - table.row( - _("Family (child in)"), + ) + count += 1 + text1 += table1.get_html() + count = 1 + for through in models.PersonFamilyOrder.objects.filter(person=obj).order_by("order"): + reference = through.family + text1 = text1.replace("[[x%d]]" % count, make_button("x", "/person/%s/remove/family/%d" % (obj.handle, count))) + text1 = text1.replace("[[^%d]]" % count, make_button("^", "/person/%s/up/family/%d" % (obj.handle, count))) + text1 = text1.replace("[[v%d]]" % count, make_button("v", "/person/%s/down/family/%d" % (obj.handle, count))) + count += 1 + # Parent Families + count = 1 + for through in models.PersonParentFamilyOrder.objects.filter(person=obj).order_by("order"): + reference = through.family + table2.row( + Link("[[x%d]][[^%d]][[v%d]]" % (count, count, count)) if user.is_superuser else "", + reference.gramps_id, reference, - reference.gramps_id) - retval += table.get_html() + ) + text2 += table2.get_html() + count = 1 + for through in models.PersonParentFamilyOrder.objects.filter(person=obj).order_by("order"): + reference = through.family + text2 = text2.replace("[[x%d]]" % count, make_button("x", "/person/%s/remove/parentfamily/%d" % (obj.handle, count))) + text2 = text2.replace("[[^%d]]" % count, make_button("^", "/person/%s/up/parentfamily/%d" % (obj.handle, count))) + text2 = text2.replace("[[v%d]]" % count, make_button("v", "/person/%s/down/parentfamily/%d" % (obj.handle, count))) + count += 1 + + retval += text1 + text2 + "
" retval += make_button(_("Add as Spouse to New Family"), "/family/add/spouse/%s" % obj.handle) retval += make_button(_("Add as Spouse to Existing Family"),