# Bazaar Configuration $c->{plugins}{"InputForm::Component::Field::ItemrefLookupjs"}{params}{disable} = 0; $c->{plugins}{"Screen::BrowseContainers"}{params}{disable} = 0; $c->{plugins}{"Screen::Container"}{params}{disable} = 0; $c->{plugins}{"Screen::Containers"}{params}{disable} = 0; $c->{plugins}{"Screen::CreateFromContainers"}{params}{disable} = 0; $c->{plugins}{"Screen::NewContainer"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::Edit"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::NewFromContainer"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::NewFromItem"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::Remove"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::RemoveItem"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::View"}{params}{disable} = 0; $c->{plugins}{"Screen::Container::ViewItems"}{params}{disable} = 0; $c->{plugins}{"Screen::EPMC::Containers"}{params}{disable} = 0; # Definition of the dataset and data object class for the Project Containers project. # Add extra metadata fields for user profiles @{ $c->{fields}->{user} } = ( @{ $c->{fields}->{user} }, ( { name=>"containers_fields", type=>"fields", datasetid=>"container", multiple=>1, input_ordered=>1, required=>1, volatile=>1 }, )); # Add extra metadata fields for eprint @{ $c->{fields}->{eprint} } = ( @{ $c->{fields}->{eprint} }, ( { name=>"category", type=>"namedset", set_name=>"artwork", multiple => 1, required=>1, "input_style"=> "long" }, )); $c->{roles}->{"edit-container"} = [qw{ container/view container/edit container/create container/remove container/use }]; $c->{roles}->{"use-container"} = [qw{ container/use container/view }]; push @{$c->{user_roles}->{user}}, "use-container"; push @{$c->{user_roles}->{editor}}, "edit-container"; push @{$c->{user_roles}->{admin}}, "edit-container"; $c->{datasets}->{container} = { name => "container", # name type => "Container", # data object class sqlname => "container", # database table name }; $c->{fields}->{container} = [ { name => "description", type => "text", }, # { # name => "institution", # type => "text", # }, { name => 'subjects', type => 'subject', multiple => 1, top => 'subjects', browse_link => 'subjects', }, { name => 'funders', type => 'text', multiple => 1, input_boxes => 1, }, { name => 'divisions', type => 'subject', multiple => 1, top => 'divisions', browse_link => 'divisions', }, { name=>"category", type=>"namedset", set_name=>"artwork", multiple => 1, }, { name=>"item_count", type=>"int", volatile=>1, }, #{ name => "select_creators", type => "ContainerUserSelection", multiple => 1, input_boxes => 1, # fields => [ # { sub_name => "name", type => "name", hide_honourific => 1, hide_lineage => 1, family_first => 1 }, # { sub_name => "id", type => "text", input_cols => 20 }, # ], # input_ordered => 0, # input_add_boxes => 0, #}, ]; $c->{get_allowed_containers} = sub { my( $user, $session ) = @_; my $ds = $session->get_repository->get_dataset( "container" ); my $list; if ($user->allow("container/edit")) { $list = $ds->search; } else { my $eprint_list = $user->owned_eprints_list; if ($eprint_list->count > 0 ) { my $eprint_id_list = $eprint_list->ids; my $eprint_id_str = "("; foreach my $id (@$eprint_id_list) { $eprint_id_str .= ", $id" } $eprint_id_str .= ")"; $eprint_id_str =~ s/\(, /\( /; # I am using a custom search as I need to check a non-contiguous range of ids my $container_ids = (); my $dbh = $session->get_database; my $sql = "SELECT distinct c.containerid "; $sql .= "FROM container c, container_eprints e, container_users u "; $sql .= "WHERE (c.containerid= e.containerid and e.eprints in $eprint_id_str) "; $sql .= "or (c.containerid= u.containerid and u.users=".$user->get_value("userid").");"; my $sth = $dbh->prepare( $sql ); $dbh->execute( $sth, $sql ); while( my @r = $sth->fetchrow_array ) { push @$container_ids, $r[0]; } if (defined $container_ids) { $list = $ds->list( $container_ids ); } } else { my $searchexp = new EPrints::Search( session=>$session, dataset=>$ds ); $searchexp->add_field( $ds->get_field( "users" ), $user->get_value("userid") ); $list = $searchexp->perform_search; } } return $list; }; $c->{container_render} = sub { my( $container, $session ) = @_; my $html; my( $info, $p, $a ); $info = $session->make_doc_fragment; # Render the information about this container. $p = $session->make_element( "p" ); # if( $container->is_set( "institution" ) ) # { # $p->appendChild( $session->make_element( "br" ) ); # $p->appendChild( $container->render_value( "institution" ) ); # } if( $container->is_set( "description" ) ) { $p->appendChild( $session->make_element( "br" ) ); $p->appendChild( $container->render_value( "description" ) ); } if( $container->is_set( "name" ) ) { $p->appendChild( $session->make_element( "br" ) ); $p->appendChild( $container->render_value( "name" ) ); } if( $container->is_set( "parentid" ) ) { $p->appendChild( $session->make_element( "br" ) ); $p->appendChild( $container->render_value( "parentid" ) ); } if( $container->is_set( "ownerid" ) ) { $p->appendChild( $session->make_element( "br" ) ); } $info->appendChild( $p ); return( $info ); }; { no warnings; package EPrints::DataObj::Container; our @ISA = qw( EPrints::DataObj ); use strict; sub get_system_field_info { my( $class ) = @_; return ( { name=>"containerid", type=>"counter", required=>1, can_clone=>0, sql_counter=>"containerid" }, { name=>"name", type=>"text", required=>0, }, { name=>"version", type=>"text", required=>0, }, { name=>"datestamp", type=>"time", required=>0, import=>0, render_res=>"minute", render_style=>"short", can_clone=>0 }, { name=>"lastmod", type=>"timestamp", required=>0, import=>0, render_res=>"minute", render_style=>"short", can_clone=>0, volatile=>1 }, { name=>"ownerid", type=>"itemref", datasetid=>"user", required=>0 }, { name=>"parentid", type=>"itemref", datasetid=>"container", required=>0 }, { name=>"eprints", type=>"itemref", datasetid=>'eprint', multiple=>1 }, { name=>"users", type=>"itemref", datasetid=>'user', multiple=>1 }, ); } sub new { my( $class, $session, $containerid ) = @_; return $session->get_database->get_single( $session->get_repository->get_dataset( "container" ), $containerid ); } sub create { my( $session, $user_id ) = @_; return EPrints::DataObj::User->create_from_data( $session, { ownerid=>$user_id }, $session->get_repository->get_dataset( "container" ) ); } sub get_dataset_id { return "container"; } sub get_inherited_items_from_children { my( $self, $field, $childid ) = @_; my $session = $self->{session}; my $ep_ds = $session->get_repository->get_dataset( "eprint" ); my $container_ds = $session->get_repository->get_dataset( "container" ); my $child = $container_ds->dataobj($childid); my $items = (); if (defined $child && $child->is_set("eprints")) { my $eprints = $child->get_value("eprints"); foreach my $eprintid (@$eprints) { my $eprint = $ep_ds->dataobj($eprintid); if ( defined $eprint) { my $the_items = $eprint->get_value($field); if (defined $the_items) { foreach my $item (@$the_items) { $items->{$item}++; } } } } } return $items; } sub get_items_from_children { my( $self, $field_name ) = @_; my $session = $self->{session}; my $container_ds = $session->get_repository->get_dataset( "container" ); my $items = (); my $searchexp = new EPrints::Search( session=>$session, dataset=>$container_ds ); $searchexp->add_field( $container_ds->get_field( "parentid" ), $self->get_value("containerid") ); my $child_list = $searchexp->perform_search; $child_list->map( sub { my( $session, $dataset, $container ) = @_; my $id = $container->get_value("containerid"); my $the_items = $container->get_value($field_name); #my $the_items = $container->get_value($field_name->[0]); if (defined $the_items) { foreach my $item (@$the_items) { $items->{$item}++; } } my $inherited_items = $self->get_inherited_items_from_children( $field_name, $id ); foreach my $item_key (keys %$inherited_items) { $items->{$item_key}++; } }); return $items; } # called from the workflow provides an xhtml fragment. sub get_subjects_from_children { my( $self, $field_name ) = @_; my $session = $self->{session}; $field_name = "subjects" if ( ! defined $field_name ); my $frag = $session->make_doc_fragment; my $sub_ds = $session->get_repository->get_dataset( "subject" ); my $items = $self->get_items_from_children( $field_name->[0] ); if (scalar keys %$items) { my $ul = $session->make_element("ul"); foreach my $id (keys %$items) { my $li = $session->make_element("li"); $ul->appendChild( $li ); my $subj = $sub_ds->dataobj($id); $li->appendChild( $subj->render_description() ); } $frag->appendChild( $session->html_phrase("container_items_from_children") ); $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items_from_children") ); } my $items_from_eprints = $self->get_inherited_items( $field_name->[0] ); #my $items_from_eprints = $self->get_inherited_items( $field_name ); if (scalar keys %$items_from_eprints) { my $ul = $session->make_element("ul"); foreach my $id (keys %$items_from_eprints) { my $li = $session->make_element("li"); $ul->appendChild( $li ); my $subj = $sub_ds->dataobj($id); $li->appendChild( $subj->render_description() ); } $frag->appendChild( $session->html_phrase("container_items_from_eprints") ); $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items_from_eprints") ); } return $frag; } # called from the workflow provides an xhtml fragment. sub get_field_from_children { my( $self, $field_name ) = @_; my $field = $field_name->[0]; my $session = $self->{session}; my $container_ds = $session->get_repository->get_dataset( "container" ); my $frag = $session->make_doc_fragment; my $funders = $self->get_items_from_children( $field ); if (scalar keys %$funders) { my $ul = $session->make_element("ul"); foreach my $funder (keys %$funders) { my $li = $session->make_element("li"); $ul->appendChild( $li ); $li->appendChild( $session->make_text($funder) ); } $frag->appendChild( $session->html_phrase("container_items_from_children") ); $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items_from_children") ); } my $items_from_eprints = $self->get_inherited_items( $field ); if (scalar keys %$items_from_eprints) { my $ul = $session->make_element("ul"); foreach my $id (keys %$items_from_eprints) { my $li = $session->make_element("li"); $ul->appendChild( $li ); $li->appendChild( $session->make_text($id) ); } $frag->appendChild( $session->html_phrase("container_items_from_eprints") ); $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items_from_eprints") ); } return $frag; } sub get_inherited_items { my( $self, $field ) = @_; my $session = $self->{session}; my $items = (); if ($self->is_set("eprints")) { my $eprints = $self->get_value("eprints"); my $ep_ds = $session->get_repository->get_dataset( "eprint" ); foreach my $eprintid (@$eprints) { my $eprint = $ep_ds->dataobj($eprintid); if ( defined $eprint) { my $the_items = $eprint->get_value($field); if (defined $the_items) { foreach my $item (@$the_items) { $items->{$item}++; } } } } } return $items; } sub get_inherited_subjects { my( $self, $field_name ) = @_; my $session = $self->{session}; $field_name = "subjects" if ( ! defined $field_name ); my $frag = $session->make_doc_fragment; my $items = $self->get_inherited_items( $field_name->[0] ); my $sub_ds = $session->get_repository->get_dataset( "subject" ); if (scalar keys %$items) { my $ul = $session->make_element("ul"); foreach my $id (keys %$items) { my $li = $session->make_element("li"); $ul->appendChild( $li ); my $subj = $sub_ds->dataobj($id); $li->appendChild( $subj->render_description() ); } $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items") ); } return $frag; } sub get_inherited_funders { my( $self ) = @_; my $session = $self->{session}; my $frag = $session->make_doc_fragment; if ($self->is_set("eprints")) { my $funders = (); my $eprints = $self->get_value("eprints"); my $ep_ds = $session->get_repository->get_dataset( "eprint" ); foreach my $eprintid (@$eprints) { my $eprint = $ep_ds->dataobj($eprintid); if ( defined $eprint) { my $the_funders = $eprint->get_value("funders"); if (defined $the_funders) { foreach my $funder (@$the_funders) { $funders->{$funder}++; } } } } if (scalar keys %$funders) { my $ul = $session->make_element("ul"); foreach my $funder (keys %$funders) { my $li = $session->make_element("li"); $ul->appendChild( $li ); $li->appendChild( $session->make_text($funder) ); } $frag->appendChild( $ul ); } else { $frag->appendChild( $session->html_phrase("container_has_no_items") ); } } else { $frag->appendChild( $session->html_phrase("container_has_no_items") ); } return $frag; } # render method alled from the view plugin sub render_view { my( $self ) = @_; my( $dom, $title ) = $self->{session}->get_repository->call( "container_render", $self, $self->{session} ); if( !defined $title ) { $title = $self->render_description; } return( $dom, $title ); } } { # Package for extensions to EPrints::Script::Compiled package EPrints::Script::Compiled; use strict; sub run_get_subjects_from_children { my( $self, $state, $container, $field ) = @_; if( ! $container->[0]->isa( "EPrints::DataObj::Container" ) ) { $self->runtime_error( "Can only call get_subjects_from_children() on container objects not ". ref($container->[0]) ); } return [ $container->[0]->get_subjects_from_children( $field ), "XHTML" ]; } sub run_get_field_from_children { my( $self, $state, $container, $field ) = @_; if( ! $container->[0]->isa( "EPrints::DataObj::Container" ) ) { $self->runtime_error( "Can only call get_field_from_children() on container objects not ". ref($container->[0]) ); } return [ $container->[0]->get_field_from_children( $field ), "XHTML" || "STRING" ]; } sub run_get_inherited_subjects { my( $self, $state, $container, $field ) = @_; if( ! $container->[0]->isa( "EPrints::DataObj::Container" ) ) { $self->runtime_error( "Can only call get_inherited_subjects() on container objects not ". ref($container->[0]) ); } return [ $container->[0]->get_inherited_subjects( $field ), "XHTML" ]; } sub run_get_inherited_funders { my( $self, $state, $container ) = @_; if( ! $container->[0]->isa( "EPrints::DataObj::Container" ) ) { $self->runtime_error( "Can only call get_inherited_funders() on container objects not ". ref($container->[0]) ); } return [ $container->[0]->get_inherited_funders(), "XHTML" || "STRING" ]; } }