Commit | Line | Data |
88f2d2fd |
1 | package SQL::Translator::Producer::Turnkey; |
c00bb9f8 |
2 | |
dd6fb3de |
3 | # ------------------------------------------------------------------- |
0f4ffe35 |
4 | # $Id: Turnkey.pm,v 1.26 2004-02-17 08:40:18 allenday Exp $ |
dd6fb3de |
5 | # ------------------------------------------------------------------- |
977651a5 |
6 | # Copyright (C) 2002-4 SQLFairy Authors |
dd6fb3de |
7 | # |
8 | # This program is free software; you can redistribute it and/or |
9 | # modify it under the terms of the GNU General Public License as |
10 | # published by the Free Software Foundation; version 2. |
11 | # |
12 | # This program is distributed in the hope that it will be useful, but |
13 | # WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | # General Public License for more details. |
16 | # |
17 | # You should have received a copy of the GNU General Public License |
18 | # along with this program; if not, write to the Free Software |
19 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
20 | # 02111-1307 USA |
21 | # ------------------------------------------------------------------- |
22 | |
c00bb9f8 |
23 | use strict; |
24 | use vars qw[ $VERSION $DEBUG ]; |
0f4ffe35 |
25 | $VERSION = sprintf "%d.%02d", q$Revision: 1.26 $ =~ /(\d+)\.(\d+)/; |
c00bb9f8 |
26 | $DEBUG = 1 unless defined $DEBUG; |
27 | |
28 | use SQL::Translator::Schema::Constants; |
d8dc07e7 |
29 | use SQL::Translator::Schema::Graph; |
30 | use SQL::Translator::Schema::Graph::HyperEdge; |
65157eda |
31 | use Log::Log4perl; Log::Log4perl::init('/etc/log4perl.conf'); |
c00bb9f8 |
32 | use Data::Dumper; |
33 | use Template; |
34 | |
d8dc07e7 |
35 | my %producer2dsn = ( |
c00bb9f8 |
36 | MySQL => 'mysql', |
37 | PostgreSQL => 'Pg', |
38 | Oracle => 'Oracle', |
39 | ); |
40 | |
41 | # ------------------------------------------------------------------- |
42 | sub produce { |
1da10402 |
43 | my $log = Log::Log4perl->get_logger('SQL.Translator.Producer.Turnkey'); |
65157eda |
44 | |
c00bb9f8 |
45 | my $t = shift; |
46 | my $create = undef; |
c00bb9f8 |
47 | my $args = $t->producer_args; |
d8dc07e7 |
48 | my $no_comments = $t->no_comments; |
49 | my $baseclass = $args->{'main_pkg_name'} || $t->format_package_name('DBI'); |
65157eda |
50 | my $graph = SQL::Translator::Schema::Graph->new(translator => $t, |
51 | baseclass => $baseclass |
52 | ); |
c00bb9f8 |
53 | |
88f2d2fd |
54 | my $parser_type = (split /::/, $t->parser_type)[-1]; |
55 | |
56 | local $DEBUG = $t->debug; |
57 | |
58 | my %meta = ( |
59 | format_fk => $t->format_fk_name, |
bed83b64 |
60 | format_package => $t->format_package_name, |
43167a31 |
61 | format_table => $t->format_table_name, |
88f2d2fd |
62 | template => $args->{'template'} || '', |
d8dc07e7 |
63 | baseclass => $baseclass, |
35276d8c |
64 | db_dsn => $args->{'db_dsn'} || '', |
88f2d2fd |
65 | db_user => $args->{'db_user'} || '', |
66 | db_pass => $args->{'db_pass'} || '', |
cf927f90 |
67 | db_str => $args->{'db_str'} || '', |
88f2d2fd |
68 | parser => $t->parser_type, |
69 | producer => __PACKAGE__, |
d8dc07e7 |
70 | dsn => $args->{'dsn'} || sprintf( 'dbi:%s:_', $producer2dsn{ $parser_type } |
71 | ? $producer2dsn{ $parser_type } |
88f2d2fd |
72 | : $parser_type |
73 | ) |
74 | ); |
75 | |
69c7a62f |
76 | # |
c8515c9f |
77 | # create methods |
69c7a62f |
78 | # |
d8dc07e7 |
79 | foreach my $node_from ($graph->node_values){ |
65157eda |
80 | |
81 | next unless $node_from->table->is_data or !$node_from->table->is_trivial_link; |
82 | |
88f2d2fd |
83 | foreach my $cedge ( $node_from->compoundedges ){ |
69c7a62f |
84 | |
d8dc07e7 |
85 | my $hyperedge = SQL::Translator::Schema::Graph::HyperEdge->new(); |
c8515c9f |
86 | |
d8dc07e7 |
87 | my $node_to; |
88f2d2fd |
88 | foreach my $edge ($cedge->edges){ |
89 | if($edge->thisnode->name eq $node_from->name){ |
90 | $hyperedge->vianode($edge->thatnode); |
c8515c9f |
91 | |
88f2d2fd |
92 | if($edge->thatnode->name ne $cedge->via->name){ |
d8dc07e7 |
93 | $node_to ||= $graph->node($edge->thatnode->table->name); |
88f2d2fd |
94 | } |
c8515c9f |
95 | |
d8dc07e7 |
96 | $hyperedge->push_thisnode($edge->thisnode); |
97 | $hyperedge->push_thisfield($edge->thisfield); |
98 | $hyperedge->push_thisviafield($edge->thatfield); |
c8515c9f |
99 | |
88f2d2fd |
100 | } else { |
88f2d2fd |
101 | if($edge->thisnode->name ne $cedge->via->name){ |
d8dc07e7 |
102 | $node_to ||= $graph->node($edge->thisnode->table->name); |
88f2d2fd |
103 | } |
d8dc07e7 |
104 | $hyperedge->push_thatnode($edge->thisnode); |
105 | $hyperedge->push_thatfield($edge->thisfield); |
106 | $hyperedge->push_thatviafield($edge->thatfield); |
88f2d2fd |
107 | } |
65157eda |
108 | $log->debug($edge->thisfield->name); |
109 | $log->debug($edge->thatfield->name); |
88f2d2fd |
110 | } |
65157eda |
111 | |
88f2d2fd |
112 | if($hyperedge->count_thisnode == 1 and $hyperedge->count_thatnode == 1){ $hyperedge->type('one2one') } |
113 | elsif($hyperedge->count_thisnode > 1 and $hyperedge->count_thatnode == 1){ $hyperedge->type('many2one') } |
114 | elsif($hyperedge->count_thisnode == 1 and $hyperedge->count_thatnode > 1){ $hyperedge->type('one2many') } |
115 | elsif($hyperedge->count_thisnode > 1 and $hyperedge->count_thatnode > 1){ $hyperedge->type('many2many') } |
116 | |
1da10402 |
117 | $log->debug($_) foreach sort keys %::SQL::Translator::Schema::Graph::HyperEdge::; |
65157eda |
118 | |
119 | #node_to won't always be defined b/c of multiple edges to a single other node |
120 | if(defined($node_to)){ |
121 | $log->debug($node_from->name); |
122 | $log->debug($node_to->name); |
123 | |
124 | if(scalar($hyperedge->thisnode) > 1){ |
125 | $log->debug($hyperedge->type ." via ". $hyperedge->vianode->name); |
126 | my $i = 0; |
127 | foreach my $thisnode ( $hyperedge->thisnode ){ |
128 | $log->debug($thisnode->name .' '. |
129 | $hyperedge->thisfield_index(0)->name .' -> '. |
130 | $hyperedge->thisviafield_index($i)->name .' '. |
131 | $hyperedge->vianode->name .' '. |
132 | $hyperedge->thatviafield_index(0)->name .' <- '. |
133 | $hyperedge->thatfield_index(0)->name .' '. |
134 | $hyperedge->thatnode_index(0)->name ."\n" |
135 | ); |
136 | $i++; |
137 | } |
d8dc07e7 |
138 | } |
65157eda |
139 | $node_from->push_hyperedges($hyperedge); |
d8dc07e7 |
140 | } |
88f2d2fd |
141 | } |
c8515c9f |
142 | } |
d8dc07e7 |
143 | $meta{"nodes"} = $graph->node; |
88f2d2fd |
144 | return(translateForm($t, \%meta)); |
c00bb9f8 |
145 | } |
146 | |
d8dc07e7 |
147 | sub translateForm { |
148 | my $t = shift; |
149 | my $meta = shift; |
a0249514 |
150 | |
d8dc07e7 |
151 | my $args = $t->producer_args; |
152 | my $type = $meta->{'template'}; |
bc0cf6eb |
153 | |
d8dc07e7 |
154 | my $template = Template->new({ |
bc0cf6eb |
155 | PRE_CHOMP => 1, |
156 | POST_CHOMP => 0, |
157 | EVAL_PERL => 1 |
158 | }); |
d8dc07e7 |
159 | |
bc0cf6eb |
160 | my $tt2; |
161 | $tt2 = template($type); |
d8dc07e7 |
162 | my $result; |
bc0cf6eb |
163 | |
164 | if($type eq 'atomtemplate'){ |
165 | my %result; |
166 | foreach my $node (values %{ $meta->{'nodes'} }){ |
167 | $result = ''; |
168 | my $param = { node => $node }; |
169 | $template->process(\$tt2, $param, \$result) || die $template->error(); |
170 | $result =~ s/^\s*(.+)\s*$/$1/s; |
171 | next unless $result; |
bc0cf6eb |
172 | $result{$node->table->name} = $result; |
bc0cf6eb |
173 | } |
56d46c5c |
174 | return \%result; |
bc0cf6eb |
175 | } else { |
176 | $template->process(\$tt2, $meta, \$result) || die $template->error(); |
177 | } |
178 | |
d8dc07e7 |
179 | return($result); |
180 | } |
181 | |
182 | 1; |
183 | |
184 | # ------------------------------------------------------------------- |
185 | |
186 | =pod |
187 | |
188 | =head1 NAME |
189 | |
190 | SQL::Translator::Producer::Turnkey - create Turnkey classes from schema |
191 | |
192 | =head1 SYNOPSIS |
193 | |
194 | Creates output for use with the Turnkey project. |
195 | |
196 | =head1 SEE ALSO |
197 | |
198 | L<http://turnkey.sourceforge.net>. |
199 | |
200 | =head1 AUTHORS |
201 | |
202 | Allen Day E<lt>allenday@ucla.eduE<gt> |
d8dc07e7 |
203 | Brian O\'Connor E<lt>brian.oconnor@excite.comE<gt>. |
204 | |
205 | =cut |
206 | |
207 | sub template { |
208 | my $type = shift; |
209 | |
c00bb9f8 |
210 | ########################################### |
211 | # Here documents for the tt2 templates # |
212 | ########################################### |
213 | |
a0249514 |
214 | if($type eq 'dbi'){ |
d8dc07e7 |
215 | return <<EOF; |
88f2d2fd |
216 | [% MACRO printPackage(node) BLOCK %] |
217 | # -------------------------------------------- |
218 | |
219 | package [% node.name %]; |
220 | use base '[% node.base %]'; |
221 | use Class::DBI::Pager; |
222 | |
223 | [% node.name %]->set_up_table('[% node.table.name %]'); |
224 | [% printPKAccessors(node.primary_key, node.table.name) %] |
225 | [% printHasA(node.edges, node) %] |
226 | [% printHasMany(node.edges, node) %] |
227 | [% printHasCompound(node.compoundedges, node.hyperedges, node.name) %] |
65157eda |
228 | [% #printHasFriendly(node) %] |
88f2d2fd |
229 | [% END %] |
230 | |
a0249514 |
231 | # MACRO |
232 | |
88f2d2fd |
233 | [% MACRO printPKAccessors(array, name) BLOCK %] |
234 | # |
235 | # Primary key accessors |
236 | # |
237 | [% FOREACH item = array %] |
238 | sub id { shift->[% item %] } |
239 | sub [% name %] { shift->[% item %] } |
240 | [% END %] |
65157eda |
241 | |
88f2d2fd |
242 | [% END %] |
243 | |
244 | [% MACRO printHasA(edges, name) BLOCK %] |
245 | # |
246 | # Has A |
247 | # |
65157eda |
248 | |
88f2d2fd |
249 | [% FOREACH edge = edges %] |
65157eda |
250 | [% IF edge.type == 'import' %] |
88f2d2fd |
251 | [% node.name %]->has_a([% edge.thisfield.name %] => '[% edge.thatnode.name %]'); |
65157eda |
252 | [% IF node.has(edge.thatnode.name) < 2 %] |
88f2d2fd |
253 | sub [% edge.thatnode.table.name %] { return shift->[% edge.thisfield.name %] } |
65157eda |
254 | [% ELSE %] |
88f2d2fd |
255 | sub [% format_fk(edge.thisnode.table.name,edge.thisfield.name) %] { return shift->[% edge.thisfield.name %] } |
65157eda |
256 | [% END %] |
257 | |
258 | [% END %] |
88f2d2fd |
259 | [% END %] |
65157eda |
260 | |
88f2d2fd |
261 | [% END %] |
262 | |
263 | [% MACRO printHasMany(edges, node) BLOCK %] |
264 | # |
265 | # Has Many |
266 | # |
65157eda |
267 | |
88f2d2fd |
268 | [% FOREACH edge = edges %] |
65157eda |
269 | [% IF edge.type == 'export' %] |
a0249514 |
270 | [% node.name %]->has_many('[% edge.thatnode.table.name %]_[% edge.thatfield.name %]', '[% edge.thatnode.name %]' => '[% edge.thatfield.name %]'); |
65157eda |
271 | [% IF node.via(edge.thatnode.name) >= 1 %] |
88f2d2fd |
272 | sub [% edge.thatnode.table.name %]_[% format_fk(edge.thatnode.table.name,edge.thatfield.name) %]s { return shift->[% edge.thatnode.table.name %]_[% edge.thatfield.name %] } |
65157eda |
273 | [% ELSIF edge.thatnode.table.is_data %] |
274 | [% IF node.edgecount(edge.thatnode.name) > 1 %] |
275 | sub [% edge.thatnode.table.name %]_[% format_fk(edge.thatnode.name,edge.thatfield.name) %]s { return shift->[% edge.thatnode.table.name %]_[% edge.thatfield.name %] } |
276 | [% ELSE %] |
88f2d2fd |
277 | sub [% edge.thatnode.table.name %]s { return shift->[% edge.thatnode.table.name %]_[% edge.thatfield.name %] } |
65157eda |
278 | [% END %] |
279 | [% END %] |
280 | |
281 | [% END %] |
88f2d2fd |
282 | [% END %] |
65157eda |
283 | |
88f2d2fd |
284 | [% END %] |
285 | |
286 | [% MACRO printHasCompound(cedges,hedges,name) BLOCK %] |
287 | # |
288 | # Has Compound Many |
289 | # |
290 | [% FOREACH cedge = cedges %] |
291 | [% FOREACH edge = cedge.edges %] |
65157eda |
292 | [% NEXT IF edge.thisnode.name != name %] |
88f2d2fd |
293 | sub [% cedge.via.table.name %]_[% format_fk(edge.thatnode.table.name,edge.thatfield.name) %]s { return shift->[% cedge.via.table.name %]_[% edge.thatfield.name %] } |
294 | [% END %] |
295 | [% END %] |
65157eda |
296 | |
88f2d2fd |
297 | [% FOREACH h = hedges %] |
65157eda |
298 | ########## [% h.type %] ########## |
299 | [% IF h.type == 'one2one' %] |
300 | sub [% h.thatnode.table.name %]s { my \$self = shift; return map \$_->[% h.thatviafield.name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield.name %] } |
301 | |
302 | [% ELSIF h.type == 'one2many' %] |
303 | [% thisnode = h.thisnode_index(0) %] |
304 | [% i = 0 %] |
305 | [% FOREACH thatnode = h.thatnode %] |
306 | #[% thisnode.name %]::[% h.thisfield_index(0).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(0).name %] <- [% h.thatnode_index(0).name %]::[% h.thatfield_index(0).name %] |
307 | sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my \$self = shift; return map \$_->[% h.thatviafield_index(0).name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } |
308 | [% i = i + 1 %] |
309 | [% END %] |
310 | |
311 | [% ELSIF h.type == 'many2one' %] |
312 | [% i = 0 %] |
d8dc07e7 |
313 | [% FOREACH thisnode = h.thisnode %] |
65157eda |
314 | #[% thisnode.name %]::[% h.thisfield_index(0).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(0).name %] <- [% h.thatnode_index(0).name %]::[% h.thatfield_index(0).name %] |
315 | sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my \$self = shift; return map \$_->[% h.thatviafield_index(0).name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } |
316 | [% i = i + 1 %] |
317 | |
d8dc07e7 |
318 | [% END %] |
65157eda |
319 | |
320 | [% ELSIF h.type == 'many2many' %] |
321 | [% i = 0 %] |
322 | [% FOREACH thisnode = h.thisnode %] |
323 | [% j = 0 %] |
324 | [% FOREACH thatnode = h.thatnode %] |
325 | #[% thisnode.name %]::[% h.thisfield_index(i).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(j).name %] <- [% h.thatnode_index(j).name %]::[% h.thatfield_index(j).name %] |
326 | sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(j).name) %]s { my \$self = shift; return map \$_->[% %], \$self->[% %] } |
327 | [% j = j + 1 %] |
328 | |
329 | [% END %] |
330 | [% i = i + 1 %] |
331 | [% END %] |
332 | [% END %] |
88f2d2fd |
333 | [% END %] |
65157eda |
334 | |
88f2d2fd |
335 | [% END %] |
336 | |
d8dc07e7 |
337 | [% MACRO printHasFriendly(node) BLOCK %] |
338 | # |
339 | # Has Friendly |
340 | # |
a0249514 |
341 | |
d8dc07e7 |
342 | [% END %] |
343 | |
88f2d2fd |
344 | [% MACRO printList(array) BLOCK %][% FOREACH item = array %][% item %] [% END %][% END %] |
345 | package [% baseclass %]; |
346 | |
347 | # Created by SQL::Translator::Producer::Turnkey |
348 | # Template used: classdbi |
349 | |
350 | use strict; |
351 | use base qw(Class::DBI::Pg); |
352 | |
35276d8c |
353 | [% baseclass %]->set_db('Main', '[% db_dsn %]', '[% db_user %]', '[% db_pass %]', {AutoCommit=>1}); |
edee0655 |
354 | sub search_ilike { shift->_do_search(ILIKE => [% "\@\_" %] ) } |
355 | |
88f2d2fd |
356 | |
357 | [% FOREACH node = nodes %] |
358 | [% printPackage(node.value) %] |
359 | [% END %] |
360 | EOF |
a0249514 |
361 | } |
362 | |
363 | |
364 | elsif($type eq 'atom'){ |
88f2d2fd |
365 | |
d8dc07e7 |
366 | return <<'EOF'; |
c00bb9f8 |
367 | [% ###### DOCUMENT START ###### %] |
368 | |
a0249514 |
369 | [% FOREACH node = nodes %] |
63c988ed |
370 | [% IF !node.value.is_trivial_link %] |
c00bb9f8 |
371 | |
372 | ############################################## |
373 | |
a0249514 |
374 | package Turnkey::Atom::[% node.value.name FILTER replace "Turnkey::Model::", "" %]; |
c00bb9f8 |
375 | |
a0249514 |
376 | [% pname = node.value.name FILTER replace "Turnkey::Model::", "" %] |
63c988ed |
377 | |
a0249514 |
378 | use base qw(Turnkey::Atom); |
c00bb9f8 |
379 | use Data::Dumper; |
380 | |
381 | sub can_render { |
382 | return 1; |
383 | } |
384 | |
385 | sub render { |
386 | my $self = shift; |
387 | my $dbobject = shift; |
c01582e9 |
388 | |
389 | # Assumption here that if it's not rendering on it's own dbobject |
390 | # then it's a list. This will be updated when AtomLists are implemented -boconnor |
a0249514 |
391 | if(ref($dbobject) eq 'Turnkey::Model::[% pname %]') { |
c01582e9 |
392 | $self->focus('yes'); |
c00bb9f8 |
393 | return(_render_record($dbobject)); |
394 | } |
395 | else { return(_render_list($dbobject)); } |
396 | } |
397 | |
398 | sub _render_record { |
399 | my $dbobject = shift; |
400 | my @output = (); |
401 | my $row = {}; |
402 | my $field_hash = {}; |
8bba52b2 |
403 | |
404 | #data |
a0249514 |
405 | [% FOREACH value = node.value.data_fields %] |
8bba52b2 |
406 | [% IF value != 1 %] |
407 | $field_hash->{[% value %]} = $dbobject->[% value %](); |
408 | [% END %] |
409 | [% END %] |
410 | |
411 | #keys |
412 | [% FOREACH value = node.value.edges %] |
413 | [% NEXT IF value.type != 'import' %] |
414 | $field_hash->{[% value.thisfield.name %]} = $dbobject->[% value.thisfield.name %](); |
415 | [% END %] |
416 | |
c00bb9f8 |
417 | $row->{data} = $field_hash; |
418 | $row->{id} = $dbobject->id(); |
419 | push @output, $row; |
420 | return(\@output); |
421 | } |
422 | |
423 | sub _render_list { |
424 | my $dbobject = shift; |
425 | my @output = (); |
88f2d2fd |
426 | my @objects = $dbobject->[% node.key %]s; |
c01582e9 |
427 | foreach my $object (@objects){ |
c00bb9f8 |
428 | my $row = {}; |
c01582e9 |
429 | my $field_hash = {}; |
8bba52b2 |
430 | |
c01582e9 |
431 | #data |
8bba52b2 |
432 | [% FOREACH value = node.value.data_fields %] |
433 | [% IF value != 1 %] |
c01582e9 |
434 | $field_hash->{[% value %]} = $object->[% value %](); |
8bba52b2 |
435 | [% END %] |
436 | [% END %] |
437 | |
c01582e9 |
438 | #keys |
439 | [% FOREACH value = node.value.edges %] |
440 | [% NEXT IF value.type != 'import' %] |
441 | $field_hash->{[% value.thisfield.name %]} = $object->[% value.thisfield.name %](); |
442 | [% END %] |
8bba52b2 |
443 | |
c00bb9f8 |
444 | $row->{data} = $field_hash; |
c01582e9 |
445 | $row->{id} = $object->id(); |
446 | push @output, $row; |
447 | } |
c00bb9f8 |
448 | return(\@output); |
449 | } |
450 | |
451 | sub head { |
452 | return 1; |
453 | } |
454 | |
455 | 1; |
a0249514 |
456 | [% END %] |
c00bb9f8 |
457 | [% END %] |
458 | EOF |
459 | |
d8dc07e7 |
460 | } elsif($type eq 'xml'){ |
461 | return <<EOF; |
c00bb9f8 |
462 | <?xml version="1.0" encoding="UTF-8"?> |
63c988ed |
463 | <!DOCTYPE Turnkey SYSTEM "Turnkey.dtd"> |
464 | <Turnkey> |
c00bb9f8 |
465 | |
466 | <!-- The basic layout is fixed --> |
467 | <container bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" height="90%" orientation="vertical" type="root" width="100%" xlink:label="RootContainer"> |
468 | <container cellpadding="3" cellspacing="0" orientation="horizontal" type="container" height="100%" width="100%" xlink:label="MiddleContainer"> |
469 | <container align="center" cellpadding="2" cellspacing="0" class="leftbar" orientation="vertical" type="minor" width="0%" xlink:label="MidLeftContainer"/> |
470 | <container cellpadding="0" cellspacing="0" orientation="vertical" width="100%" type="major" xlink:label="MainContainer"/> |
471 | </container> |
472 | </container> |
473 | |
474 | <!-- Atom Classes --> |
63c988ed |
475 | [% FOREACH node = nodes %] |
476 | [% IF !node.value.is_trivial_link %] |
43167a31 |
477 | <atom class="Turnkey::Atom::[% format_table(node.key) %]" name="[% format_table(node.key) %]" xlink:label="[% format_table(node.key) %]Atom"/> |
69c7a62f |
478 | [%- END -%] |
63c988ed |
479 | [% END %] |
c00bb9f8 |
480 | |
481 | <!-- Atom Bindings --> |
482 | <atomatombindings> |
63c988ed |
483 | [% FOREACH focus_atom = nodes %] |
484 | [% IF !focus_atom.value.is_trivial_link %] |
485 | [% FOREACH link_atom = focus_atom.value.hyperedges %] |
43167a31 |
486 | <atomatombinding xlink:from="#[% format_table(focus_atom.key) %]Atom" xlink:to="#[% format_table(link_atom.thatnode.table.name) %]Atom" xlink:label="[% format_table(focus_atom.key) %]Atom2[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
69c7a62f |
487 | [%- END -%] |
63c988ed |
488 | [% previous = "" %] |
489 | [% FOREACH link_atom = focus_atom.value.edges %] |
490 | [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name && link_atom.thatnode.table.name != "" %] |
43167a31 |
491 | <atomatombinding xlink:from="#[% format_table(focus_atom.key) %]Atom" xlink:to="#[% format_table(link_atom.thatnode.table.name) %]Atom" xlink:label="[% format_table(focus_atom.key) %]Atom2[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
492 | [% previous = link_atom.thatnode.table.name %] |
493 | [% END %] |
494 | [%- END %] |
69c7a62f |
495 | [%- END -%] |
63c988ed |
496 | [% END %] |
c00bb9f8 |
497 | </atomatombindings> |
498 | |
499 | <atomcontainerbindings> |
63c988ed |
500 | [% FOREACH focus_atom = nodes %] |
501 | [% IF !focus_atom.value.is_trivial_link %] |
43167a31 |
502 | <atomcontainerbindingslayout xlink:label="Turnkey::Model::[% format_table(focus_atom.key) %]"> |
63c988ed |
503 | [% FOREACH link_atom = focus_atom.value.hyperedges %] |
43167a31 |
504 | <atomcontainerbinding xlink:from="#MidLeftContainer" xlink:label="MidLeftContainer2[% format_table(link_atom.thatnode.table.name) %]Atom" xlink:to="#[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
505 | [%- END%] |
506 | [% previous = "" %] |
507 | [% FOREACH link_atom = focus_atom.value.edges %] |
508 | [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name %] |
43167a31 |
509 | <atomcontainerbinding xlink:from="#MidLeftContainer" xlink:label="MidLeftContainer2[% format_table(link_atom.thatnode.table.name) %]Atom" xlink:to="#[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
510 | [% previous = link_atom.thatnode.table.name %] |
511 | [% END %] |
512 | [%- END %] |
43167a31 |
513 | <atomcontainerbinding xlink:from="#MainContainer" xlink:label="MainContainer2[% format_table(focus_atom.key) %]Atom" xlink:to="#[% format_table(focus_atom.key) %]Atom"/> |
69c7a62f |
514 | </atomcontainerbindingslayout> |
63c988ed |
515 | [%- END %] |
516 | [% END %] |
69c7a62f |
517 | </atomcontainerbindings> |
518 | |
519 | <uribindings> |
63c988ed |
520 | <uribinding uri="/" class="Turnkey::Util::Frontpage"/> |
69c7a62f |
521 | </uribindings> |
522 | |
523 | <classbindings> |
63c988ed |
524 | [% FOREACH focus_atom = nodes %] |
525 | [% IF !focus_atom.value.is_trivial_link %] |
43167a31 |
526 | <classbinding class="Turnkey::Model::[% format_table(focus_atom.key) %]" plugin="#[% format_table(focus_atom.key) %]Atom" rank="0"/> |
69c7a62f |
527 | [%- END -%] |
63c988ed |
528 | [% END %] |
69c7a62f |
529 | </classbindings> |
c00bb9f8 |
530 | |
63c988ed |
531 | </Turnkey> |
c00bb9f8 |
532 | EOF |
533 | |
d8dc07e7 |
534 | } elsif($type eq 'template'){ |
535 | return <<'EOF'; |
c00bb9f8 |
536 | [% TAGS [- -] %] |
537 | [% MACRO renderpanel(panel,dbobject) BLOCK %] |
538 | <!-- begin panel: [% panel.label %] --> |
539 | <table border="0" width="[% panel.width %]" height="[% panel.height %]" bgcolor="[% panel.bgcolor %]" valign="top" cellpadding="[% panel.cellpadding %]" cellspacing="[% panel.cellspacing %]" align="[% panel.align %]" valign="[% panel.valign %]"> |
540 | <tr> |
541 | [% FOREACH p = panel.containers %] |
542 | [% IF p.can_render(panel) %] |
543 | <td valign="top" class="[% p.class %]" align="[% panel.align %]" height="[% p.height || 1 %]" width="[% p.width %]"> |
544 | [% IF p.type == 'Container' %] |
545 | [% renderpanel(p,dbobject) %] |
546 | [% ELSE %] |
547 | <table cellpadding="0" cellspacing="0" align="left" height="100%" width="100%"> |
548 | [% IF p.name %] |
304d682b |
549 | <tr class="dbtabletitle" height="1"> |
550 | <td class="dbtabletitle">[% p.name %][% IF panel.type == 'major' %]: [% dbobject.name %][% END %]</td> |
551 | <td align="right" width="0"></td> |
c00bb9f8 |
552 | </tr> |
553 | [% END %] |
304d682b |
554 | <tr><td colspan="2" class="dbtablerow"> |
c00bb9f8 |
555 | <!-- begin atom: [% p.label %] --> |
556 | <table cellpadding="0" cellspacing="0" align="left" height="100%" width="100%"><!-- [% ref(atom) %] [% ref(dbobject) %] --> |
557 | [% renderatom(p,dbobject) %] <!-- used to be renderplugin(p,panel) --> |
558 | </table> |
559 | </table> |
560 | [% END %] |
561 | </td> |
562 | [% IF panel.orientation == 'vertical' %] |
563 | </tr><tr> |
564 | [% END %] |
565 | [% END %] |
566 | [% END %] |
567 | </tr> |
568 | </table> |
569 | <!-- end panel: [% panel.label %] --> |
570 | [% END %] |
8bba52b2 |
571 | [% BLOCK make_linked_dbobject %] |
572 | [% PERL %] |
573 | $stash->set(linked_dbobject => [% class %]->retrieve([% id %])); |
574 | [% END %] |
575 | [% END %] |
576 | [% MACRO obj2link(obj) SWITCH ref(obj) %] |
577 | [% CASE '' %] |
578 | [% obj %] |
579 | [% CASE DEFAULT %] |
580 | [% IF obj.name %] |
581 | <a href="[% obj2url(obj) %]">[% obj.name %]</a> |
582 | [% ELSE %] |
583 | <a href="[% obj2url(obj) %]">[% obj %]</a> |
584 | [% END %] |
585 | [% END %] |
586 | [% MACRO obj2url(obj) SWITCH obj %] |
587 | [% CASE DEFAULT %] |
588 | /?id=[% obj %];class=[% ref(obj) %] |
589 | [% END %] |
590 | [% MACRO obj2desc(obj) SWITCH ref(obj) %] |
591 | [% CASE '' %] |
592 | [% obj %] |
593 | [% CASE DEFAULT %] |
594 | [% IF obj.value %] |
595 | [% obj.value %] |
596 | [% ELSE %] |
597 | [% obj %] |
598 | [% END %] |
599 | [% END %] |
c00bb9f8 |
600 | [% MACRO renderatom(atom, dbobject) SWITCH atom.name %] |
7fbe3b98 |
601 | [- FOREACH node = nodes -] |
602 | [- IF !node.value.is_trivial_link -] |
43167a31 |
603 | [% CASE '[- format_table(node.key) -]' %] |
0f4ffe35 |
604 | [% INCLUDE [- node.key -].tt2 %] |
c00bb9f8 |
605 | [- END -] |
7fbe3b98 |
606 | [- END -] |
c00bb9f8 |
607 | [% CASE DEFAULT %] |
608 | [% renderlist(atom.render(dbobject)) %] |
609 | [% END %] |
bc0cf6eb |
610 | [% MACRO renderlist(lstArr) BLOCK %] |
611 | <tr><td><ul> |
612 | [% FOREACH item = lstArr %] |
c01582e9 |
613 | [% class = ref(atom) | replace('::Atom::', '::Model::') %] |
bc0cf6eb |
614 | [% id = item.id %] |
c01582e9 |
615 | [% PROCESS make_linked_dbobject %] |
616 | <li class="minorfocus">[% obj2link(linked_dbobject) %]</li> |
617 | [% END %] |
618 | </ul></td></tr> |
c00bb9f8 |
619 | [% END %] |
bc0cf6eb |
620 | EOF |
621 | |
622 | } elsif($type eq 'atomtemplate') { |
623 | return <<'EOF'; |
624 | [%- TAGS [- -] -%] |
625 | [-- IF !node.is_trivial_link --] |
626 | [% records = atom.render(dbobject) %] |
627 | [% rowcount = 0 %] |
628 | [% IF atom.focus == "yes" %] |
629 | [% FOREACH record = records %] |
630 | [- FOREACH field = node.data_fields -] |
631 | [- IF field != "1" -] |
632 | <tr><td class="dbfieldname">[- field -]</td><td class="dbfieldvalue">[% obj2link(fields.[- field -]) %]</td></tr> |
633 | [- END -] |
634 | [- END -] |
635 | [- FOREACH field = node.edges -] |
636 | [- NEXT IF field.type != 'import' -] |
637 | <tr><td class="dbfieldname">[- field.thisfield.name -]</td><td class="dbfieldvalue">[% obj2link(fields.[- field.thisfield.name -]) %]</td></tr> |
638 | [- END -] |
639 | [% id = record.id %] |
640 | [% IF (rowcount > 1) %] <tr><td colspan="2"><hr></td></tr> [% END %] |
641 | [% rowcount = rowcount + 1 %] |
642 | [% END %] |
643 | [% ELSE %] |
644 | <tr><td><ul> |
645 | [% FOREACH record = records %] |
8bba52b2 |
646 | [% class = ref(atom) | replace('::Atom::', '::Model::') %] |
bc0cf6eb |
647 | [% id = record.id %] |
8bba52b2 |
648 | [% PROCESS make_linked_dbobject %] |
c01582e9 |
649 | <li class="minorfocus">[% obj2link(linked_dbobject) %]</li> |
c00bb9f8 |
650 | [% END %] |
8bba52b2 |
651 | </ul></td></tr> |
c00bb9f8 |
652 | [% END %] |
bc0cf6eb |
653 | [- END -] |
c00bb9f8 |
654 | EOF |
655 | |
d8dc07e7 |
656 | } |
657 | } |
bc0cf6eb |
658 | |
659 | 1; |