2 package SGN
::Controller
::AJAX
::TrackingActivity
;
5 use CXGN
::Stock
::Order
;
6 use CXGN
::Stock
::OrderBatch
;
10 use CXGN
::People
::Person
;
12 use CXGN
::Trial
::Download
;
13 use CXGN
::Stock
::TrackingActivity
::TrackingIdentifier
;
14 use CXGN
::Stock
::TrackingActivity
::ActivityInfo
;
15 use CXGN
::TrackingActivity
::AddActivityProject
;
16 use CXGN
::TrackingActivity
::ActivityProject
;
17 use SGN
::Model
::Cvterm
;
18 use CXGN
::Location
::LocationLookup
;
21 use File
::Basename qw
| basename dirname
|;
24 use File
::Spec
::Functions
;
26 use File
::Path
qw(make_path);
27 use File
::Spec
::Functions qw
/ catfile catdir/;
32 use URI
::Encode
qw(uri_encode uri_decode);
33 use Tie
::UrlEncoder
; our(%urlencode);
36 BEGIN { extends
'Catalyst::Controller::REST' }
39 default => 'application/json',
41 map => { 'application/json' => 'JSON', 'text/html' => 'JSON' },
45 sub create_tracking_activity_project
: Path
('/ajax/tracking_activity/create_tracking_activity_project') : ActionClass
('REST'){ }
47 sub create_tracking_activity_project_POST
: Args
(0) {
51 my $user = $c->user();
53 $c->res->redirect( uri
( path
=> '/user/login', query
=> { goto_url
=> $c->req->uri->path_query } ) );
57 if (!($user->has_role('submitter') or $user->has_role('curator'))) {
58 $c->stash->{rest
} = { error
=> "You do not have sufficient privileges to create tracking activity project." };
62 my $user_id = $c->user()->get_object()->get_sp_person_id();
63 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
64 my $dbh = $c->dbc->dbh;
66 my $project_name = $c->req->param("project_name");
67 my $activity_type = $c->req->param("activity_type");
68 my $breeding_program_id = $c->req->param("breeding_program");
69 my $project_location = $c->req->param("project_location");
70 my $year = $c->req->param("year");
71 my $project_description = $c->req->param("project_description");
73 my $geolocation_lookup = CXGN
::Location
::LocationLookup
->new(schema
=>$schema);
74 $geolocation_lookup->set_location_name($project_location);
75 if(!$geolocation_lookup->get_geolocation()){
76 $c->stash->{rest
}={error
=> "Location not found"};
82 my $add_activity_project = CXGN
::TrackingActivity
::AddActivityProject
->new({
83 bcs_schema
=> $schema,
85 breeding_program_id
=> $breeding_program_id,
87 project_description
=> $project_description,
88 activity_project_name
=> $project_name,
89 activity_type
=> $activity_type,
90 nd_geolocation_id
=> $geolocation_lookup->get_geolocation()->nd_geolocation_id(),
94 my $return = $add_activity_project->save_activity_project();
96 $c->stash->{rest
} = {error
=> "Error saving project",};
100 # if ($return->{error}){
101 # $error = $return->{error};
106 $c->stash->{rest
} = {error
=> $@
};
112 $c->stash->{rest
} = {error
=> $error};
114 $c->stash->{rest
} = {success
=> 1};
120 sub generate_tracking_identifiers
: Path
('/ajax/tracking_activity/generate_tracking_identifiers') : ActionClass
('REST'){ }
122 sub generate_tracking_identifiers_POST
: Args
(0) {
127 $c->stash->{rest
} = { error_string
=> "You must be logged in to generate tracking identifiers." };
130 if (!($c->user()->has_role('submitter') or $c->user()->has_role('curator'))) {
131 $c->stash->{rest
} = { error_string
=> "You do not have sufficient privileges to generate tracking identifiers." };
135 my $user_id = $c->user()->get_object()->get_sp_person_id();
136 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
137 my $phenome_schema = $c->dbic_schema("CXGN::Phenome::Schema");
138 my $dbh = $c->dbc->dbh();
140 my $project_name = $c->req->param("project_name");
141 my $list_id = $c->req->param("list_id");
143 my $project_rs = $schema->resultset("Project::Project")->find( { name
=> $project_name });
145 $c->stash->{rest
} = { error_string
=> "Error! Project name: $project_name was not found in the database.\n" };
148 $project_id = $project_rs->project_id();
151 my $activity_project = CXGN
::TrackingActivity
::ActivityProject
->new(bcs_schema
=> $schema, trial_id
=> $project_id);
152 my $all_identifiers = $activity_project->get_project_active_identifiers();
153 my $last_number = scalar (@
$all_identifiers);
155 my $list = CXGN
::List
->new( { dbh
=>$dbh, list_id
=>$list_id });
156 my $material_names = $list->elements();
158 my @check_identifier_names;
159 my @tracking_identifiers;
161 foreach my $name (sort @
$material_names) {
163 my $tracking_id = $project_name.":".$name."_"."T".(sprintf "%04d", $last_number);
164 push @tracking_identifiers, [$tracking_id, $name];
165 push @check_identifier_names, $tracking_id;
168 my $rs = $schema->resultset("Stock::Stock")->search({
169 'is_obsolete' => { '!=' => 't' },
170 'uniquename' => { -in => \
@check_identifier_names }
172 while (my $r=$rs->next){
173 push @error_messages, "Tracking identifier name already exists in database: ".$r->uniquename;
176 if (scalar(@error_messages) >= 1) {
177 $c->stash->{rest
} = { error_string
=> \
@error_messages};
181 foreach my $identifier_info (@tracking_identifiers) {
182 my $tracking_identifier = $identifier_info->[0];
183 my $material = $identifier_info->[1];
185 my $tracking_obj = CXGN
::Stock
::TrackingActivity
::TrackingIdentifier
->new({
187 phenome_schema
=> $phenome_schema,
188 tracking_identifier
=> $tracking_identifier,
189 material
=> $material,
190 project_id
=> $project_id,
194 my $return = $tracking_obj->store();
196 $c->stash->{rest
} = {error_string
=> "Error generating tracking identifier",};
201 $c->stash->{rest
} = { success
=> 1};
206 sub activity_info_save
: Path
('/ajax/tracking_activity/save') : ActionClass
('REST'){ }
208 sub activity_info_save_POST
: Args
(0) {
213 $c->stash->{rest
} = { error
=> "You must be logged in to add new information." };
216 if (!($c->user()->has_role('submitter') or $c->user()->has_role('curator'))) {
217 $c->stash->{rest
} = { error
=> "You do not have sufficient privileges to record new information." };
221 my $user_id = $c->user()->get_object()->get_sp_person_id();
223 my $tracking_identifier = $c->req->param("tracking_identifier");
224 my $selected_type = $c->req->param("selected_type");
225 my $input = $c->req->param("input");
226 my $notes = $c->req->param("notes");
227 my $record_timestamp = $c->req->param("record_timestamp");
229 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
231 my $add_activity_info = CXGN
::Stock
::TrackingActivity
::ActivityInfo
->new({
233 tracking_identifier
=> $tracking_identifier,
234 selected_type
=> $selected_type,
236 timestamp
=> $record_timestamp,
237 operator_id
=> $user_id,
240 my $return = $add_activity_info->add_info();
241 # print STDERR "ADD INFO =".Dumper ($add_activity_info->add_info())."\n";
244 $c->stash->{rest
} = {error
=> "Error saving info",};
247 $c->stash->{rest
} = $return;
253 sub get_activity_details
:Path
('/ajax/tracking_activity/details') :Args
(1) {
256 my $identifier_id = shift;
257 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
258 my $dbh = $c->dbc->dbh;
261 my $tracking_activities = $c->config->{tracking_activities
};
262 my @activity_types = split ',',$tracking_activities;
264 my $tracking_data_json_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'tracking_tissue_culture_json', 'stock_property')->cvterm_id();
265 my $activity_info_rs = $schema->resultset("Stock::Stockprop")->find({stock_id
=> $identifier_id, type_id
=> $tracking_data_json_cvterm_id});
266 if ($activity_info_rs) {
267 my $activity_json = $activity_info_rs->value();
268 my $info = JSON
::Any
->jsonToObj($activity_json);
269 my %info_hash = %{$info};
270 foreach my $type (@activity_types){
272 my @each_type_details = ();
273 my $each_timestamp_string;
274 my $each_type_string;
275 if ($info_hash{$type}) {
276 my @each_type_details = ();
278 my %details_hash = ();
279 $details = $info_hash{$type};
280 %details_hash = %{$details};
281 # print STDERR "DETAILS HASH =".Dumper(\%details_hash);
282 foreach my $timestamp (sort keys %details_hash) {
283 my @each_timestamp_details = ();
284 push @each_timestamp_details, "timestamp".":"."".$timestamp;
285 my $operator_id = $details_hash{$timestamp}{'operator_id'};
287 my $person= CXGN
::People
::Person
->new($dbh, $operator_id);
288 my $operator_name = $person->get_first_name()." ".$person->get_last_name();
290 push @each_timestamp_details, "operator".":"."".$operator_name;
291 my $input = $details_hash{$timestamp}{'input'};
292 push @each_timestamp_details, "count".":"."".$input;
293 my $notes = $details_hash{$timestamp}{'notes'};
294 push @each_timestamp_details, "notes".":"."".$notes;
296 push @each_timestamp_details, $empty_string;
298 $each_timestamp_string = join("<br>", @each_timestamp_details);
299 push @each_type_details, $each_timestamp_string;
302 $each_type_string = join("<br>", @each_type_details);
303 # print STDERR "EACH TYPE STRING =".Dumper($each_type_string)."\n";
304 push @details, $each_type_string;
307 push @details, $empty_string;
311 foreach my $type (@activity_types) {
317 push @all_details, [@details];
319 # print STDERR "ALL DETAILS =".Dumper(\@all_details)."\n";
321 $c->stash->{rest
} = { data
=> \
@all_details };
326 sub get_activity_summary
:Path
('/ajax/tracking_activity/summary') :Args
(1) {
329 my $identifier_id = shift;
330 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
333 my $tracking_activities = $c->config->{tracking_activities
};
334 my @activity_types = split ',',$tracking_activities;
336 my $tracking_data_json_cvterm_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'tracking_tissue_culture_json', 'stock_property')->cvterm_id();
337 my $activity_info_rs = $schema->resultset("Stock::Stockprop")->find({stock_id
=> $identifier_id, type_id
=> $tracking_data_json_cvterm_id});
338 if ($activity_info_rs) {
340 my $activity_json = $activity_info_rs->value();
341 my $info = JSON
::Any
->jsonToObj($activity_json);
342 my %info_hash = %{$info};
343 foreach my $type (@activity_types){
345 my @each_type_details = ();
346 my $each_timestamp_string;
347 my $each_type_string;
348 if ($info_hash{$type}) {
350 my %details_hash = ();
351 $details = $info_hash{$type};
352 %details_hash = %{$details};
354 foreach my $key (keys %details_hash) {
355 $input += $details_hash{$key}{'input'};
357 push @summary, $input;
359 push @summary, $input;
363 foreach my $type (@activity_types) {
369 push @all_summary, [@summary];
371 $c->stash->{rest
} = { data
=> \
@all_summary };
375 sub get_project_active_identifiers
:Path
('/ajax/tracking_activity/project_active_identifiers') :Args
(1) {
378 my $project_id = shift;
379 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
380 my $tracking_activities = $c->config->{tracking_activities
};
381 my @activity_types = split ',',$tracking_activities;
383 my $activity_project = CXGN
::TrackingActivity
::ActivityProject
->new(bcs_schema
=> $schema, trial_id
=> $project_id);
384 my $all_identifier_info = $activity_project->get_project_active_identifiers();
386 foreach my $identifier_info (@
$all_identifier_info) {
388 my $identifier_id = $identifier_info->[0];
389 my $identifier_name = $identifier_info->[1];
390 my $material_id = $identifier_info->[2];
391 my $material_name = $identifier_info->[3];
392 push @row, qq{<a href
="/activity/details/$identifier_id">$identifier_name</a
>};
393 push @row, qq{<a href
="/stock/$material_id/view">$material_name</a
>};
394 my $progress = $identifier_info->[5];
397 my $progress_ref = JSON
::Any
->jsonToObj($progress);
398 my %progress_hash = %{$progress_ref};
399 foreach my $type (@activity_types){
400 if ($progress_hash{$type}) {
402 my %details_hash = ();
403 $details = $progress_hash{$type};
404 %details_hash = %{$details};
406 foreach my $key (keys %details_hash) {
407 $input += $details_hash{$key}{'input'};
415 foreach my $type (@activity_types) {
419 push @row, $identifier_name;
420 push @all_identifiers,[@row];
423 $c->stash->{rest
} = { data
=> \
@all_identifiers };
428 sub get_project_active_identifier_names
:Path
('/ajax/tracking_activity/project_active_identifier_names') :Args
(1) {
431 my $project_id = shift;
432 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado');
434 my $activity_project = CXGN
::TrackingActivity
::ActivityProject
->new(bcs_schema
=> $schema, trial_id
=> $project_id);
435 my $all_identifier_info = $activity_project->get_project_active_identifiers();
436 my @identifier_names;
437 foreach my $identifier_info (@
$all_identifier_info) {
438 push @identifier_names, $identifier_info->[1];
441 $c->stash->{rest
} = { data
=> \
@identifier_names };