Commit | Line | Data |
88f2d2fd |
1 | package SQL::Translator::Producer::Turnkey; |
c00bb9f8 |
2 | |
dd6fb3de |
3 | # ------------------------------------------------------------------- |
b046b0b9 |
4 | # $Id: Turnkey.pm,v 1.61 2004-10-13 23:14:06 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 ]; |
b046b0b9 |
25 | $VERSION = sprintf "%d.%02d", q$Revision: 1.61 $ =~ /(\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; |
58bf08d5 |
33 | $Data::Dumper::Maxdepth = 3; |
c00bb9f8 |
34 | use Template; |
35 | |
d8dc07e7 |
36 | my %producer2dsn = ( |
c00bb9f8 |
37 | MySQL => 'mysql', |
38 | PostgreSQL => 'Pg', |
39 | Oracle => 'Oracle', |
40 | ); |
41 | |
42 | # ------------------------------------------------------------------- |
43 | sub produce { |
b046b0b9 |
44 | |
45 | my $t = shift; |
46 | my $create = undef; |
47 | my $args = $t->producer_args; |
48 | my $no_comments = $t->no_comments; |
49 | my $baseclass = $args->{'main_pkg_name'} || $t->format_package_name('DBI'); |
50 | my $graph = SQL::Translator::Schema::Graph->new(translator => $t); |
51 | |
52 | my $parser_type = (split /::/, $t->parser_type)[-1]; |
53 | |
54 | local $DEBUG = $t->debug; |
55 | |
56 | my %meta = ( |
57 | concat => $args->{'concat'} || '', |
58 | format_fk => $t->format_fk_name, |
59 | format_package => $t->format_package_name, |
60 | format_table => $t->format_table_name, |
61 | template => $args->{'template'} || '', |
62 | baseclass => $baseclass, |
63 | db_dsn => $args->{'db_dsn'} || '', |
64 | db_user => $args->{'db_user'} || '', |
65 | db_pass => $args->{'db_pass'} || '', |
66 | db_str => $args->{'db_str'} || '', |
67 | parser => $t->parser_type, |
68 | producer => __PACKAGE__, |
69 | dsn => $args->{'dsn'} || sprintf( 'dbi:%s:_', $producer2dsn{ $parser_type } |
70 | ? $producer2dsn{ $parser_type } |
71 | : $parser_type |
72 | ) |
73 | ); |
74 | |
75 | foreach my $node ($graph->node()){ |
76 | $node->base($baseclass); |
77 | } |
78 | |
79 | $meta{"nodes"} = $graph->node; |
80 | return(translateForm($t, \%meta)); |
c00bb9f8 |
81 | } |
82 | |
d8dc07e7 |
83 | sub translateForm { |
84 | my $t = shift; |
85 | my $meta = shift; |
a0249514 |
86 | |
d8dc07e7 |
87 | my $args = $t->producer_args; |
88 | my $type = $meta->{'template'}; |
bc0cf6eb |
89 | |
d8dc07e7 |
90 | my $template = Template->new({ |
bc0cf6eb |
91 | PRE_CHOMP => 1, |
92 | POST_CHOMP => 0, |
93 | EVAL_PERL => 1 |
94 | }); |
d8dc07e7 |
95 | |
bc0cf6eb |
96 | my $tt2; |
97 | $tt2 = template($type); |
d8dc07e7 |
98 | my $result; |
bc0cf6eb |
99 | |
b046b0b9 |
100 | if ($type eq 'atomtemplate') { |
bc0cf6eb |
101 | my %result; |
b046b0b9 |
102 | foreach my $node (values %{ $meta->{'nodes'} }) { |
bc0cf6eb |
103 | $result = ''; |
104 | my $param = { node => $node }; |
105 | $template->process(\$tt2, $param, \$result) || die $template->error(); |
106 | $result =~ s/^\s*(.+)\s*$/$1/s; |
107 | next unless $result; |
bc0cf6eb |
108 | $result{$node->table->name} = $result; |
bc0cf6eb |
109 | } |
56d46c5c |
110 | return \%result; |
bc0cf6eb |
111 | } else { |
112 | $template->process(\$tt2, $meta, \$result) || die $template->error(); |
113 | } |
114 | |
919a1670 |
115 | #warn $result if $type eq 'dbi'; |
116 | |
d8dc07e7 |
117 | return($result); |
118 | } |
119 | |
120 | 1; |
121 | |
122 | # ------------------------------------------------------------------- |
123 | |
124 | =pod |
125 | |
126 | =head1 NAME |
127 | |
128 | SQL::Translator::Producer::Turnkey - create Turnkey classes from schema |
129 | |
130 | =head1 SYNOPSIS |
131 | |
132 | Creates output for use with the Turnkey project. |
133 | |
134 | =head1 SEE ALSO |
135 | |
136 | L<http://turnkey.sourceforge.net>. |
137 | |
138 | =head1 AUTHORS |
139 | |
140 | Allen Day E<lt>allenday@ucla.eduE<gt> |
82cedef0 |
141 | Brian O\'Connor E<lt>boconnor@ucla.comE<gt>. |
d8dc07e7 |
142 | |
143 | =cut |
144 | |
145 | sub template { |
146 | my $type = shift; |
147 | |
c00bb9f8 |
148 | ########################################### |
149 | # Here documents for the tt2 templates # |
150 | ########################################### |
151 | |
a0249514 |
152 | if($type eq 'dbi'){ |
8a412596 |
153 | return <<'EOF'; |
88f2d2fd |
154 | [% MACRO printPackage(node) BLOCK %] |
efcd92a3 |
155 | |
919a1670 |
156 | ########[% node.table.name | ucfirst #node.name | replace("Turnkey${concat}::Model::", '') %]######## |
88f2d2fd |
157 | |
158 | package [% node.name %]; |
159 | use base '[% node.base %]'; |
160 | use Class::DBI::Pager; |
8dff25a5 |
161 | no warnings qw(redefine); |
88f2d2fd |
162 | |
163 | [% node.name %]->set_up_table('[% node.table.name %]'); |
164 | [% printPKAccessors(node.primary_key, node.table.name) %] |
165 | [% printHasA(node.edges, node) %] |
166 | [% printHasMany(node.edges, node) %] |
167 | [% printHasCompound(node.compoundedges, node.hyperedges, node.name) %] |
65157eda |
168 | [% #printHasFriendly(node) %] |
88f2d2fd |
169 | [% END %] |
88f2d2fd |
170 | [% MACRO printPKAccessors(array, name) BLOCK %] |
171 | # |
172 | # Primary key accessors |
173 | # |
a006efcb |
174 | |
88f2d2fd |
175 | [% FOREACH item = array %] |
a006efcb |
176 | [% IF item != "id" %]sub id { shift->[% item %] }[% END %] |
177 | [% IF item != name %]sub [% name %] { shift->[% item %] }[% END %] |
88f2d2fd |
178 | [% END %] |
65157eda |
179 | |
88f2d2fd |
180 | [% END %] |
88f2d2fd |
181 | [% MACRO printHasA(edges, name) BLOCK %] |
7611bcd7 |
182 | [% FOREACH edge = edges %] |
183 | [% IF loop.first() %] |
88f2d2fd |
184 | # |
185 | # Has A |
186 | # |
65157eda |
187 | |
7611bcd7 |
188 | [% END %] |
65157eda |
189 | [% IF edge.type == 'import' %] |
88f2d2fd |
190 | [% node.name %]->has_a([% edge.thisfield.name %] => '[% edge.thatnode.name %]'); |
65157eda |
191 | [% IF node.has(edge.thatnode.name) < 2 %] |
88f2d2fd |
192 | sub [% edge.thatnode.table.name %] { return shift->[% edge.thisfield.name %] } |
65157eda |
193 | [% ELSE %] |
88f2d2fd |
194 | sub [% format_fk(edge.thisnode.table.name,edge.thisfield.name) %] { return shift->[% edge.thisfield.name %] } |
65157eda |
195 | [% END %] |
65157eda |
196 | [% END %] |
88f2d2fd |
197 | [% END %] |
65157eda |
198 | |
88f2d2fd |
199 | [% END %] |
200 | |
201 | [% MACRO printHasMany(edges, node) BLOCK %] |
7611bcd7 |
202 | [% FOREACH edge = edges %] |
203 | [% IF loop.first() %] |
88f2d2fd |
204 | # |
205 | # Has Many |
206 | # |
65157eda |
207 | |
7611bcd7 |
208 | [% END %] |
65157eda |
209 | [% IF edge.type == 'export' %] |
a0249514 |
210 | [% node.name %]->has_many('[% edge.thatnode.table.name %]_[% edge.thatfield.name %]', '[% edge.thatnode.name %]' => '[% edge.thatfield.name %]'); |
65157eda |
211 | [% IF node.via(edge.thatnode.name) >= 1 %] |
88f2d2fd |
212 | 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 |
213 | [% ELSIF edge.thatnode.table.is_data %] |
214 | [% IF node.edgecount(edge.thatnode.name) > 1 %] |
215 | sub [% edge.thatnode.table.name %]_[% format_fk(edge.thatnode.name,edge.thatfield.name) %]s { return shift->[% edge.thatnode.table.name %]_[% edge.thatfield.name %] } |
216 | [% ELSE %] |
88f2d2fd |
217 | sub [% edge.thatnode.table.name %]s { return shift->[% edge.thatnode.table.name %]_[% edge.thatfield.name %] } |
65157eda |
218 | [% END %] |
219 | [% END %] |
0be4a1f8 |
220 | |
65157eda |
221 | [% END %] |
88f2d2fd |
222 | [% END %] |
65157eda |
223 | |
88f2d2fd |
224 | [% END %] |
88f2d2fd |
225 | [% MACRO printHasCompound(cedges,hedges,name) BLOCK %] |
7611bcd7 |
226 | [% FOREACH cedge = cedges %] |
227 | [% IF loop.first() %] |
88f2d2fd |
228 | # |
229 | # Has Compound Many |
230 | # |
7611bcd7 |
231 | [% END %] |
88f2d2fd |
232 | [% FOREACH edge = cedge.edges %] |
65157eda |
233 | [% NEXT IF edge.thisnode.name != name %] |
88f2d2fd |
234 | sub [% cedge.via.table.name %]_[% format_fk(edge.thatnode.table.name,edge.thatfield.name) %]s { return shift->[% cedge.via.table.name %]_[% edge.thatfield.name %] } |
235 | [% END %] |
236 | [% END %] |
65157eda |
237 | |
7611bcd7 |
238 | [% seen = 0 %] |
88f2d2fd |
239 | [% FOREACH h = hedges %] |
7611bcd7 |
240 | [% NEXT UNLESS h.type == 'one2one' %] |
efcd92a3 |
241 | [% IF seen == 0 ; seen = 1 %]# one2one #[% END %] |
d2fd0190 |
242 | sub [% h.thatnode.table.name %]s { my $self = shift; return map $_->[% h.thatviafield.name %], $self->[% h.vianode.table.name %]_[% h.thisviafield.name %] } |
7611bcd7 |
243 | [% END %] |
65157eda |
244 | |
7611bcd7 |
245 | [% seen = 0 %] |
246 | [% FOREACH h = hedges %] |
247 | [% NEXT UNLESS h.type == 'one2many' %] |
efcd92a3 |
248 | [% IF seen == 0 ; seen = 1 %]# one2many #[% END %] |
7611bcd7 |
249 | [% thisnode = h.thisnode_index(0) %] |
250 | [% i = 0 %] |
251 | [% FOREACH thatnode = h.thatnode %] |
252 | [% NEXT UNLESS h.thisviafield_index(i).name %] |
65157eda |
253 | #[% 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 %] |
d2fd0190 |
254 | 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 %] } |
7611bcd7 |
255 | [% i = i + 1 %] |
256 | [% END %] |
257 | [% END %] |
65157eda |
258 | |
7611bcd7 |
259 | [% seen = 0 %] |
260 | [% FOREACH h = hedges %] |
261 | [% NEXT UNLESS h.type == 'many2one' %] |
efcd92a3 |
262 | [% IF seen == 0 ; seen = 1 %]# many2one #[% END %] |
7611bcd7 |
263 | [% i = 0 %] |
264 | [% FOREACH thisnode = h.thisnode %] |
65157eda |
265 | #[% 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 %] |
d2fd0190 |
266 | 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 %] } |
7611bcd7 |
267 | [% i = i + 1 %] |
268 | [% END %] |
269 | [% END %] |
65157eda |
270 | |
7611bcd7 |
271 | [% seen = 0 %] |
272 | [% FOREACH h = hedges %] |
273 | [% NEXT UNLESS h.type == 'many2many' %] |
efcd92a3 |
274 | [% IF seen == 0 ; seen = 1 %]# many2many #[% END %] |
7611bcd7 |
275 | [% i = 0 %] |
276 | [% FOREACH thisnode = h.thisnode %] |
277 | [% j = 0 %] |
278 | [% FOREACH thatnode = h.thatnode %] |
65157eda |
279 | #[% 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 %] |
d2fd0190 |
280 | 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 $_->[% h.vianode.table.name %]_[% format_fk(h.vianode,h.thatviafield_index(j).name) %]s, $self->[% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]s } |
7611bcd7 |
281 | [% j = j + 1 %] |
65157eda |
282 | [% END %] |
7611bcd7 |
283 | [% i = i + 1 %] |
65157eda |
284 | [% END %] |
88f2d2fd |
285 | [% END %] |
7a9287a9 |
286 | 1; |
88f2d2fd |
287 | [% END %] |
d8dc07e7 |
288 | [% MACRO printHasFriendly(node) BLOCK %] |
289 | # |
290 | # Has Friendly |
291 | # |
7611bcd7 |
292 | #FIXME, why aren't these being generated? |
a0249514 |
293 | |
d8dc07e7 |
294 | [% END %] |
88f2d2fd |
295 | [% MACRO printList(array) BLOCK %][% FOREACH item = array %][% item %] [% END %][% END %] |
efcd92a3 |
296 | |
ebee7d95 |
297 | ########AutoDBI######## |
919a1670 |
298 | use Turnkey[% concat %]::Model::DBI; |
efcd92a3 |
299 | [% FOREACH node = nodes %] |
300 | use [% node.value.name %]; |
301 | [% END %] |
302 | 1; |
303 | |
919a1670 |
304 | ########DBI######## |
88f2d2fd |
305 | package [% baseclass %]; |
306 | |
307 | # Created by SQL::Translator::Producer::Turnkey |
308 | # Template used: classdbi |
309 | |
310 | use strict; |
f552aa62 |
311 | use Data::Dumper; |
f890ae86 |
312 | no warnings 'redefine'; |
88f2d2fd |
313 | use base qw(Class::DBI::Pg); |
314 | |
c051e2bb |
315 | [% baseclass %]->set_db('Main', '[% db_dsn %]', '[% db_user %]', '[% db_pass %]'); |
edee0655 |
316 | sub search_ilike { shift->_do_search(ILIKE => [% "\@\_" %] ) } |
79989cde |
317 | sub search_lower { |
318 | my $c = shift; |
319 | my %q = @_; |
320 | my %t; |
321 | foreach my $k (keys %q){ |
322 | $t{"lower($k)"} = lc($q{$k}); |
323 | } |
324 | $c->_do_search(LIKE => %t); |
325 | } |
326 | |
edee0655 |
327 | |
28ae4732 |
328 | # debug method |
329 | sub dump { |
330 | my $self = shift; |
79989cde |
331 | my %arg = %{shift @_}; |
332 | $arg{'indent'} ||= 1; |
333 | $arg{'depth'} ||= 3; |
334 | $Data::Dumper::Maxdepth = $arg{'depth'} if defined $arg{'depth'}; |
335 | $Data::Dumper::Indent = $arg{'indent'} if defined $arg{'indent'}; |
336 | return(Dumper($arg{'object'})); |
28ae4732 |
337 | } |
88f2d2fd |
338 | |
7a9287a9 |
339 | 1; |
efcd92a3 |
340 | |
efcd92a3 |
341 | [% FOREACH node = nodes %][% printPackage(node.value) %][% END %] |
88f2d2fd |
342 | EOF |
a0249514 |
343 | } |
344 | |
bf46ec51 |
345 | elsif($type eq 'soap'){ |
346 | return <<'EOF'; |
347 | [% FOREACH node = nodes %][% node.value.name %], [%- END -%] |
348 | EOF |
349 | } |
a0249514 |
350 | |
351 | elsif($type eq 'atom'){ |
88f2d2fd |
352 | |
d8dc07e7 |
353 | return <<'EOF'; |
efcd92a3 |
354 | [% # DOCUMENT START # %] |
c00bb9f8 |
355 | |
ebee7d95 |
356 | ########AutoAtom######## |
7a9287a9 |
357 | [% FOREACH node = nodes %] |
358 | use [% node.value.name %]; |
359 | [% END %] |
360 | 1; |
361 | |
a0249514 |
362 | [% FOREACH node = nodes %] |
63c988ed |
363 | [% IF !node.value.is_trivial_link %] |
c00bb9f8 |
364 | |
919a1670 |
365 | ########[% node.value.name | replace('.+::', '') %]######## |
c00bb9f8 |
366 | |
919a1670 |
367 | package Turnkey[% concat %]::Atom::[% node.value.name FILTER replace '.+::', '' %]; |
c00bb9f8 |
368 | |
919a1670 |
369 | [% pname = node.value.name FILTER replace '.+::', '' %] |
63c988ed |
370 | |
919a1670 |
371 | use base qw(Turnkey[% concat %]::Atom); |
c00bb9f8 |
372 | use Data::Dumper; |
373 | |
374 | sub can_render { |
375 | return 1; |
376 | } |
377 | |
378 | sub render { |
379 | my $self = shift; |
380 | my $dbobject = shift; |
c01582e9 |
381 | |
382 | # Assumption here that if it's not rendering on it's own dbobject |
383 | # then it's a list. This will be updated when AtomLists are implemented -boconnor |
919a1670 |
384 | if(ref($dbobject) eq 'Turnkey[% concat %]::Model::[% pname %]') { |
c01582e9 |
385 | $self->focus('yes'); |
c00bb9f8 |
386 | return(_render_record($dbobject)); |
387 | } |
388 | else { return(_render_list($dbobject)); } |
389 | } |
390 | |
391 | sub _render_record { |
392 | my $dbobject = shift; |
393 | my @output = (); |
394 | my $row = {}; |
395 | my $field_hash = {}; |
8bba52b2 |
396 | |
397 | #data |
a0249514 |
398 | [% FOREACH value = node.value.data_fields %] |
816ce4b6 |
399 | [% IF value != 1 %] |
400 | $field_hash->{[% value.key %]} = $dbobject->[% value.key %](); |
8bba52b2 |
401 | [% END %] |
402 | [% END %] |
403 | |
404 | #keys |
405 | [% FOREACH value = node.value.edges %] |
406 | [% NEXT IF value.type != 'import' %] |
407 | $field_hash->{[% value.thisfield.name %]} = $dbobject->[% value.thisfield.name %](); |
408 | [% END %] |
409 | |
c00bb9f8 |
410 | $row->{data} = $field_hash; |
411 | $row->{id} = $dbobject->id(); |
412 | push @output, $row; |
413 | return(\@output); |
414 | } |
415 | |
416 | sub _render_list { |
417 | my $dbobject = shift; |
418 | my @output = (); |
88f2d2fd |
419 | my @objects = $dbobject->[% node.key %]s; |
c01582e9 |
420 | foreach my $object (@objects){ |
c00bb9f8 |
421 | my $row = {}; |
c01582e9 |
422 | my $field_hash = {}; |
8bba52b2 |
423 | |
c01582e9 |
424 | #data |
8bba52b2 |
425 | [% FOREACH value = node.value.data_fields %] |
426 | [% IF value != 1 %] |
816ce4b6 |
427 | $field_hash->{[% value.key %]} = $object->[% value.key %](); |
8bba52b2 |
428 | [% END %] |
429 | [% END %] |
430 | |
c01582e9 |
431 | #keys |
432 | [% FOREACH value = node.value.edges %] |
433 | [% NEXT IF value.type != 'import' %] |
434 | $field_hash->{[% value.thisfield.name %]} = $object->[% value.thisfield.name %](); |
435 | [% END %] |
8bba52b2 |
436 | |
c00bb9f8 |
437 | $row->{data} = $field_hash; |
c01582e9 |
438 | $row->{id} = $object->id(); |
439 | push @output, $row; |
440 | } |
c00bb9f8 |
441 | return(\@output); |
442 | } |
443 | |
444 | sub head { |
445 | return 1; |
446 | } |
447 | |
448 | 1; |
a0249514 |
449 | [% END %] |
c00bb9f8 |
450 | [% END %] |
451 | EOF |
452 | |
d8dc07e7 |
453 | } elsif($type eq 'xml'){ |
8a412596 |
454 | return <<'EOF'; |
c00bb9f8 |
455 | <?xml version="1.0" encoding="UTF-8"?> |
63c988ed |
456 | <!DOCTYPE Turnkey SYSTEM "Turnkey.dtd"> |
457 | <Turnkey> |
c00bb9f8 |
458 | |
459 | <!-- The basic layout is fixed --> |
4097689d |
460 | <container orientation="vertical" type="Container" label="RootContainer"> |
461 | <container orientation="horizontal" type="Container" label="MiddleContainer"> |
462 | <container align="center" class="leftbar" orientation="vertical" type="minor" label="MidLeftContainer"/> |
463 | <container orientation="vertical" type="major" label="MainContainer"/> |
c00bb9f8 |
464 | </container> |
465 | </container> |
466 | |
467 | <!-- Atom Classes --> |
63c988ed |
468 | [% FOREACH node = nodes %] |
469 | [% IF !node.value.is_trivial_link %] |
4097689d |
470 | <atom class="[% format_table(node.key) %]" name="[% format_table(node.key) %]" label="[% format_table(node.key) %]Atom"/> |
69c7a62f |
471 | [%- END -%] |
63c988ed |
472 | [% END %] |
79989cde |
473 | <!-- custom --> |
474 | <atom class="Frontpage" name="Frontpage" label="FrontpageAtom"/> |
475 | <atom class="Search" name="Search" label="SearchAtom"/> |
476 | <atom class="Userinfo" name="UserInfo" label="UserinfoAtom"/> |
477 | <!-- custom --> |
478 | |
c00bb9f8 |
479 | |
480 | <!-- Atom Bindings --> |
481 | <atomatombindings> |
63c988ed |
482 | [% FOREACH focus_atom = nodes %] |
483 | [% IF !focus_atom.value.is_trivial_link %] |
484 | [% FOREACH link_atom = focus_atom.value.hyperedges %] |
4097689d |
485 | <atomatombinding from="#[% format_table(focus_atom.key) %]Atom" to="#[% format_table(link_atom.thatnode.table.name) %]Atom" label="[% format_table(focus_atom.key) %]Atom2[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
69c7a62f |
486 | [%- END -%] |
63c988ed |
487 | [% previous = "" %] |
488 | [% FOREACH link_atom = focus_atom.value.edges %] |
489 | [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name && link_atom.thatnode.table.name != "" %] |
4097689d |
490 | <atomatombinding from="#[% format_table(focus_atom.key) %]Atom" to="#[% format_table(link_atom.thatnode.table.name) %]Atom" label="[% format_table(focus_atom.key) %]Atom2[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
491 | [% previous = link_atom.thatnode.table.name %] |
492 | [% END %] |
493 | [%- END %] |
69c7a62f |
494 | [%- END -%] |
63c988ed |
495 | [% END %] |
c00bb9f8 |
496 | </atomatombindings> |
497 | |
83a42239 |
498 | <layouts> |
63c988ed |
499 | [% FOREACH focus_atom = nodes %] |
500 | [% IF !focus_atom.value.is_trivial_link %] |
4097689d |
501 | <layout label="[% format_table(focus_atom.key) %]"> |
63c988ed |
502 | [% FOREACH link_atom = focus_atom.value.hyperedges %] |
4097689d |
503 | <placement from="#MidLeftContainer" label="MidLeftContainer2[% format_table(link_atom.thatnode.table.name) %]Atom" to="#[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
504 | [%- END%] |
505 | [% previous = "" %] |
506 | [% FOREACH link_atom = focus_atom.value.edges %] |
507 | [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name %] |
4097689d |
508 | <placement from="#MidLeftContainer" label="MidLeftContainer2[% format_table(link_atom.thatnode.table.name) %]Atom" to="#[% format_table(link_atom.thatnode.table.name) %]Atom"/> |
63c988ed |
509 | [% previous = link_atom.thatnode.table.name %] |
510 | [% END %] |
511 | [%- END %] |
4097689d |
512 | <placement from="#MainContainer" label="MainContainer2[% format_table(focus_atom.key) %]Atom" to="#[% format_table(focus_atom.key) %]Atom"/> |
6124b910 |
513 | </layout> |
63c988ed |
514 | [%- END %] |
515 | [% END %] |
919a1670 |
516 | <!-- custom FIXME remove --> |
517 | <layout label="Turnkey[% concat%]::Util::Frontpage"> |
79989cde |
518 | <placement from="#MainContainer" label="MainContainer2AnalysisAtom" to="#FrontpageAtom"/> |
519 | </layout> |
919a1670 |
520 | <layout label="Turnkey[% concat %]::Util::Search"> |
79989cde |
521 | <placement from="#MainContainer" label="MainContainer2AnalysisAtom" to="#SearchAtom"/> |
522 | </layout> |
919a1670 |
523 | <layout label="Turnkey[% concat %]::Util::Userinfo"> |
79989cde |
524 | <placement from="#MainContainer" label="MainContainer2UserinfoAtom" to="#UserinfoAtom"/> |
525 | </layout> |
526 | <!-- custom --> |
83a42239 |
527 | </layouts> |
69c7a62f |
528 | |
529 | <uribindings> |
919a1670 |
530 | <uribinding uri="/db" class="Turnkey[% concat%]::Util::Frontpage"/> |
531 | <uribinding uri="/db/search" class="Turnkey[% concat %]::Util::Search"/> |
532 | <uribinding uri="/db/userinfo" class="Turnkey[% concat %]::Util::Userinfo"/> |
69c7a62f |
533 | </uribindings> |
534 | |
535 | <classbindings> |
63c988ed |
536 | [% FOREACH focus_atom = nodes %] |
537 | [% IF !focus_atom.value.is_trivial_link %] |
83a42239 |
538 | <classbinding class="[% format_table(focus_atom.key) %]" plugin="#[% format_table(focus_atom.key) %]Atom" rank="0"/> |
69c7a62f |
539 | [%- END -%] |
63c988ed |
540 | [% END %] |
79989cde |
541 | <!-- custom --> |
919a1670 |
542 | <classbinding class="Turnkey[% concat %]::Util::Frontpage" plugin="#FrontpageAtom" rank="0"/> |
543 | <classbinding class="Turnkey[% concat %]::Util::Search" plugin="#SearchAtom" rank="0"/> |
544 | <classbinding class="Turnkey[% concat %]::Util::Userinfo" plugin="#UserinfoAtom" rank="0"/> |
79989cde |
545 | <!-- custom --> |
69c7a62f |
546 | </classbindings> |
c00bb9f8 |
547 | |
63c988ed |
548 | </Turnkey> |
c00bb9f8 |
549 | EOF |
550 | |
d8dc07e7 |
551 | } elsif($type eq 'template'){ |
552 | return <<'EOF'; |
c00bb9f8 |
553 | [% TAGS [- -] %] |
82cedef0 |
554 | [% MACRO renderpanel(panel,name,dbobject) BLOCK %] |
c00bb9f8 |
555 | <!-- begin panel: [% panel.label %] --> |
c00bb9f8 |
556 | [% FOREACH p = panel.containers %] |
557 | [% IF p.can_render(panel) %] |
c00bb9f8 |
558 | [% IF p.type == 'Container' %] |
82cedef0 |
559 | [% renderpanel(p,name,dbobject) %] |
c00bb9f8 |
560 | [% ELSE %] |
82cedef0 |
561 | [% IF p.type == 'major' %] |
e204c7c7 |
562 | <div class="middle"><div class="column-in"> |
82cedef0 |
563 | [% IF name %] |
564 | <div class="middle-header">[% name %]</div> |
e204c7c7 |
565 | [% END %] |
c00bb9f8 |
566 | <!-- begin atom: [% p.label %] --> |
dbbe24ef |
567 | <!-- table cellpadding="0" cellspacing="0" width="100%" --><!-- [% ref(atom) %] [% ref(dbobject) %] --> |
82cedef0 |
568 | [% renderatom(name,dbobject,p.containers[0]) %] |
dbbe24ef |
569 | <!-- /table --> |
e204c7c7 |
570 | </div></div> |
571 | <div class="cleaner"></div> |
82cedef0 |
572 | [% ELSIF p.type == 'minor' %] |
e204c7c7 |
573 | <div class="left"><div class="column-in"> |
c7a9e95b |
574 | [% FOREACH atom = p.containers %] |
e204c7c7 |
575 | <div class="left-item"> |
82cedef0 |
576 | [% IF name %] |
577 | [% linkname = ref(p.containers[0]) %] |
919a1670 |
578 | <div class="box-header">[% atom.name | replace("Turnkey${concat}::Atom::", '') %]</div> |
e204c7c7 |
579 | [% END %] |
580 | <!-- begin atom: [% p.label %] --> |
dbbe24ef |
581 | <!-- table cellpadding="0" cellspacing="0" width="100%" --><!-- [% ref(atom) %] [% ref(dbobject) %] --> |
c7a9e95b |
582 | [% renderatom(name,dbobject,atom) %] |
dbbe24ef |
583 | <!-- /table --> |
c7a9e95b |
584 | </div> |
585 | [% END %] |
586 | </div></div> |
e204c7c7 |
587 | [% END %] |
c00bb9f8 |
588 | [% END %] |
c00bb9f8 |
589 | [% IF panel.orientation == 'vertical' %] |
c00bb9f8 |
590 | [% END %] |
591 | [% END %] |
592 | [% END %] |
e204c7c7 |
593 | |
c00bb9f8 |
594 | <!-- end panel: [% panel.label %] --> |
e204c7c7 |
595 | |
c00bb9f8 |
596 | [% END %] |
8bba52b2 |
597 | [% BLOCK make_linked_dbobject %] |
598 | [% PERL %] |
599 | $stash->set(linked_dbobject => [% class %]->retrieve([% id %])); |
600 | [% END %] |
601 | [% END %] |
602 | [% MACRO obj2link(obj) SWITCH ref(obj) %] |
603 | [% CASE '' %] |
604 | [% obj %] |
605 | [% CASE DEFAULT %] |
606 | [% IF obj.name %] |
607 | <a href="[% obj2url(obj) %]">[% obj.name %]</a> |
608 | [% ELSE %] |
609 | <a href="[% obj2url(obj) %]">[% obj %]</a> |
610 | [% END %] |
611 | [% END %] |
612 | [% MACRO obj2url(obj) SWITCH obj %] |
613 | [% CASE DEFAULT %] |
e6c65ff9 |
614 | /db/[% ref(obj) | replace('.+::','') %]/[% obj %] |
8bba52b2 |
615 | [% END %] |
79989cde |
616 | <!-- the above method should be updated when additional namespaces are used --> |
8bba52b2 |
617 | [% MACRO obj2desc(obj) SWITCH ref(obj) %] |
618 | [% CASE '' %] |
619 | [% obj %] |
620 | [% CASE DEFAULT %] |
621 | [% IF obj.value %] |
622 | [% obj.value %] |
623 | [% ELSE %] |
624 | [% obj %] |
625 | [% END %] |
626 | [% END %] |
82cedef0 |
627 | [% MACRO renderatom(name, dbobject, atom) SWITCH name %] |
7fbe3b98 |
628 | [- FOREACH node = nodes -] |
629 | [- IF !node.value.is_trivial_link -] |
43167a31 |
630 | [% CASE '[- format_table(node.key) -]' %] |
147d59b4 |
631 | [% INCLUDE [- format_table(node.key) | lower -].tt2 %] |
c00bb9f8 |
632 | [- END -] |
7fbe3b98 |
633 | [- END -] |
c00bb9f8 |
634 | [% CASE DEFAULT %] |
635 | [% renderlist(atom.render(dbobject)) %] |
636 | [% END %] |
bc0cf6eb |
637 | [% MACRO renderlist(lstArr) BLOCK %] |
dbbe24ef |
638 | <div class="left-item"> |
639 | <ul> |
bc0cf6eb |
640 | [% FOREACH item = lstArr %] |
c01582e9 |
641 | [% class = ref(atom) | replace('::Atom::', '::Model::') %] |
bc0cf6eb |
642 | [% id = item.id %] |
c01582e9 |
643 | [% PROCESS make_linked_dbobject %] |
644 | <li class="minorfocus">[% obj2link(linked_dbobject) %]</li> |
645 | [% END %] |
dbbe24ef |
646 | </ul> |
647 | </div> |
c00bb9f8 |
648 | [% END %] |
bc0cf6eb |
649 | EOF |
650 | |
651 | } elsif($type eq 'atomtemplate') { |
652 | return <<'EOF'; |
653 | [%- TAGS [- -] -%] |
654 | [-- IF !node.is_trivial_link --] |
82cedef0 |
655 | [% records = atom.render(dbobject) %] |
bc0cf6eb |
656 | [% rowcount = 0 %] |
657 | [% IF atom.focus == "yes" %] |
82cedef0 |
658 | [% FOREACH record = records %] |
659 | [% fields = record.data %] |
e204c7c7 |
660 | <table> |
bc0cf6eb |
661 | [- FOREACH field = node.data_fields -] |
662 | [- IF field != "1" -] |
e66764e5 |
663 | <tr><td class="dbfieldname">[- field.key -]</td><td class="dbfieldvalue">[% obj2link(fields.[- field.key -]) %]</td></tr> |
bc0cf6eb |
664 | [- END -] |
665 | [- END -] |
666 | [- FOREACH field = node.edges -] |
667 | [- NEXT IF field.type != 'import' -] |
668 | <tr><td class="dbfieldname">[- field.thisfield.name -]</td><td class="dbfieldvalue">[% obj2link(fields.[- field.thisfield.name -]) %]</td></tr> |
669 | [- END -] |
bc0cf6eb |
670 | [% IF (rowcount > 1) %] <tr><td colspan="2"><hr></td></tr> [% END %] |
671 | [% rowcount = rowcount + 1 %] |
e204c7c7 |
672 | </table> |
82cedef0 |
673 | [% END %] |
bc0cf6eb |
674 | [% ELSE %] |
e204c7c7 |
675 | <ul> |
8c54bff0 |
676 | [% FOREACH record = atom.render(dbobject) %] |
8bba52b2 |
677 | [% class = ref(atom) | replace('::Atom::', '::Model::') %] |
8c54bff0 |
678 | [% id = record.id #needed by make_linked_dbobject macro %] |
8bba52b2 |
679 | [% PROCESS make_linked_dbobject %] |
c01582e9 |
680 | <li class="minorfocus">[% obj2link(linked_dbobject) %]</li> |
c00bb9f8 |
681 | [% END %] |
dbbe24ef |
682 | </ul> |
c00bb9f8 |
683 | [% END %] |
bc0cf6eb |
684 | [- END -] |
c00bb9f8 |
685 | EOF |
686 | |
d8dc07e7 |
687 | } |
688 | } |
bc0cf6eb |
689 | |
690 | 1; |