1 package SL::DB::RequirementSpec;
6 use Rose::DB::Object::Helpers;
8 use SL::DB::MetaSetup::RequirementSpec;
9 use SL::DB::Manager::RequirementSpec;
10 use SL::Locale::String;
12 __PACKAGE__->meta->add_relationship(
14 type => 'one to many',
15 class => 'SL::DB::RequirementSpecItem',
16 column_map => { id => 'requirement_spec_id' },
19 type => 'one to many',
20 class => 'SL::DB::RequirementSpecTextBlock',
21 column_map => { id => 'requirement_spec_id' },
25 __PACKAGE__->meta->initialize;
27 __PACKAGE__->before_save('_before_save_initialize_not_null_columns');
33 push @errors, t8('The title is missing.') if !$self->title;
38 sub _before_save_initialize_not_null_columns {
41 $self->previous_section_number(0) if !defined $self->previous_section_number;
42 $self->previous_fb_number(0) if !defined $self->previous_fb_number;
47 sub text_blocks_for_position {
48 my ($self, $output_position) = @_;
50 return [ sort { $a->position <=> $b->position } grep { $_->output_position == $output_position } @{ $self->text_blocks } ];
54 my ($self, @rest) = @_;
56 croak "This sub is not a writer" if @rest;
58 return [ sort { $a->position <=> $b->position } grep { !$_->parent_id } @{ $self->items } ];
61 sub displayable_name {
64 return sprintf('%s: "%s"', $self->type->description, $self->title);
68 my ($self, %params) = @_;
70 return $self->_create_copy(%params) if $self->db->in_transaction;
73 if (!$self->db->do_transaction(sub { $copy = $self->_create_copy(%params) })) {
74 $::lxdebug->message(LXDebug->WARN(), "create_copy failed: " . join("\n", (split(/\n/, $self->db->error))[0..2]));
82 my ($self, %params) = @_;
84 my $copy = Rose::DB::Object::Helpers::clone_and_reset($self);
85 $copy->assign_attributes(%params);
88 $copy->text_blocks(map { Rose::DB::Object::Helpers::clone_and_reset($_) } @{ $self->text_blocks });
90 # Save new object -- we need its ID for the items.
99 my $cloned = Rose::DB::Object::Helpers::clone_and_reset($item);
100 $cloned->requirement_spec_id($copy->id);
101 $cloned->children(map { $clone_item->($_) } @{ $item->children });
103 $id_to_clone{ $item->id } = $cloned;
108 $copy->items(map { $clone_item->($_) } @{ $self->sections });
110 # Save the items -- need to do that before setting dependencies.
114 foreach my $item (@{ $self->items }) {
115 next unless @{ $item->dependencies };
116 $id_to_clone{ $item->id }->update_attributes(dependencies => [ map { $id_to_clone{$_->id} } @{ $item->dependencies } ]);