big changes... big
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 20 Apr 2005 20:32:24 +0000 (20:32 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 20 Apr 2005 20:32:24 +0000 (20:32 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@520 dcc99617-32d9-48b4-a31d-7c20da2025e4

13 files changed:
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/asset.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/config.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/biblio.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/config.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
Open-ILS/src/sql/Postgres/002.schema.config.sql
Open-ILS/src/sql/Postgres/005.schema.actors.sql
Open-ILS/src/sql/Postgres/040.schema.asset.sql
Open-ILS/src/sql/Postgres/800.fkeys.sql

index e32d6e8..eb8e7b1 100644 (file)
@@ -280,6 +280,8 @@ sub modify_from_fieldmapper {
        actor::user->has_a( mailing_address => 'actor::user_address' );
        actor::user->has_a( billing_address => 'actor::user_address' );
        actor::user->has_a( ident_type => 'config::identification_type' );
+       actor::user->has_a( ident_type2 => 'config::identification_type' );
+       actor::user->has_a( net_access_level => 'config::net_access_level' );
 
        actor::user_address->has_a( usr => 'actor::user' );
        
@@ -303,6 +305,8 @@ sub modify_from_fieldmapper {
        asset::copy->has_a( call_number => 'asset::call_number' );
        asset::copy->has_a( creator => 'actor::user' );
        asset::copy->has_a( editor => 'actor::user' );
+       asset::copy->has_a( status => 'config::copy_status' );
+       asset::copy->has_a( location => 'asset::copy_location' );
 
        asset::call_number_note->has_a( owning_call_number => 'asset::call_number' );
 
index ec6c8af..6701117 100644 (file)
@@ -14,6 +14,8 @@ __PACKAGE__->columns( Essential => qw/usrid usrname email first_given_name
                                second_given_name family_name billing_address
                                claims_returned_count home_ou gender dob
                                active master_account ident_type ident_value
+                               ident_type2 ident_value2 net_access_level
+                               photo_url create_date expire_date
                                super_user usrgroup passwd card last_xact_id
                                standing profile prefix suffix alert_message
                                day_phone evening_phone other_phone mailing_address/ );
@@ -65,7 +67,7 @@ use base qw/actor/;
 
 __PACKAGE__->table( 'actor_stat_cat_entry_usr_map' );
 __PACKAGE__->columns( Primary => qw/id/ );
-__PACKAGE__->columns( Essential => qw/stat_cat_entry target_user/ );
+__PACKAGE__->columns( Essential => qw/stat_cat stat_cat_entry target_user/ );
 
 #-------------------------------------------------------------------------------
 package actor::card;
@@ -112,7 +114,7 @@ __PACKAGE__->columns( Essential => qw/valid address_type usr street1 street2
 package actor::profile;
 use base qw/actor/;
 
-__PACKAGE__->table( 'actor_card' );
+__PACKAGE__->table( 'actor_profile' );
 __PACKAGE__->columns( Primary => qw/id/ );
 __PACKAGE__->columns( Essential => qw/name/ );
 
index fa4dbba..6c4cedf 100644 (file)
@@ -5,6 +5,14 @@ our $VERSION = 1;
 package asset;
 use base qw/OpenILS::Application::Storage::CDBI/;
 #-------------------------------------------------------------------------------
+package asset::copy_location;
+use base qw/asset/;
+
+__PACKAGE__->table( 'asset_copy_location' );
+__PACKAGE__->columns( Primary => qw/id/ );
+__PACKAGE__->columns( Essential => qw/name owning_lib holdable opac_visible circulate/ );
+
+#-------------------------------------------------------------------------------
 package asset::call_number;
 use base qw/asset/;
 
@@ -27,9 +35,9 @@ use base qw/asset/;
 __PACKAGE__->table( 'asset_copy' );
 __PACKAGE__->columns( Primary => qw/id/ );
 __PACKAGE__->columns( Essential => qw/call_number barcode creator create_date editor
-                                  edit_date copy_number available loan_duration circ_lib
+                                  edit_date copy_number status loan_duration circ_lib
                                   fine_level circulate deposit price ref opac_visible
-                                  circ_as_type circ_modifier deposit_amount/ );
+                                  circ_as_type circ_modifier deposit_amount location/ );
 
 #-------------------------------------------------------------------------------
 package asset::stat_cat;
index df1536b..6282500 100644 (file)
@@ -62,6 +62,20 @@ __PACKAGE__->columns(Primary => 'id');
 __PACKAGE__->columns(Essential => qw/name age radius/);
 #-------------------------------------------------------------------------------
 
+package config::copy_status;
+use base qw/config/;
+__PACKAGE__->table('config_copy_status');
+__PACKAGE__->columns(Primary => 'id');
+__PACKAGE__->columns(Essential => qw/name/);
+#-------------------------------------------------------------------------------
+
+package config::net_access_level;
+use base qw/config/;
+__PACKAGE__->table('config_net_access_level');
+__PACKAGE__->columns(Primary => 'id');
+__PACKAGE__->columns(Essential => qw/name/);
+#-------------------------------------------------------------------------------
+
 
 1;
 
index ae94852..c06d6d4 100644 (file)
        action::survey_response->sequence( 'action.survey_response_id_seq' );
        
        #---------------------------------------------------------------------
+       package config::copy_status;
+       
+       config::standing->table( 'config.copy_status' );
+       config::standing->sequence( 'config.copy_status_id_seq' );
+       
+       #---------------------------------------------------------------------
+       package config::net_access_level;
+       
+       config::standing->table( 'config.net_access_level' );
+       config::standing->sequence( 'config.net_access_level_id_seq' );
+       
+       #---------------------------------------------------------------------
        package config::standing;
        
        config::standing->table( 'config.standing' );
        asset::call_number->sequence( 'asset.call_number_id_seq' );
        
        #---------------------------------------------------------------------
+       package asset::copy_location;
+       
+       asset::copy->table( 'asset.copy_location' );
+       asset::copy->sequence( 'asset.copy_location_id_seq' );
+
+       #---------------------------------------------------------------------
        package asset::copy;
        
        asset::copy->table( 'asset.copy' );
        
        actor::card->table( 'actor.card' );
        actor::card->sequence( 'actor.card_id_seq' );
-       
 
        #---------------------------------------------------------------------
 
index 3d5bc8a..1fa4bcb 100644 (file)
@@ -1,6 +1,6 @@
 package OpenILS::Application::Storage::Publisher::actor;
 use base qw/OpenILS::Application::Storage/;
-use OpenILS::Application::Storage::CDBI::actor;
+#use OpenILS::Application::Storage::CDBI::actor;
 use OpenSRF::Utils::Logger qw/:level/;
 use OpenILS::Utils::Fieldmapper;
 
@@ -17,19 +17,20 @@ sub user_by_barcode {
 
                next unless $card;
 
-               my $usr_fm = flesh_user( $card->usr );
-               $client->respond( $usr_fm );
+               $client->respond( $card->usr->to_fieldmapper);
        }
        return undef;
 }
 __PACKAGE__->register_method(
-       api_name        => 'open-ils.storage.fleshed.actor.user.search.barcode',
+       api_name        => 'open-ils.storage.direct.actor.user.search.barcode',
        api_level       => 1,
        method          => 'user_by_barcode',
        stream          => 1,
        cachable        => 1,
 );
 
+=comment not gonna use it...
+
 sub fleshed_search {
        my $self = shift;
        my $client = shift;
@@ -129,6 +130,8 @@ sub flesh_user {
        return $usr_fm;
 }
 
+=cut
+
 sub org_unit_list {
        my $self = shift;
        my $client = shift;
index 25873cc..21e788d 100644 (file)
@@ -2,8 +2,8 @@ package OpenILS::Application::Storage::Publisher::biblio;
 use base qw/OpenILS::Application::Storage/;
 use vars qw/$VERSION/;
 use OpenSRF::EX qw/:try/;
-use OpenILS::Application::Storage::CDBI::biblio;
-use OpenILS::Application::Storage::CDBI::asset;
+#use OpenILS::Application::Storage::CDBI::biblio;
+#use OpenILS::Application::Storage::CDBI::asset;
 use OpenILS::Utils::Fieldmapper;
 
 $VERSION = 1;
@@ -36,7 +36,7 @@ sub record_copy_count {
                                        JOIN $cp_table cp ON (cn.id = cp.call_number)
                                        JOIN $descendants a ON (cp.circ_lib = a.id)
                                  WHERE cn.record = ?
-                                       AND cp.available IS TRUE)
+                                       AND cp.status = 0)
                        ) AS available
                  FROM  $ancestors u
                        JOIN $out_table t ON (u.ou_type = t.id)
index 1c572aa..3316ff7 100644 (file)
@@ -1,6 +1,6 @@
 package OpenILS::Application::Storage::Publisher::config;
 use base qw/OpenILS::Application::Storage/;
-use OpenILS::Application::Storage::CDBI::config;
+#use OpenILS::Application::Storage::CDBI::config;
 
 
 sub metabib_field_all {
index 874944a..e8c1e0c 100644 (file)
@@ -44,7 +44,7 @@ sub metarecord_copy_count {
                                        JOIN $cp_table cp ON (cn.id = cp.call_number)
                                        JOIN $descendants a ON (cp.circ_lib = a.id)
                                  WHERE r.metarecord = ?
-                                       AND cp.available IS TRUE)
+                                       AND cp.status = 0)
                        ) AS available
 
                  FROM  $ancestors u
index a8a0488..e9c3c4f 100644 (file)
@@ -84,4 +84,31 @@ CREATE TABLE config.rule_age_hold_protect (
        radius  INT             NOT NULL
 );
 
+CREATE TABLE config.copy_status (
+       id      SERIAL          PRIMARY KEY,
+       name    TEXT            NOT NULL UNIQUE
+);
+INSERT INTO config.copy_status (id,name) VALUES (0,'Available');
+INSERT INTO config.copy_status (name) VALUES ('Checked out');
+INSERT INTO config.copy_status (name) VALUES ('Bindery');
+INSERT INTO config.copy_status (name) VALUES ('Lost');
+INSERT INTO config.copy_status (name) VALUES ('Missing');
+INSERT INTO config.copy_status (name) VALUES ('In process');
+INSERT INTO config.copy_status (name) VALUES ('In transit');
+INSERT INTO config.copy_status (name) VALUES ('Reshelving');
+INSERT INTO config.copy_status (name) VALUES ('On holds shelf');
+INSERT INTO config.copy_status (name) VALUES ('On order');
+INSERT INTO config.copy_status (name) VALUES ('ILL');
+INSERT INTO config.copy_status (name) VALUES ('Cataloging');
+INSERT INTO config.copy_status (name) VALUES ('Reserves');
+INSERT INTO config.copy_status (name) VALUES ('Discard/Weed');
+
+CREATE TABLE config.net_access_level (
+       id      SERIAL          PRIMARY KEY,
+       name    TEXT            NOT NULL UNIQUE
+);
+INSERT INTO config.net_access_level (name) VALUES ('Restricted');
+INSERT INTO config.net_access_level (name) VALUES ('Full');
+INSERT INTO config.net_access_level (name) VALUES ('None');
+
 COMMIT;
index 91ef007..fda148c 100644 (file)
@@ -14,6 +14,10 @@ CREATE TABLE actor.usr (
        standing                INT             NOT NULL DEFAULT 1 REFERENCES config.standing (id),
        ident_type              INT             NOT NULL REFERENCES config.identification_type (id),
        ident_value             TEXT            NOT NULL,
+       ident_type2             INT             REFERENCES config.identification_type (id),
+       ident_value2            TEXT,
+       net_access_level        INT             NOT NULL DEFAULT 1 REFERENCES config.net_access_level (id),
+       photo_url               TEXT,
        prefix                  TEXT,
        first_given_name        TEXT            NOT NULL,
        second_given_name       TEXT,
@@ -39,7 +43,8 @@ CREATE TABLE actor.usr (
        expire_date             DATE            NOT NULL DEFAULT (now() + '3 years'::INTERVAL)::DATE
 );
 CREATE INDEX actor_usr_home_ou_idx ON actor.usr (home_ou);
-CREATE INDEX actor_usr_address_idx ON actor.usr (address);
+CREATE INDEX actor_usr_mailing_address_idx ON actor.usr (mailing_address);
+CREATE INDEX actor_usr_billing_address_idx ON actor.usr (billing_address);
 
 CREATE FUNCTION actor.crypt_pw_insert () RETURNS TRIGGER AS $$
        BEGIN
@@ -98,9 +103,10 @@ CREATE TABLE actor.stat_cat_entry (
 
 CREATE TABLE actor.stat_cat_entry_usr_map (
        id              BIGSERIAL       PRIMARY KEY,
-       stat_cat_entry  INT             NOT NULL REFERENCES actor.stat_cat_entry (id) ON DELETE CASCADE,
+       stat_cat_entry  TEXT            NOT NULL,
+       stat_cat        INT             NOT NULL REFERENCES actor.stat_cat (id) ON DELETE CASCADE,
        target_usr      INT             NOT NULL REFERENCES actor.usr (id) ON DELETE CASCADE,
-       CONSTRAINT sce_once_per_copy UNIQUE (target_usr,stat_cat_entry)
+       CONSTRAINT sce_once_per_copy UNIQUE (target_usr,stat_cat)
 );
 CREATE INDEX actor_stat_cat_entry_usr_idx ON actor.stat_cat_entry_usr_map (target_usr);
 
@@ -146,7 +152,10 @@ CREATE TABLE actor.org_unit (
 );
 CREATE INDEX actor_org_unit_parent_ou_idx ON actor.org_unit (parent_ou);
 CREATE INDEX actor_org_unit_ou_type_idx ON actor.org_unit (ou_type);
-CREATE INDEX actor_org_unit_address_idx ON actor.org_unit (address);
+CREATE INDEX actor_org_unit_ill_address_idx ON actor.org_unit (ill_address);
+CREATE INDEX actor_org_unit_billing_address_idx ON actor.org_unit (billing_address);
+CREATE INDEX actor_org_unit_mailing_address_idx ON actor.org_unit (mailing_address);
+CREATE INDEX actor_org_unit_holds_address_idx ON actor.org_unit (holds_address);
 
 INSERT INTO actor.org_unit (parent_ou, ou_type, shortname, name) VALUES (NULL, 1, 'PINES', 'Georgia PINES Consortium');
 
index 81b9129..4276c78 100644 (file)
@@ -4,9 +4,19 @@ BEGIN;
 
 CREATE SCHEMA asset;
 
+CREATE TABLE asset.copy_location (
+       id              SERIAL  PRIMARY KEY,
+       name            TEXT    NOT NULL,
+       owning_lib      INT     NOT NULL REFERENCES actor.org_unit (id),
+       holdable        BOOL    NOT NULL DEFAULT TRUE,
+       opac_visible    BOOL    NOT NULL DEFAULT TRUE,
+       circulate       BOOL    NOT NULL DEFAULT TRUE
+);
+INSERT INTO asset.copy_location (name,owning_lib) VALUES ('Stacks',1);
+
 CREATE TABLE asset.copy (
        id              BIGSERIAL                       PRIMARY KEY,
-       circ_lib        INT                             NOT NULL REFERENCES actor.org_unit (id),
+       circ_lib        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
        creator         BIGINT                          NOT NULL,
        create_date     TIMESTAMP WITH TIME ZONE        DEFAULT NOW(),
        editor          BIGINT                          NOT NULL,
@@ -15,7 +25,8 @@ CREATE TABLE asset.copy (
        call_number     BIGINT                          NOT NULL,
        copy_number     INT,
        holdable        BOOL                            NOT NULL DEFAULT TRUE,
-       available       BOOL                            NOT NULL DEFAULT TRUE, -- was STATUS
+       status          INT                             NOT NULL DEFAULT 0 REFERENCES config.copy_status (id) DEFERRABLE INITIALLY DEFERRED,
+       location        INT                             NOT NULL DEFAULT 1 REFERENCES asset.copy_location (id) DEFERRABLE INITIALLY DEFERRED,
        loan_duration   INT                             NOT NULL CHECK ( loan_duration IN (1,2,3) ),
        fine_level      INT                             NOT NULL CHECK ( fine_level IN (1,2,3) ),
        circulate       BOOL                            NOT NULL DEFAULT TRUE,
@@ -28,6 +39,7 @@ CREATE TABLE asset.copy (
        opac_visible    BOOL                            NOT NULL DEFAULT TRUE
 );
 CREATE INDEX cp_cn_idx ON asset.copy (call_number);
+CREATE INDEX cp_avail_cn_idx ON asset.copy (call_number) WHERE status = 0;
 
 CREATE TABLE asset.copy_transparency (
        id              SERIAL          PRIMARY KEY,
@@ -43,7 +55,7 @@ CREATE TABLE asset.copy_transparency (
        ref             BOOL,
        circ_modifier   TEXT,
        circ_as_type    TEXT,
-       opac_visible    BOOL
+       opac_visible    BOOL,
        CONSTRAINT scte_name_once_per_lib UNIQUE (owner,name)
 );
 
index 6e89d06..4605f01 100644 (file)
@@ -1,31 +1,35 @@
 BEGIN;
 
-ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_class_fkey FOREIGN KEY (class) REFERENCES actor.usr_class (id);
-ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_address_fkey FOREIGN KEY (address) REFERENCES actor.usr_address (id);
-ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_home_ou_fkey FOREIGN KEY (home_ou) REFERENCES actor.org_unit (id);
+ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_profile_fkey FOREIGN KEY (profile) REFERENCES actor.profile (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_mailing_address_fkey FOREIGN KEY (mailing_address) REFERENCES actor.usr_address (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_billining_address_fkey FOREIGN KEY (billing_address) REFERENCES actor.usr_address (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.usr ADD CONSTRAINT actor_usr_home_ou_fkey FOREIGN KEY (home_ou) REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED;
         
-ALTER TABLE actor.stat_cat ADD CONSTRAINT actor_stat_cat_owner_fkey FOREIGN KEY (owner) REFERENCES actor.org_unit (id);
+ALTER TABLE actor.stat_cat ADD CONSTRAINT actor_stat_cat_owner_fkey FOREIGN KEY (owner) REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE actor.stat_cat_entry ADD CONSTRAINT actor_stat_cat_entry_owner_fkey FOREIGN KEY (owner) REFERENCES actor.org_unit (id);
+ALTER TABLE actor.stat_cat_entry ADD CONSTRAINT actor_stat_cat_entry_owner_fkey FOREIGN KEY (owner) REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE actor.org_unit ADD CONSTRAINT actor_org_unit_address_fkey FOREIGN KEY (address) REFERENCES actor.org_address (id);
+ALTER TABLE actor.org_unit ADD CONSTRAINT actor_org_unit_mailing_address_fkey FOREIGN KEY (mailing_address) REFERENCES actor.org_address (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.org_unit ADD CONSTRAINT actor_org_unit_billing_address_fkey FOREIGN KEY (billing_address) REFERENCES actor.org_address (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.org_unit ADD CONSTRAINT actor_org_unit_holds_address_fkey FOREIGN KEY (holds_address) REFERENCES actor.org_address (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE actor.org_unit ADD CONSTRAINT actor_org_unit_ill_address_fkey FOREIGN KEY (ill_address) REFERENCES actor.org_address (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_record_fkey FOREIGN KEY (record) REFERENCES biblio.record_entry (id) ON DELETE CASCADE;
-ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_creator_fkey FOREIGN KEY (creator) REFERENCES actor.usr (id);
-ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_editor_fkey FOREIGN KEY (editor) REFERENCES actor.usr (id);
+ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_record_fkey FOREIGN KEY (record) REFERENCES biblio.record_entry (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_creator_fkey FOREIGN KEY (creator) REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE biblio.record_note ADD CONSTRAINT biblio_record_note_editor_fkey FOREIGN KEY (editor) REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE biblio.record_entry ADD CONSTRAINT biblio_record_entry_creator_fkey FOREIGN KEY (creator) REFERENCES actor.usr (id);
-ALTER TABLE biblio.record_entry ADD CONSTRAINT biblio_record_entry_editor_fkey FOREIGN KEY (editor) REFERENCES actor.usr (id);
+ALTER TABLE biblio.record_entry ADD CONSTRAINT biblio_record_entry_creator_fkey FOREIGN KEY (creator) REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE biblio.record_entry ADD CONSTRAINT biblio_record_entry_editor_fkey FOREIGN KEY (editor) REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE metabib.metarecord ADD CONSTRAINT metabib_metarecord_master_record_fkey FOREIGN KEY (master_record) REFERENCES biblio.record_entry (id);
+ALTER TABLE metabib.metarecord ADD CONSTRAINT metabib_metarecord_master_record_fkey FOREIGN KEY (master_record) REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE metabib.title_field_entry ADD CONSTRAINT metabib_title_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id);
-ALTER TABLE metabib.title_field_entry ADD CONSTRAINT metabib_title_field_entry_field_pkey FOREIGN KEY (field) REFERENCES config.metabib_field (id);
+ALTER TABLE metabib.title_field_entry ADD CONSTRAINT metabib_title_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE metabib.title_field_entry ADD CONSTRAINT metabib_title_field_entry_field_pkey FOREIGN KEY (field) REFERENCES config.metabib_field (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE metabib.author_field_entry ADD CONSTRAINT metabib_author_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id);
-ALTER TABLE metabib.author_field_entry ADD CONSTRAINT metabib_author_field_entry_field_pkey FOREIGN KEY (field) REFERENCES config.metabib_field (id);
+ALTER TABLE metabib.author_field_entry ADD CONSTRAINT metabib_author_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE metabib.author_field_entry ADD CONSTRAINT metabib_author_field_entry_field_pkey FOREIGN KEY (field) REFERENCES config.metabib_field (id) DEFERRABLE INITIALLY DEFERRED;
 
-ALTER TABLE metabib.subject_field_entry ADD CONSTRAINT metabib_subject_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id);
+ALTER TABLE metabib.subject_field_entry ADD CONSTRAINT metabib_subject_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED;
 ALTER TABLE metabib.subject_field_entry ADD CONSTRAINT metabib_subject_field_entry_field_pkey FOREIGN KEY (field) REFERENCES config.metabib_field (id);
 
 ALTER TABLE metabib.keyword_field_entry ADD CONSTRAINT metabib_keyword_field_entry_source_pkey FOREIGN KEY (source) REFERENCES biblio.record_entry (id);