[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[EP-tech] Re: Understanding how data objects link
Hi Ian,
Your problem may come from
perl_lib/EPrints/MetaField/Subobject.pm::get_value
my $ds = $parent->get_session->dataset( $self->get_property(
"datasetid" ) );
my $searchexp = $ds->prepare_search();
if( $ds->base_id eq "document" )
{
$searchexp->add_field(
$ds->field( "eprintid" ),
$parent->id
);
}
elsif( $ds->base_id eq "saved_search" )
{
$searchexp->add_field(
$ds->field( "userid" ),
$parent->id
);
}
# ETC...
(you should upgrade to 3.3 one day ;-))
Seb.
On 15/01/14 09:39, Ian Stuart wrote:
> I'm creating new data objects in an EPrints repository (EP3.2 as it
> happens) to support a new service within my repo.
> The idea is that a "subscriber" can register to receive a number of
> "postcards", where each postcard is a list of citations of new records
> in a [list of] department[s], emailed to a specified email address.
>
> I have two Objects: a "Subscriber" and a "Postcard", based very heavily
> on the "EPrint" and "Document" Data Objects.
>
> The fundamental code for the two objects is listed at the end of the email.
>
> The full code is syntactically correct, and loads into EPrints.
>
> When I use the code, I start with a user_id, and want to get the list of
> postcards associated with that user, so I have code thus:
>
> # Before we do anything - we need to get the subscriber object
> my $subs_ds = $session->get_repository->get_dataset("subscriber");
> my $subscriber;
>
> { # Localise this search
> my $searchexp = EPrints::Search->new(
> session => $session,
> dataset => $subs_ds,
> );
> $searchexp->add_field( $subs_ds->get_field("userid"), $user_id );
> warn $searchexp->render_description->toString;
> my $results = $searchexp->perform_search;
>
> if ($results->count) {
> my @records = $searchexp->perform_search->slice(0,1); # Get
> records from position 0, for a count of 1 records
> $subscriber = $records[0]
> } else {
> $subscriber = EPrints::DataObj::Subscriber->create( $session,
> {userid => $user_id }, $subs_ds );
> }
> }
>
> # Having got a subscriber object, lets get a list of postcards they have
> # Postcards are 1 email address and some number of repositories
> warn "got subscriber " . $subscriber->get_id . "\n";
> my $postcards = $subscriber->get_value( 'postcards' );
>
> This code successfully returns a matching "Subscriber", however the
> final line in that code is causing me problems... I get the error
>
> dataset postcard has no field: datasetid
>
> I have double-checked my code against that of EPrints::DataObj::EPrint
> and EPrints::DataObj::Document - neither of them have a datasetid field,
> and my own objects are creating records in exactly the same way!
>
> I've a few questions... but mostly I'd like someone to try to explain
> how new data-objects should be made, and what's needed.
>
> Oh - and once I've got this working, I *WILL* add documentation to the
> Wiki... if nothing else, it'll help me understand what my codes doing,
> and why :chuckle:
>
>
>
>
> package EPrints::DataObj::Subscriber;
>
> our @ISA = ('EPrints::DataObj');
>
> use EPrints;
>
> sub get_system_field_info {
> my ($class) = @_;
>
> return (
> { name => "subscriberid", type => "counter",
> required => 1, import => 0, can_clone => 0,
> sql_counter => "subscriberid"
> },
> { name => "userid", type => "text", required => 1 },
> { name => "postcards", type => "subobject",
> datasetid => 'postcard', multiple => 1
> },
> );
> } ## end sub get_system_field_info
>
> sub get_dataset_id {
> return "subscriber";
> }
>
> sub get_all_postcards {
> my ($self) = @_;
>
> return @{ ( $self->get_value("postcards") ) } ;
> } ## end sub get_all_postcards
>
> 1;
> package EPrints::DataObj::Postcard;
>
> our @ISA = ('EPrints::DataObj::SubObject');
>
> use EPrints;
>
> sub get_system_field_info {
> my ($class) = @_;
>
> return (
> { name => "cardid", type => "counter",
> required => 1, import => 0, show_in_html => 0,
> can_clone => 0, sql_counter => "postcardid"
> },
> { name => "email", type => "text", required => 1 },
> { name => "subscriberid", type => "itemref",
> datasetid => "subscriber", required => 1, show_in_html => 0
> },
> { name => "repos", type => "compound", multiple => 1,
> fields => [
> { sub_name => "repoid", type => "text", },
> { sub_name => "reponame", type => "text", },
> ],
> },
> );
>
> } ## end sub get_system_field_info
>
> sub get_dataset_id {
> return "postcard";
> }
>
> sub get_parent {
> my ( $self, $datasetid, $objectid ) = @_;
>
> $datasetid = "subscriber";
> $objectid = $self->get_value("subscriberid");
>
> return $self->SUPER::get_parent( $datasetid, $objectid );
> } ## end sub get_parent
> 1;
>
>