/[smecontribs]/rpms/smeserver-trac/contribs7/smeserver-trac-0.4-add2general.patch
ViewVC logotype

Contents of /rpms/smeserver-trac/contribs7/smeserver-trac-0.4-add2general.patch

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Sat Apr 26 14:48:45 2008 UTC (16 years ago) by snetram
Branch: MAIN
* Sat Apr 26 2008 Jonathan Martens <smeserver-contribs@snetram.nl> 0.4-41
- Add common <base> tags to e-smith-formmagick's general

1 --- smeserver-trac-0.4/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/trac.pm.add2general 2007-04-27 08:54:46.000000000 +0200
2 +++ smeserver-trac-0.4/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/trac.pm 2008-04-26 16:38:42.000000000 +0200
3 @@ -1,954 +1,954 @@
4 -#!/usr/bin/perl -w
5 -#----------------------------------------------------------------------
6 -# $Id: trac.pm 69 2007-03-25 13:20:24Z marco $
7 -# vim: ft=perl ts=4 sw=4 et:
8 -#----------------------------------------------------------------------
9 -# Copyright (C) 2007 Marco Hess
10 -#
11 -# This program is free software; you can redistribute it and/or modify
12 -# it under the terms of the GNU General Public License as published by
13 -# the Free Software Foundation; either version 2 of the License, or
14 -# (at your option) any later version.
15 -#
16 -# This program is distributed in the hope that it will be useful,
17 -# but WITHOUT ANY WARRANTY; without even the implied warranty of
18 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 -# GNU General Public License for more details.
20 -#
21 -# You should have received a copy of the GNU General Public License
22 -# along with this program; if not, write to the Free Software
23 -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 -#----------------------------------------------------------------------
25 -
26 -package esmith::FormMagick::Panel::trac;
27 -
28 -use strict;
29 -use warnings;
30 -
31 -use esmith::FormMagick;
32 -use esmith::AccountsDB;
33 -use esmith::ConfigDB;
34 -use esmith::DomainsDB;
35 -use esmith::cgi;
36 -use esmith::util;
37 -use File::Basename;
38 -use Exporter;
39 -use Carp;
40 -use Sys::Syslog;
41 -
42 -use constant TRUE => 1;
43 -use constant FALSE => 0;
44 -
45 -our @ISA = qw(esmith::FormMagick Exporter);
46 -
47 -our @EXPORT = qw(
48 - show_trac_projects
49 - print_trac_field_name
50 - repositories_list
51 - group_list
52 - user_list
53 - max_trac_project_name_length
54 - handle_trac_projects
55 - create_trac_project
56 - remove_trac_project
57 - getExtraParams
58 - print_save_or_add_button
59 - validate_name
60 - validate_radio
61 - wherenext
62 - maxLength
63 -);
64 -
65 -our $ConfigDB = esmith::ConfigDB->open
66 - or die "Can't open the Config database : $!\n" ;
67 -
68 -our $AccountsDB = esmith::AccountsDB->open
69 - or die "Can't open the Account database : $!\n" ;
70 -
71 -our $DomainsDB = esmith::DomainsDB->open
72 - or die "Can't open the Domains database : $!\n" ;
73 -
74 -
75 -# fields and records separator for sub records
76 -use constant FS => "," ;
77 -use constant RS => ";" ;
78 -
79 -=pod
80 -
81 -=head1 NAME
82 -
83 -esmith::FormMagick::Panels::trac - Trac
84 -
85 -=head1 SYNOPSIS
86 -
87 -use esmith::FormMagick::Panels::trac
88 -
89 -my $panel = esmith::FormMagick::Panel::trac->new();
90 -$panel->display();
91 -
92 -=head1 DESCRIPTION
93 -
94 -This module is the backend to the Trac panel, responsible
95 -for supplying all functions used by that panel. It is a subclass
96 -of esmith::FormMagick itself, so it inherits the functionality
97 -of a FormMagick object.
98 -
99 -=cut
100 -
101 -=head2 new()
102 -
103 -Exactly as for esmith::FormMagick
104 -
105 -=cut
106 -
107 -sub new
108 -{
109 - my $proto = shift;
110 - my $class = ref($proto) || $proto;
111 - my $self = esmith::FormMagick::new($class);
112 - $self->{calling_package} = (caller)[0];
113 -
114 - return $self;
115 -}
116 -
117 -=head1 HTML GENERATION ROUTINES
118 -
119 -Routines for generating chunks of HTML needed by the panel.
120 -
121 -=cut
122 -
123 -=head2 show_trac_projects()
124 -
125 -This function displays a table of trac project environments on the system
126 -including the links to modify and remove the trac project environment.
127 -
128 -=cut
129 -
130 -sub show_trac_projects {
131 - my $fm = shift;
132 - my $q = $fm->{cgi};
133 -
134 - # Setup the various localised text field for the trac project table
135 - my $name = $fm->localise('TRAC_TABLE_HEADER_NAME');
136 - my $description = $fm->localise('TRAC_TABLE_HEADER_DESCRIPTION');
137 - my $domains = $fm->localise('TRAC_TABLE_HEADER_DOMAINS');
138 - my $repository = $fm->localise('TRAC_TABLE_HEADER_REPOSITORY');
139 - my $path = $fm->localise('TRAC_TABLE_HEADER_PATH');
140 - my $access = $fm->localise('TRAC_TABLE_HEADER_ACCESS');
141 - my $action_h = $fm->localise('TRAC_TABLE_HEADER_ACTION');
142 - my $view = $fm->localise('TRAC_ACTION_VIEW');
143 - my $modify = $fm->localise('TRAC_ACTION_MODIFY');
144 - my $remove = $fm->localise('TRAC_ACTION_REMOVE');
145 - my $backup = $fm->localise('TRAC_ACTION_BACKUP');
146 - my $restore = $fm->localise('TRAC_ACTION_RESTORE');
147 -
148 - print $q->start_table({-class => 'sme-noborder'}), "\n";
149 -
150 - # Check if any repositories exist
151 - my @repositories = $AccountsDB->get_all_by_prop('type' => 'repository');
152 - unless ( scalar @repositories )
153 - {
154 - print $q->Tr($q->td($q->h2($fm->localise('NO_REPOSITORIES'))));
155 - return "";
156 - }
157 -
158 - # TODO what about the case that all repositories have been deleted
159 - # but the Trac project environments are still there? Can we remove the
160 - # trac projects or do we need to reassign the projects to
161 - # another repository? The code above prevents us from accessing the
162 - # trac projects when there are no more repositories.
163 -
164 - print $q->Tr($q->td($q->a({-class => "button-like",
165 - href => "trac?page=0&page_stack=&Next=Next&wherenext=Create"},
166 - $fm->localise('TRAC_ADD_BUTTON'))));
167 -
168 - # Check if any trac projects exist
169 - my @TracProjects = $AccountsDB->get_all_by_prop('type' => 'trac');
170 - unless ( scalar @TracProjects )
171 - {
172 - print $q->Tr($q->td($q->h2($fm->localise('NO_TRAC_PROJECTS'))));
173 - return "";
174 - }
175 -
176 - # Show the list of configures trac projects
177 - print $q->Tr($q->td($q->h2($fm->localise('CURRENT_TRAC_PROJECTS'))));
178 -
179 - print $q->Tr($q->td($fm->localise('TRAC_MODIFY_REMOVE_BUTTON_DESCRIPTION')));
180 -
181 - print $q->start_table({-CLASS => "sme-border"}),"\n";
182 - print $q->Tr (
183 - esmith::cgi::genSmallCell($q, $name, "header"),
184 - esmith::cgi::genSmallCell($q, $description,"header"),
185 - esmith::cgi::genSmallCell($q, $domains, "header"),
186 - esmith::cgi::genSmallCell($q, $repository, "header"),
187 - esmith::cgi::genSmallCell($q, $path, "header"),
188 - esmith::cgi::genSmallCell($q, $access, "header"),
189 - esmith::cgi::genSmallCell($q, $action_h, "header", 3)),"\n";
190 -
191 - my $scriptname = basename($0);
192 -
193 - foreach my $TracProject (@TracProjects)
194 - {
195 - my $trac_name = $TracProject->key();
196 - my $trac_desc = $TracProject->prop('Description');
197 - my $trac_domains = join("<br>", split(FS, $TracProject->prop('Domains')));
198 - my $trac_repo = $TracProject->prop('Repository');
199 - my $trac_path = $TracProject->prop('RepositoryPath');
200 - my $trac_access = $TracProject->prop('Access') || 'local';
201 - my $modifiable = $TracProject->prop('Modifiable') || 'yes';
202 - my $removable = $TracProject->prop('Removable') || 'yes';
203 -
204 - my $params = $fm->build_trac_project_cgi_params($trac_name, $TracProject->props());
205 -
206 - my $href = "$scriptname?$params&action=modify&wherenext=";
207 -
208 - my $actionView = '&nbsp;';
209 - $actionView .= $q->a({href => '/' . $TracProject->key(),
210 - target => '_blank'}, $view ) . '&nbsp;';
211 -
212 - my $actionModify = '&nbsp;';
213 - if ($modifiable eq 'yes')
214 - {
215 - $actionModify .= $q->a({href => "${href}Modify"}, $modify) . '&nbsp;';
216 - }
217 -
218 - my $actionRemove = '&nbsp;';
219 - if ($removable eq 'yes')
220 - {
221 - $actionRemove .= $q->a({href => "${href}Remove"}, $remove) . '&nbsp;';
222 - }
223 -
224 - my $actionBackup = '&nbsp;';
225 - $actionBackup .= $q->a({href => "${href}Backup"}, $backup) . '&nbsp;';
226 -
227 - my $actionRestore = '&nbsp;';
228 - $actionRestore .= $q->a({href => "${href}Restore"}, $restore) . '&nbsp;';
229 -
230 - print $q->Tr(
231 - esmith::cgi::genSmallCell($q, $trac_name, "normal"),
232 - esmith::cgi::genSmallCell($q, $trac_desc, "normal"),
233 - esmith::cgi::genSmallCell($q, $trac_domains, "normal"),
234 - esmith::cgi::genSmallCell($q, $trac_repo, "normal"),
235 - esmith::cgi::genSmallCell($q, $trac_path, "normal"),
236 - esmith::cgi::genSmallCell($q, $trac_access, "normal"),
237 - esmith::cgi::genSmallCell($q, $actionView, "normal"),
238 - esmith::cgi::genSmallCell($q, $actionModify, "normal"),
239 - esmith::cgi::genSmallCell($q, $actionRemove, "normal")
240 - );
241 - }
242 -
243 - print $q->end_table,"\n";
244 -
245 - print $q->end_table,"\n";
246 -
247 - return "";
248 -}
249 -
250 -=cut
251 -
252 -=head2 print_save_or_add_button()
253 -
254 -Prints the ADD button when a new trac project environment is addded and the SAVE buttom
255 -whem modifications are made.
256 -
257 -=cut
258 -
259 -sub print_save_or_add_button {
260 -
261 - my ($fm) = @_;
262 -
263 - my $cgi = $fm->{cgi};
264 -
265 - if (($cgi->param("action") || '') eq "modify") {
266 - $fm->print_button("SAVE");
267 - } else {
268 - $fm->print_button("ADD");
269 - }
270 -}
271 -
272 -=head1 HELPER FUNCTIONS FOR THE PANEL
273 -
274 -Routines for modifying the database and signaling events
275 -from the server-manager panel
276 -
277 -=cut
278 -
279 -=head2 build_trac_project_cgi_params($fm, $tracprojectname, %oldprops)
280 -
281 -Constructs the parameters for the links in the trac project environments table
282 -
283 -=cut
284 -
285 -sub build_trac_project_cgi_params {
286 - my ($self, $tracprojectname, %oldprops) = @_;
287 -
288 - my %props = (
289 - page => 0,
290 - page_stack => "",
291 - tracName => $tracprojectname,
292 - );
293 -
294 - return $self->props_to_query_string(\%props);
295 -}
296 -
297 -*wherenext = \&CGI::FormMagick::wherenext;
298 -
299 -=head2 print_trac_field_name()
300 -
301 -Helper function to print the field NAME so that it becomes
302 -an edit field upon ADD and a fixed field upon MODIFY.
303 -
304 -Also read all the account db values so the other fields
305 -can show the existing values.
306 -
307 -=cut
308 -
309 -sub print_trac_field_name {
310 - my $fm = shift;
311 - my $in = $fm->{cgi}->param('tracName') || '';
312 - my $action = $fm->{cgi}->param('action') || '';
313 -
314 - print qq(<tr><td class="sme-noborders-label">) .
315 - $fm->localise('TRAC_FIELD_PROJECT_NAME') . qq(</td>\n);
316 -
317 - if ($action eq 'modify' and $in) {
318 - #-------------------------------------------------------
319 - # Updating an existing record.
320 - #--------------------------------------------------------
321 -
322 - my $rec = $AccountsDB->get($in);
323 - my $modifiable = $rec->prop('Modifiable') || 'yes';
324 - my $removable = $rec->prop('Removable') || 'yes';
325 -
326 - print qq(
327 - <td class="sme-noborders-content">$in
328 - <input type="hidden" name="tracName" value="$in">
329 - <input type="hidden" name="action" value="modify">
330 - </td>
331 - );
332 -
333 - # Read the values for each field from the accounts db and store
334 - # them in the cgi object so our form will have the correct
335 - # info displayed.
336 - my $q = $fm->{cgi};
337 - if ($rec)
338 - {
339 - $q->param(-name=>'tracDescription',-value=>
340 - $rec->prop('Description'));
341 -
342 - $q->param(-name=>'tracRepository',-value=>
343 - $rec->prop('Repository'));
344 -
345 - $q->param(-name=>'tracRepositoryPath',-value=>
346 - $rec->prop('RepositoryPath'));
347 -
348 - # domain list is handled separately
349 -
350 - $q->param(-name=>'tracGroups',-value=>
351 - join(FS, split(FS, $rec->prop('Groups'))));
352 -
353 - $q->param(-name=>'tracUsers',-value=>
354 - join(FS, split(FS, $rec->prop('Users'))));
355 -
356 - $q->param(-name=>'tracAccess',-value=>
357 - $rec->prop('Access')),
358 - }
359 - } else {
360 - #-------------------------------------------------------
361 - # Adding a new record so allow an entry field for the
362 - # name.
363 - #--------------------------------------------------------
364 - print qq(
365 - <td><input type="text" name="tracName" value="$in">
366 - <input type="hidden" name="action" value="create">
367 - </td>
368 - );
369 - }
370 -
371 - print qq(</tr>\n);
372 - return undef;
373 -}
374 -
375 -
376 -=head2 print_trac_domains()
377 -
378 -When this server has more than one domain this function takes
379 -the list of domains and returns a string of html checkboxes
380 -for all these domains.
381 -
382 -Those domains that are listed with this Trac environment
383 -will have their checkbox checked.
384 -
385 -=cut
386 -
387 -sub print_trac_domains() {
388 -
389 - # Retrieve the Trac account name from the CGI parameters
390 - my $fm = shift;
391 - my $name = $fm->{'cgi'}->param('tracName');
392 - my $action = $fm->{'cgi'}->param("action") || '';
393 - my $out = "";
394 -
395 - # Get a full list of all the domains on this server.
396 - my @domains = $DomainsDB->get_all_by_prop( type => 'domain' );
397 - my $numdomains = @domains;
398 -
399 - # If there is more than one domain, we generate a list
400 - # of checkboxes. Otherwise we just show the primary domain.
401 - if ($numdomains > 1) {
402 -
403 - # With the Trac account name, get the list of the Domains for which
404 - # this Trac account is active.
405 - my $trac_domains_list = "";
406 - if ($AccountsDB->get($name)) {
407 - $trac_domains_list = $AccountsDB->get($name)->prop('Domains');
408 - }
409 -
410 - # Split the comma separated list into the individual bits.
411 - my %trac_domains;
412 - foreach my $trac_domain ( split ( /,/, $trac_domains_list ) ) {
413 - $trac_domains{$trac_domain} = 1;
414 - }
415 -
416 - # Now generate the table of domains with a checkbox in front of it.
417 - # If the domain is in our listed domains for the Trac environment, the
418 - # checkbox will show checked.
419 - $out = " <tr>\n";
420 - $out .= " <td colspan=2>" . $fm->localise('TRAC_FIELD_DOMAINS_DESCRIPTION') . "</td>";
421 - $out .= " </tr>\n";
422 - $out .= " <tr>\n";
423 - $out .= " <td class=\"sme-noborders-label\">" . $fm->localise('TRAC_FIELD_DOMAINS') . "</td>\n";
424 - $out .= " <td>\n";
425 - $out .= " <table border='0' cellspacing='0' cellpadding='0'>\n";
426 - $out .= " <tr>\n";
427 -
428 - foreach my $domain (sort @domains) {
429 -
430 - # If this is a ADD form, we default check all domains, otherwise only
431 - # those that are in our Trac project list.
432 - my $checked = "";
433 - if ( $action eq 'modify' ) {
434 - if ( $trac_domains{ $domain->key() } ) {
435 - $checked = "checked";
436 - }
437 - } else {
438 - $checked = "checked";
439 - }
440 -
441 - $out .= " <tr>\n";
442 - $out .= " <td><input type=\"checkbox\" name=\"tracDomains\" $checked value=\"" . $domain->key . "\"></td>\n";
443 - $out .= " <td>" . $domain->key . "</td>\n";
444 - $out .= " </tr>\n";
445 - }
446 -
447 - $out .= " </table>\n";
448 - $out .= " </td>\n";
449 - $out .= " </tr>\n";
450 - }
451 - else
452 - {
453 - # We only have a single domain, so we just show this domain but without the
454 - # checkbox (so it can't be unchecked).
455 - my $domainname = $ConfigDB->get('DomainName')->value();
456 - $out = " <tr>\n";
457 - $out .= " <td colspan=2>" . $fm->localise('TRAC_FIELD_DOMAIN_DESCRIPTION') . "</td>";
458 - $out .= " </tr>\n";
459 - $out .= " <tr>\n";
460 - $out .= " <td class=\"sme-noborders-label\">" . $fm->localise('TRAC_FIELD_DOMAIN') . "</td>\n";
461 - $out .= " <td><input type=\"hidden\" name=\"tracDomains\" value=\"" . $domainname . "\">";
462 - $out .= $domainname . "</td>\n";
463 - $out .= " </tr>\n";
464 - }
465 -
466 - return $out;
467 -}
468 -
469 -
470 -=pod
471 -
472 -=head2 repositories_list()
473 -
474 -Returns a hash of repositories for the Create/Modify screen's repository
475 -field's drop down list.
476 -
477 -=cut
478 -
479 -sub repositories_list
480 -{
481 - my @repositories = $AccountsDB->get_all_by_prop('type' => 'repository');
482 - my %repositories = ();
483 - foreach my $repository (@repositories) {
484 - $repositories{$repository->key()} = $repository->prop('Description') . " (" . $repository->key . ")";
485 - }
486 - return \%repositories;
487 -}
488 -
489 -=head2 group_list()
490 -
491 -Returns a hash of groups for the Create/Modify screen's group
492 -field's drop down list.
493 -
494 -=cut
495 -
496 -sub group_list
497 -{
498 - my @groups = $AccountsDB->groups();
499 - my %groups = ();
500 - foreach my $group (@groups) {
501 - $groups{$group->key()} = $group->prop('Description')." (".$group->key.")";
502 - }
503 - return \%groups;
504 -}
505 -
506 -=head2 user_list()
507 -
508 -Returns a hash of users for the Create/Modify screen's user field's
509 -drop down list.
510 -
511 -=cut
512 -
513 -sub user_list
514 -{
515 - my @users = $AccountsDB->users();
516 - my %users = ();
517 - foreach my $user (@users) {
518 - $users{$user->key()} = $user->prop('LastName').", ". $user->prop('FirstName')." (". $user->key.")";
519 - }
520 - return \%users;
521 -}
522 -
523 -=head1 THE ROUTINES THAT ACTUALLY DO THE WORK
524 -
525 -=cut
526 -
527 -=head2 handle_trac_projects()
528 -
529 -Determine whether to modify or add the trac project environment
530 -
531 -=cut
532 -
533 -sub handle_trac_projects {
534 -
535 - my ($fm) = @_;
536 -
537 - if ($fm->cgi->param("action") eq "create") {
538 - $fm->create_trac_project();
539 - } else {
540 - $fm->modify_trac_project();
541 - }
542 -
543 -}
544 -
545 -=head2 create_trac_project()
546 -
547 -Handle the create event for the trac project environment
548 -
549 -=cut
550 -
551 -sub create_trac_project {
552 -
553 - my ($fm) = @_;
554 -
555 - # Validate Name
556 - # =============
557 -
558 - my $name = $fm->cgi->param('tracName');
559 - my $msg;
560 -
561 - $msg = $fm->validate_name($name);
562 - unless ($msg eq "OK")
563 - {
564 - return $fm->error($msg);
565 - }
566 -
567 - $msg = $fm->max_trac_project_name_length($name);
568 - unless ($msg eq "OK")
569 - {
570 - return $fm->error($msg);
571 - }
572 -
573 - $msg = $fm->conflict_check($name);
574 - unless ($msg eq "OK")
575 - {
576 - return $fm->error($msg);
577 - }
578 -
579 - # Validate & Setup Domain List
580 - # ============================
581 -
582 - my @active_trac_domains = $fm->cgi->param('tracDomains');
583 -
584 - $msg = $fm->validate_trac_has_domains(@active_trac_domains);
585 - unless ($msg eq "OK")
586 - {
587 - return $fm->error($msg);
588 - }
589 -
590 - my $domain_list = "";
591 - foreach my $domain (@active_trac_domains) {
592 - if ($domain_list) {
593 - $domain_list .= "," . $domain;
594 - } else {
595 - $domain_list = $domain;
596 - }
597 - }
598 -
599 - # Setup Group List
600 - # ================
601 -
602 - my @groups = $fm->cgi->param('tracGroups');
603 -
604 - my $group_list = "";
605 - foreach my $group (@groups) {
606 - if ($group_list) {
607 - $group_list .= "," . $group;
608 - } else {
609 - $group_list = $group;
610 - }
611 - }
612 -
613 - # Setup User List
614 - # ===============
615 -
616 - my @users = $fm->cgi->param('tracUsers');
617 -
618 - my $user_list = "";
619 - foreach my $user (@users) {
620 - if ($user_list) {
621 - $user_list .= "," . $user;
622 - } else {
623 - $user_list = $user;
624 - }
625 - }
626 -
627 - # Update Database
628 - # ===============
629 -
630 - my $uid = $AccountsDB->get_next_uid();
631 - if (my $acct = $AccountsDB->new_record($name, {
632 - Description => $fm->cgi->param('tracDescription'),
633 - Repository => $fm->cgi->param('tracRepository'),
634 - RepositoryPath => $fm->cgi->param('tracRepositoryPath'),
635 - Domains => "$domain_list",
636 - Groups => "$group_list",
637 - Users => "$user_list",
638 - Modifiable => 'yes',
639 - Removable => 'yes',
640 - Access => $fm->cgi->param('tracAccess'),
641 - type => 'trac',
642 - }) )
643 - {
644 - # Untaint $name before use in system()
645 - $name =~ /(.+)/; $name = $1;
646 -
647 - $fm->clear_params();
648 -
649 - if (system ("/sbin/e-smith/signal-event", "trac-project-create", $name) == 0) {
650 - $fm->success("SUCCESSFULLY_CREATED_TRAC_PROJECT");
651 - } else {
652 - $fm->error("ERROR_WHILE_CREATING_TRAC_PROJECT");
653 - }
654 - } else {
655 - $fm->error('CANT_CREATE_TRAC_PROJECT');
656 - }
657 -}
658 -
659 -=head2 modify_trac_project()
660 -
661 -Handle the modify event for the trac project environment
662 -
663 -=cut
664 -
665 -sub modify_trac_project {
666 -
667 - my ($fm) = @_;
668 - my $name = $fm->cgi->param('tracName');
669 -
670 - # Validate Name
671 - # =============
672 -
673 - my $msg = $fm->validate_name($name);
674 - unless ($msg eq "OK")
675 - {
676 - return $fm->error($msg);
677 - }
678 -
679 - # Validate & Setup Domain List
680 - # ============================
681 -
682 - my @active_trac_domains = $fm->cgi->param('tracDomains');
683 -
684 - $msg = $fm->validate_trac_has_domains(@active_trac_domains);
685 - unless ($msg eq "OK")
686 - {
687 - return $fm->error($msg);
688 - }
689 -
690 - my $domain_list;
691 - foreach my $domain (@active_trac_domains) {
692 - if ($domain_list) {
693 - $domain_list .= "," . $domain;
694 - } else {
695 - $domain_list = $domain;
696 - }
697 - }
698 -
699 - # Setup Group List
700 - # ================
701 -
702 - my @groups = $fm->cgi->param('tracGroups');
703 -
704 - my $group_list;
705 - foreach my $group (@groups) {
706 - if ($group_list) {
707 - $group_list .= "," . $group;
708 - } else {
709 - $group_list = $group;
710 - }
711 - }
712 -
713 - # Setup User List
714 - # ===============
715 -
716 - my @users = $fm->cgi->param('tracUsers');
717 -
718 - my $user_list;
719 - foreach my $user (@users) {
720 - if ($user_list) {
721 - $user_list .= "," . $user;
722 - } else {
723 - $user_list = $user;
724 - }
725 - }
726 -
727 - # Update Database
728 - # ===============
729 -
730 - if (my $acct = $AccountsDB->get($name)) {
731 - if ($acct->prop('type') eq 'trac') {
732 -
733 - $acct->merge_props(
734 - Description => $fm->cgi->param('tracDescription'),
735 - Repository => $fm->cgi->param('tracRepository'),
736 - RepositoryPath => $fm->cgi->param('tracRepositoryPath'),
737 - Domains => $domain_list,
738 - Groups => $group_list,
739 - Users => $user_list,
740 - Access => $fm->cgi->param('tracAccess'),
741 - type => 'trac',
742 - );
743 -
744 - # Untaint $name before use in system()
745 - $name =~ /(.+)/; $name = $1;
746 -
747 - $fm->clear_params();
748 -
749 - if (system ("/sbin/e-smith/signal-event", "trac-project-modify", $name) == 0)
750 - {
751 - $fm->success("SUCCESSFULLY_MODIFIED_TRAC_PROJECT");
752 - } else {
753 - $fm->error("ERROR_WHILE_MODIFYING_TRAC_PROJECT");
754 - }
755 - } else {
756 - $fm->error('CANT_FIND_TRAC_PROJECT');
757 - }
758 - } else {
759 - $fm->error('CANT_FIND_TRAC_PROJECT');
760 - }
761 -}
762 -
763 -=head2 remove_trac_project()
764 -
765 -Handle the remove event for the trac project environment
766 -
767 -=cut
768 -
769 -sub remove_trac_project {
770 -
771 - my $fm = shift;
772 -
773 - my $name = $fm->cgi->param('tracName');
774 - if (my $acct = $AccountsDB->get($name)) {
775 - if ($acct->prop('type') eq 'trac') {
776 - $acct->set_prop('type', 'trac-deleted');
777 -
778 - # Untaint $name before use in system()
779 - $name =~ /(.+)/; $name = $1;
780 - if (system ("/sbin/e-smith/signal-event", "trac-project-delete", $name) == 0) {
781 - $fm ->success("SUCCESSFULLY_DELETED_TRAC_PROJECT");
782 - $acct->delete();
783 - } else {
784 - $fm ->error("ERROR_WHILE_DELETING_TRAC_PROJECT");
785 - }
786 - } else {
787 - $fm->error('CANT_FIND_TRAC_PROJECT');
788 - }
789 -
790 - } else {
791 - $fm->error('CANT_FIND_TRAC_PROJECT');
792 - }
793 - $fm->wherenext('First');
794 -}
795 -
796 -=head1 VALIDATION ROUTINES
797 -
798 -=head2 max_trac_project_name_length()
799 -
800 -Checks the length of a given trac project environment name against the
801 -maximum set in the maxTracNameLength record of the configuration database.
802 -Defaults to a maximum length of $self->{defaultMaxLength} if nothing is
803 -set in the config db.
804 -
805 -=cut
806 -
807 -sub max_trac_project_name_length {
808 - my ($fm, $data) = @_;
809 -
810 - $ConfigDB->reload();
811 - my $max;
812 - if (my $max_record = $ConfigDB->get('maxTracNameLength')) {
813 - $max = $max_record->value();
814 - }
815 -
816 - if (length($data) <= $max) {
817 - return "OK";
818 - } else {
819 - return $fm->localise("MAX_TRAC_NAME_LENGTH_ERROR",
820 - {acctName => $data,
821 - maxRepositoryNameLength => $max,
822 - maxLength => $max});
823 - }
824 -}
825 -
826 -=head2 getExtraParams()
827 -
828 -Sets variables used in the lexicon to their required values.
829 -
830 -=cut
831 -
832 -sub getExtraParams {
833 -
834 - my $fm = shift;
835 - my $TracProjectName = $fm->cgi->param('tracName');
836 - my $TracProjectDescription = '';
837 - my $maxLength = $ConfigDB->get('maxTracNameLength');
838 -
839 - if ($TracProjectName)
840 - {
841 - my $TracAccount = $AccountsDB->get($TracProjectName);
842 - if ($TracAccount)
843 - {
844 - $TracProjectDescription = $TracAccount->prop('Description');
845 - }
846 - }
847 -
848 - return (name => $TracProjectName,
849 - description => $TracProjectDescription,
850 - maxLength => $maxLength);
851 -}
852 -
853 -=head2 validate_name()
854 -
855 -Checks that the name supplied does not contain any unacceptable chars.
856 -Returns OK on success or a localised error message otherwise.
857 -
858 -=cut
859 -
860 -sub validate_name {
861 -
862 - my ($fm, $tracName) = @_;
863 -
864 - unless ($tracName =~ /^([a-z][\_\.\-a-z0-9]*)$/)
865 - {
866 - return $fm->localise('TRAC_PROJECT_NAME_HAS_INVALID_CHARS', {tracName => $tracName});
867 - }
868 -
869 - return "OK";
870 -}
871 -
872 -=head2 conflict_check()
873 -
874 -Check the proposed name for clashes with existing pseudonyms or other
875 -accounts of any type.
876 -
877 -=cut
878 -
879 -sub conflict_check {
880 -
881 - my ($fm, $name) = @_;
882 - my $rec = $AccountsDB->get($name);
883 -
884 - my $type;
885 - if (defined $rec)
886 - {
887 - my $type = $rec->prop('type');
888 - if ($type eq "pseudonym")
889 - {
890 - my $acct = $rec->prop("Account");
891 - my $acct_type = $AccountsDB->get($acct)->prop('type');
892 -
893 - return $fm->localise('ACCT_CLASHES_WITH_PSEUDONYM',
894 - {acctName => $name, acctType => $acct_type, acct => $acct});
895 - }
896 - }
897 - elsif (defined getpwnam($name) || defined getgrnam($name))
898 - {
899 - $type = 'system';
900 - }
901 - else
902 - {
903 - # No account record and no account
904 - return 'OK';
905 - }
906 - return $fm->localise('ACCOUNT_EXISTS',
907 - {acctName => $name, acctType => $type});
908 -}
909 -
910 -=head2 validate_trac_has_domains()
911 -
912 -Validates that the cgi parameter DOMAINS is an array with at least one entry
913 -Returns OK if true. Otherwise, returns NO_DOMAINS
914 -
915 -=cut
916 -
917 -sub validate_trac_has_domains {
918 -
919 - my $fm = shift;
920 - my @domains = @_;
921 -
922 - my $count = @domains;
923 -
924 - if ( $count == 0 ) {
925 - return ('NO_DOMAINS');
926 - }
927 - else {
928 - return ('OK');
929 - }
930 -}
931 -
932 -=head2 clear_params()
933 -
934 -This method clears-out the parameters used in form submission so that they are
935 -not inadvertenly picked-up where they should not be.
936 -
937 -=cut
938 -
939 -sub clear_params {
940 -
941 - my $fm = shift;
942 - my $q = $fm->{cgi};
943 -
944 - # Don't delete tracName here as we need in the next page for
945 - # status messages.
946 -
947 - $q->delete('tracDescription');
948 - $q->delete('tracRepository');
949 - $q->delete('tracRepositoryPath');
950 - $q->delete('tracDomains');
951 - $q->delete('tracGroups');
952 - $q->delete('tracUsers');
953 - $q->delete('tracAccess');
954 -
955 -}
956 -
957 -1;
958 +#!/usr/bin/perl -w
959 +#----------------------------------------------------------------------
960 +# $Id: trac.pm 69 2007-03-25 13:20:24Z marco $
961 +# vim: ft=perl ts=4 sw=4 et:
962 +#----------------------------------------------------------------------
963 +# Copyright (C) 2007 Marco Hess
964 +#
965 +# This program is free software; you can redistribute it and/or modify
966 +# it under the terms of the GNU General Public License as published by
967 +# the Free Software Foundation; either version 2 of the License, or
968 +# (at your option) any later version.
969 +#
970 +# This program is distributed in the hope that it will be useful,
971 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
972 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
973 +# GNU General Public License for more details.
974 +#
975 +# You should have received a copy of the GNU General Public License
976 +# along with this program; if not, write to the Free Software
977 +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
978 +#----------------------------------------------------------------------
979 +
980 +package esmith::FormMagick::Panel::trac;
981 +
982 +use strict;
983 +use warnings;
984 +
985 +use esmith::FormMagick;
986 +use esmith::AccountsDB;
987 +use esmith::ConfigDB;
988 +use esmith::DomainsDB;
989 +use esmith::cgi;
990 +use esmith::util;
991 +use File::Basename;
992 +use Exporter;
993 +use Carp;
994 +use Sys::Syslog;
995 +
996 +use constant TRUE => 1;
997 +use constant FALSE => 0;
998 +
999 +our @ISA = qw(esmith::FormMagick Exporter);
1000 +
1001 +our @EXPORT = qw(
1002 + show_trac_projects
1003 + print_trac_field_name
1004 + repositories_list
1005 + group_list
1006 + user_list
1007 + max_trac_project_name_length
1008 + handle_trac_projects
1009 + create_trac_project
1010 + remove_trac_project
1011 + getExtraParams
1012 + print_save_or_add_button
1013 + validate_name
1014 + validate_radio
1015 + wherenext
1016 + maxLength
1017 +);
1018 +
1019 +our $ConfigDB = esmith::ConfigDB->open
1020 + or die "Can't open the Config database : $!\n" ;
1021 +
1022 +our $AccountsDB = esmith::AccountsDB->open
1023 + or die "Can't open the Account database : $!\n" ;
1024 +
1025 +our $DomainsDB = esmith::DomainsDB->open
1026 + or die "Can't open the Domains database : $!\n" ;
1027 +
1028 +
1029 +# fields and records separator for sub records
1030 +use constant FS => "," ;
1031 +use constant RS => ";" ;
1032 +
1033 +=pod
1034 +
1035 +=head1 NAME
1036 +
1037 +esmith::FormMagick::Panels::trac - Trac
1038 +
1039 +=head1 SYNOPSIS
1040 +
1041 +use esmith::FormMagick::Panels::trac
1042 +
1043 +my $panel = esmith::FormMagick::Panel::trac->new();
1044 +$panel->display();
1045 +
1046 +=head1 DESCRIPTION
1047 +
1048 +This module is the backend to the Trac panel, responsible
1049 +for supplying all functions used by that panel. It is a subclass
1050 +of esmith::FormMagick itself, so it inherits the functionality
1051 +of a FormMagick object.
1052 +
1053 +=cut
1054 +
1055 +=head2 new()
1056 +
1057 +Exactly as for esmith::FormMagick
1058 +
1059 +=cut
1060 +
1061 +sub new
1062 +{
1063 + my $proto = shift;
1064 + my $class = ref($proto) || $proto;
1065 + my $self = esmith::FormMagick::new($class);
1066 + $self->{calling_package} = (caller)[0];
1067 +
1068 + return $self;
1069 +}
1070 +
1071 +=head1 HTML GENERATION ROUTINES
1072 +
1073 +Routines for generating chunks of HTML needed by the panel.
1074 +
1075 +=cut
1076 +
1077 +=head2 show_trac_projects()
1078 +
1079 +This function displays a table of trac project environments on the system
1080 +including the links to modify and remove the trac project environment.
1081 +
1082 +=cut
1083 +
1084 +sub show_trac_projects {
1085 + my $fm = shift;
1086 + my $q = $fm->{cgi};
1087 +
1088 + # Setup the various localised text field for the trac project table
1089 + my $name = $fm->localise('NAME');
1090 + my $description = $fm->localise('DESCRIPTION');
1091 + my $domains = $fm->localise('DOMAINS');
1092 + my $repository = $fm->localise('REPOSITORY');
1093 + my $path = $fm->localise('PATH');
1094 + my $access = $fm->localise('DESCRIPTION');
1095 + my $action_h = $fm->localise('ACTION');
1096 + my $view = $fm->localise('VIEW');
1097 + my $modify = $fm->localise('MODIFY');
1098 + my $remove = $fm->localise('REMOVE');
1099 + my $backup = $fm->localise('BACKUP');
1100 + my $restore = $fm->localise('RESTORE');
1101 +
1102 + print $q->start_table({-class => 'sme-noborder'}), "\n";
1103 +
1104 + # Check if any repositories exist
1105 + my @repositories = $AccountsDB->get_all_by_prop('type' => 'repository');
1106 + unless ( scalar @repositories )
1107 + {
1108 + print $q->Tr($q->td($q->h2($fm->localise('NO_REPOSITORIES'))));
1109 + return "";
1110 + }
1111 +
1112 + # TODO what about the case that all repositories have been deleted
1113 + # but the Trac project environments are still there? Can we remove the
1114 + # trac projects or do we need to reassign the projects to
1115 + # another repository? The code above prevents us from accessing the
1116 + # trac projects when there are no more repositories.
1117 +
1118 + print $q->Tr($q->td($q->a({-class => "button-like",
1119 + href => "trac?page=0&page_stack=&Next=Next&wherenext=Create"},
1120 + $fm->localise('TRAC_ADD_BUTTON'))));
1121 +
1122 + # Check if any trac projects exist
1123 + my @TracProjects = $AccountsDB->get_all_by_prop('type' => 'trac');
1124 + unless ( scalar @TracProjects )
1125 + {
1126 + print $q->Tr($q->td($q->h2($fm->localise('NO_TRAC_PROJECTS'))));
1127 + return "";
1128 + }
1129 +
1130 + # Show the list of configures trac projects
1131 + print $q->Tr($q->td($q->h2($fm->localise('CURRENT_TRAC_PROJECTS'))));
1132 +
1133 + print $q->Tr($q->td($fm->localise('TRAC_MODIFY_REMOVE_BUTTON_DESCRIPTION')));
1134 +
1135 + print $q->start_table({-CLASS => "sme-border"}),"\n";
1136 + print $q->Tr (
1137 + esmith::cgi::genSmallCell($q, $name, "header"),
1138 + esmith::cgi::genSmallCell($q, $description,"header"),
1139 + esmith::cgi::genSmallCell($q, $domains, "header"),
1140 + esmith::cgi::genSmallCell($q, $repository, "header"),
1141 + esmith::cgi::genSmallCell($q, $path, "header"),
1142 + esmith::cgi::genSmallCell($q, $access, "header"),
1143 + esmith::cgi::genSmallCell($q, $action_h, "header", 3)),"\n";
1144 +
1145 + my $scriptname = basename($0);
1146 +
1147 + foreach my $TracProject (@TracProjects)
1148 + {
1149 + my $trac_name = $TracProject->key();
1150 + my $trac_desc = $TracProject->prop('Description');
1151 + my $trac_domains = join("<br>", split(FS, $TracProject->prop('Domains')));
1152 + my $trac_repo = $TracProject->prop('Repository');
1153 + my $trac_path = $TracProject->prop('RepositoryPath');
1154 + my $trac_access = $TracProject->prop('Access') || 'local';
1155 + my $modifiable = $TracProject->prop('Modifiable') || 'yes';
1156 + my $removable = $TracProject->prop('Removable') || 'yes';
1157 +
1158 + my $params = $fm->build_trac_project_cgi_params($trac_name, $TracProject->props());
1159 +
1160 + my $href = "$scriptname?$params&action=modify&wherenext=";
1161 +
1162 + my $actionView = '&nbsp;';
1163 + $actionView .= $q->a({href => '/' . $TracProject->key(),
1164 + target => '_blank'}, $view ) . '&nbsp;';
1165 +
1166 + my $actionModify = '&nbsp;';
1167 + if ($modifiable eq 'yes')
1168 + {
1169 + $actionModify .= $q->a({href => "${href}Modify"}, $modify) . '&nbsp;';
1170 + }
1171 +
1172 + my $actionRemove = '&nbsp;';
1173 + if ($removable eq 'yes')
1174 + {
1175 + $actionRemove .= $q->a({href => "${href}Remove"}, $remove) . '&nbsp;';
1176 + }
1177 +
1178 + my $actionBackup = '&nbsp;';
1179 + $actionBackup .= $q->a({href => "${href}Backup"}, $backup) . '&nbsp;';
1180 +
1181 + my $actionRestore = '&nbsp;';
1182 + $actionRestore .= $q->a({href => "${href}Restore"}, $restore) . '&nbsp;';
1183 +
1184 + print $q->Tr(
1185 + esmith::cgi::genSmallCell($q, $trac_name, "normal"),
1186 + esmith::cgi::genSmallCell($q, $trac_desc, "normal"),
1187 + esmith::cgi::genSmallCell($q, $trac_domains, "normal"),
1188 + esmith::cgi::genSmallCell($q, $trac_repo, "normal"),
1189 + esmith::cgi::genSmallCell($q, $trac_path, "normal"),
1190 + esmith::cgi::genSmallCell($q, $trac_access, "normal"),
1191 + esmith::cgi::genSmallCell($q, $actionView, "normal"),
1192 + esmith::cgi::genSmallCell($q, $actionModify, "normal"),
1193 + esmith::cgi::genSmallCell($q, $actionRemove, "normal")
1194 + );
1195 + }
1196 +
1197 + print $q->end_table,"\n";
1198 +
1199 + print $q->end_table,"\n";
1200 +
1201 + return "";
1202 +}
1203 +
1204 +=cut
1205 +
1206 +=head2 print_save_or_add_button()
1207 +
1208 +Prints the ADD button when a new trac project environment is addded and the SAVE buttom
1209 +whem modifications are made.
1210 +
1211 +=cut
1212 +
1213 +sub print_save_or_add_button {
1214 +
1215 + my ($fm) = @_;
1216 +
1217 + my $cgi = $fm->{cgi};
1218 +
1219 + if (($cgi->param("action") || '') eq "modify") {
1220 + $fm->print_button("SAVE");
1221 + } else {
1222 + $fm->print_button("ADD");
1223 + }
1224 +}
1225 +
1226 +=head1 HELPER FUNCTIONS FOR THE PANEL
1227 +
1228 +Routines for modifying the database and signaling events
1229 +from the server-manager panel
1230 +
1231 +=cut
1232 +
1233 +=head2 build_trac_project_cgi_params($fm, $tracprojectname, %oldprops)
1234 +
1235 +Constructs the parameters for the links in the trac project environments table
1236 +
1237 +=cut
1238 +
1239 +sub build_trac_project_cgi_params {
1240 + my ($self, $tracprojectname, %oldprops) = @_;
1241 +
1242 + my %props = (
1243 + page => 0,
1244 + page_stack => "",
1245 + tracName => $tracprojectname,
1246 + );
1247 +
1248 + return $self->props_to_query_string(\%props);
1249 +}
1250 +
1251 +*wherenext = \&CGI::FormMagick::wherenext;
1252 +
1253 +=head2 print_trac_field_name()
1254 +
1255 +Helper function to print the field NAME so that it becomes
1256 +an edit field upon ADD and a fixed field upon MODIFY.
1257 +
1258 +Also read all the account db values so the other fields
1259 +can show the existing values.
1260 +
1261 +=cut
1262 +
1263 +sub print_trac_field_name {
1264 + my $fm = shift;
1265 + my $in = $fm->{cgi}->param('tracName') || '';
1266 + my $action = $fm->{cgi}->param('action') || '';
1267 +
1268 + print qq(<tr><td class="sme-noborders-label">) .
1269 + $fm->localise('TRAC_FIELD_PROJECT_NAME') . qq(</td>\n);
1270 +
1271 + if ($action eq 'modify' and $in) {
1272 + #-------------------------------------------------------
1273 + # Updating an existing record.
1274 + #--------------------------------------------------------
1275 +
1276 + my $rec = $AccountsDB->get($in);
1277 + my $modifiable = $rec->prop('Modifiable') || 'yes';
1278 + my $removable = $rec->prop('Removable') || 'yes';
1279 +
1280 + print qq(
1281 + <td class="sme-noborders-content">$in
1282 + <input type="hidden" name="tracName" value="$in">
1283 + <input type="hidden" name="action" value="modify">
1284 + </td>
1285 + );
1286 +
1287 + # Read the values for each field from the accounts db and store
1288 + # them in the cgi object so our form will have the correct
1289 + # info displayed.
1290 + my $q = $fm->{cgi};
1291 + if ($rec)
1292 + {
1293 + $q->param(-name=>'tracDescription',-value=>
1294 + $rec->prop('Description'));
1295 +
1296 + $q->param(-name=>'tracRepository',-value=>
1297 + $rec->prop('Repository'));
1298 +
1299 + $q->param(-name=>'tracRepositoryPath',-value=>
1300 + $rec->prop('RepositoryPath'));
1301 +
1302 + # domain list is handled separately
1303 +
1304 + $q->param(-name=>'tracGroups',-value=>
1305 + join(FS, split(FS, $rec->prop('Groups'))));
1306 +
1307 + $q->param(-name=>'tracUsers',-value=>
1308 + join(FS, split(FS, $rec->prop('Users'))));
1309 +
1310 + $q->param(-name=>'tracAccess',-value=>
1311 + $rec->prop('Access')),
1312 + }
1313 + } else {
1314 + #-------------------------------------------------------
1315 + # Adding a new record so allow an entry field for the
1316 + # name.
1317 + #--------------------------------------------------------
1318 + print qq(
1319 + <td><input type="text" name="tracName" value="$in">
1320 + <input type="hidden" name="action" value="create">
1321 + </td>
1322 + );
1323 + }
1324 +
1325 + print qq(</tr>\n);
1326 + return undef;
1327 +}
1328 +
1329 +
1330 +=head2 print_trac_domains()
1331 +
1332 +When this server has more than one domain this function takes
1333 +the list of domains and returns a string of html checkboxes
1334 +for all these domains.
1335 +
1336 +Those domains that are listed with this Trac environment
1337 +will have their checkbox checked.
1338 +
1339 +=cut
1340 +
1341 +sub print_trac_domains() {
1342 +
1343 + # Retrieve the Trac account name from the CGI parameters
1344 + my $fm = shift;
1345 + my $name = $fm->{'cgi'}->param('tracName');
1346 + my $action = $fm->{'cgi'}->param("action") || '';
1347 + my $out = "";
1348 +
1349 + # Get a full list of all the domains on this server.
1350 + my @domains = $DomainsDB->get_all_by_prop( type => 'domain' );
1351 + my $numdomains = @domains;
1352 +
1353 + # If there is more than one domain, we generate a list
1354 + # of checkboxes. Otherwise we just show the primary domain.
1355 + if ($numdomains > 1) {
1356 +
1357 + # With the Trac account name, get the list of the Domains for which
1358 + # this Trac account is active.
1359 + my $trac_domains_list = "";
1360 + if ($AccountsDB->get($name)) {
1361 + $trac_domains_list = $AccountsDB->get($name)->prop('Domains');
1362 + }
1363 +
1364 + # Split the comma separated list into the individual bits.
1365 + my %trac_domains;
1366 + foreach my $trac_domain ( split ( /,/, $trac_domains_list ) ) {
1367 + $trac_domains{$trac_domain} = 1;
1368 + }
1369 +
1370 + # Now generate the table of domains with a checkbox in front of it.
1371 + # If the domain is in our listed domains for the Trac environment, the
1372 + # checkbox will show checked.
1373 + $out = " <tr>\n";
1374 + $out .= " <td colspan=2>" . $fm->localise('TRAC_FIELD_DOMAINS_DESCRIPTION') . "</td>";
1375 + $out .= " </tr>\n";
1376 + $out .= " <tr>\n";
1377 + $out .= " <td class=\"sme-noborders-label\">" . $fm->localise('DOMAINS') . "</td>\n";
1378 + $out .= " <td>\n";
1379 + $out .= " <table border='0' cellspacing='0' cellpadding='0'>\n";
1380 + $out .= " <tr>\n";
1381 +
1382 + foreach my $domain (sort @domains) {
1383 +
1384 + # If this is a ADD form, we default check all domains, otherwise only
1385 + # those that are in our Trac project list.
1386 + my $checked = "";
1387 + if ( $action eq 'modify' ) {
1388 + if ( $trac_domains{ $domain->key() } ) {
1389 + $checked = "checked";
1390 + }
1391 + } else {
1392 + $checked = "checked";
1393 + }
1394 +
1395 + $out .= " <tr>\n";
1396 + $out .= " <td><input type=\"checkbox\" name=\"tracDomains\" $checked value=\"" . $domain->key . "\"></td>\n";
1397 + $out .= " <td>" . $domain->key . "</td>\n";
1398 + $out .= " </tr>\n";
1399 + }
1400 +
1401 + $out .= " </table>\n";
1402 + $out .= " </td>\n";
1403 + $out .= " </tr>\n";
1404 + }
1405 + else
1406 + {
1407 + # We only have a single domain, so we just show this domain but without the
1408 + # checkbox (so it can't be unchecked).
1409 + my $domainname = $ConfigDB->get('DomainName')->value();
1410 + $out = " <tr>\n";
1411 + $out .= " <td colspan=2>" . $fm->localise('TRAC_FIELD_DOMAIN_DESCRIPTION') . "</td>";
1412 + $out .= " </tr>\n";
1413 + $out .= " <tr>\n";
1414 + $out .= " <td class=\"sme-noborders-label\">" . $fm->localise('DOMAIN') . "</td>\n";
1415 + $out .= " <td><input type=\"hidden\" name=\"tracDomains\" value=\"" . $domainname . "\">";
1416 + $out .= $domainname . "</td>\n";
1417 + $out .= " </tr>\n";
1418 + }
1419 +
1420 + return $out;
1421 +}
1422 +
1423 +
1424 +=pod
1425 +
1426 +=head2 repositories_list()
1427 +
1428 +Returns a hash of repositories for the Create/Modify screen's repository
1429 +field's drop down list.
1430 +
1431 +=cut
1432 +
1433 +sub repositories_list
1434 +{
1435 + my @repositories = $AccountsDB->get_all_by_prop('type' => 'repository');
1436 + my %repositories = ();
1437 + foreach my $repository (@repositories) {
1438 + $repositories{$repository->key()} = $repository->prop('Description') . " (" . $repository->key . ")";
1439 + }
1440 + return \%repositories;
1441 +}
1442 +
1443 +=head2 group_list()
1444 +
1445 +Returns a hash of groups for the Create/Modify screen's group
1446 +field's drop down list.
1447 +
1448 +=cut
1449 +
1450 +sub group_list
1451 +{
1452 + my @groups = $AccountsDB->groups();
1453 + my %groups = ();
1454 + foreach my $group (@groups) {
1455 + $groups{$group->key()} = $group->prop('Description')." (".$group->key.")";
1456 + }
1457 + return \%groups;
1458 +}
1459 +
1460 +=head2 user_list()
1461 +
1462 +Returns a hash of users for the Create/Modify screen's user field's
1463 +drop down list.
1464 +
1465 +=cut
1466 +
1467 +sub user_list
1468 +{
1469 + my @users = $AccountsDB->users();
1470 + my %users = ();
1471 + foreach my $user (@users) {
1472 + $users{$user->key()} = $user->prop('LastName').", ". $user->prop('FirstName')." (". $user->key.")";
1473 + }
1474 + return \%users;
1475 +}
1476 +
1477 +=head1 THE ROUTINES THAT ACTUALLY DO THE WORK
1478 +
1479 +=cut
1480 +
1481 +=head2 handle_trac_projects()
1482 +
1483 +Determine whether to modify or add the trac project environment
1484 +
1485 +=cut
1486 +
1487 +sub handle_trac_projects {
1488 +
1489 + my ($fm) = @_;
1490 +
1491 + if ($fm->cgi->param("action") eq "create") {
1492 + $fm->create_trac_project();
1493 + } else {
1494 + $fm->modify_trac_project();
1495 + }
1496 +
1497 +}
1498 +
1499 +=head2 create_trac_project()
1500 +
1501 +Handle the create event for the trac project environment
1502 +
1503 +=cut
1504 +
1505 +sub create_trac_project {
1506 +
1507 + my ($fm) = @_;
1508 +
1509 + # Validate Name
1510 + # =============
1511 +
1512 + my $name = $fm->cgi->param('tracName');
1513 + my $msg;
1514 +
1515 + $msg = $fm->validate_name($name);
1516 + unless ($msg eq "OK")
1517 + {
1518 + return $fm->error($msg);
1519 + }
1520 +
1521 + $msg = $fm->max_trac_project_name_length($name);
1522 + unless ($msg eq "OK")
1523 + {
1524 + return $fm->error($msg);
1525 + }
1526 +
1527 + $msg = $fm->conflict_check($name);
1528 + unless ($msg eq "OK")
1529 + {
1530 + return $fm->error($msg);
1531 + }
1532 +
1533 + # Validate & Setup Domain List
1534 + # ============================
1535 +
1536 + my @active_trac_domains = $fm->cgi->param('tracDomains');
1537 +
1538 + $msg = $fm->validate_trac_has_domains(@active_trac_domains);
1539 + unless ($msg eq "OK")
1540 + {
1541 + return $fm->error($msg);
1542 + }
1543 +
1544 + my $domain_list = "";
1545 + foreach my $domain (@active_trac_domains) {
1546 + if ($domain_list) {
1547 + $domain_list .= "," . $domain;
1548 + } else {
1549 + $domain_list = $domain;
1550 + }
1551 + }
1552 +
1553 + # Setup Group List
1554 + # ================
1555 +
1556 + my @groups = $fm->cgi->param('tracGroups');
1557 +
1558 + my $group_list = "";
1559 + foreach my $group (@groups) {
1560 + if ($group_list) {
1561 + $group_list .= "," . $group;
1562 + } else {
1563 + $group_list = $group;
1564 + }
1565 + }
1566 +
1567 + # Setup User List
1568 + # ===============
1569 +
1570 + my @users = $fm->cgi->param('tracUsers');
1571 +
1572 + my $user_list = "";
1573 + foreach my $user (@users) {
1574 + if ($user_list) {
1575 + $user_list .= "," . $user;
1576 + } else {
1577 + $user_list = $user;
1578 + }
1579 + }
1580 +
1581 + # Update Database
1582 + # ===============
1583 +
1584 + my $uid = $AccountsDB->get_next_uid();
1585 + if (my $acct = $AccountsDB->new_record($name, {
1586 + Description => $fm->cgi->param('tracDescription'),
1587 + Repository => $fm->cgi->param('tracRepository'),
1588 + RepositoryPath => $fm->cgi->param('tracRepositoryPath'),
1589 + Domains => "$domain_list",
1590 + Groups => "$group_list",
1591 + Users => "$user_list",
1592 + Modifiable => 'yes',
1593 + Removable => 'yes',
1594 + Access => $fm->cgi->param('tracAccess'),
1595 + type => 'trac',
1596 + }) )
1597 + {
1598 + # Untaint $name before use in system()
1599 + $name =~ /(.+)/; $name = $1;
1600 +
1601 + $fm->clear_params();
1602 +
1603 + if (system ("/sbin/e-smith/signal-event", "trac-project-create", $name) == 0) {
1604 + $fm->success("SUCCESSFULLY_CREATED_TRAC_PROJECT");
1605 + } else {
1606 + $fm->error("ERROR_WHILE_CREATING_TRAC_PROJECT");
1607 + }
1608 + } else {
1609 + $fm->error('CANT_CREATE_TRAC_PROJECT');
1610 + }
1611 +}
1612 +
1613 +=head2 modify_trac_project()
1614 +
1615 +Handle the modify event for the trac project environment
1616 +
1617 +=cut
1618 +
1619 +sub modify_trac_project {
1620 +
1621 + my ($fm) = @_;
1622 + my $name = $fm->cgi->param('tracName');
1623 +
1624 + # Validate Name
1625 + # =============
1626 +
1627 + my $msg = $fm->validate_name($name);
1628 + unless ($msg eq "OK")
1629 + {
1630 + return $fm->error($msg);
1631 + }
1632 +
1633 + # Validate & Setup Domain List
1634 + # ============================
1635 +
1636 + my @active_trac_domains = $fm->cgi->param('tracDomains');
1637 +
1638 + $msg = $fm->validate_trac_has_domains(@active_trac_domains);
1639 + unless ($msg eq "OK")
1640 + {
1641 + return $fm->error($msg);
1642 + }
1643 +
1644 + my $domain_list;
1645 + foreach my $domain (@active_trac_domains) {
1646 + if ($domain_list) {
1647 + $domain_list .= "," . $domain;
1648 + } else {
1649 + $domain_list = $domain;
1650 + }
1651 + }
1652 +
1653 + # Setup Group List
1654 + # ================
1655 +
1656 + my @groups = $fm->cgi->param('tracGroups');
1657 +
1658 + my $group_list;
1659 + foreach my $group (@groups) {
1660 + if ($group_list) {
1661 + $group_list .= "," . $group;
1662 + } else {
1663 + $group_list = $group;
1664 + }
1665 + }
1666 +
1667 + # Setup User List
1668 + # ===============
1669 +
1670 + my @users = $fm->cgi->param('tracUsers');
1671 +
1672 + my $user_list;
1673 + foreach my $user (@users) {
1674 + if ($user_list) {
1675 + $user_list .= "," . $user;
1676 + } else {
1677 + $user_list = $user;
1678 + }
1679 + }
1680 +
1681 + # Update Database
1682 + # ===============
1683 +
1684 + if (my $acct = $AccountsDB->get($name)) {
1685 + if ($acct->prop('type') eq 'trac') {
1686 +
1687 + $acct->merge_props(
1688 + Description => $fm->cgi->param('tracDescription'),
1689 + Repository => $fm->cgi->param('tracRepository'),
1690 + RepositoryPath => $fm->cgi->param('tracRepositoryPath'),
1691 + Domains => $domain_list,
1692 + Groups => $group_list,
1693 + Users => $user_list,
1694 + Access => $fm->cgi->param('tracAccess'),
1695 + type => 'trac',
1696 + );
1697 +
1698 + # Untaint $name before use in system()
1699 + $name =~ /(.+)/; $name = $1;
1700 +
1701 + $fm->clear_params();
1702 +
1703 + if (system ("/sbin/e-smith/signal-event", "trac-project-modify", $name) == 0)
1704 + {
1705 + $fm->success("SUCCESSFULLY_MODIFIED_TRAC_PROJECT");
1706 + } else {
1707 + $fm->error("ERROR_WHILE_MODIFYING_TRAC_PROJECT");
1708 + }
1709 + } else {
1710 + $fm->error('CANT_FIND_TRAC_PROJECT');
1711 + }
1712 + } else {
1713 + $fm->error('CANT_FIND_TRAC_PROJECT');
1714 + }
1715 +}
1716 +
1717 +=head2 remove_trac_project()
1718 +
1719 +Handle the remove event for the trac project environment
1720 +
1721 +=cut
1722 +
1723 +sub remove_trac_project {
1724 +
1725 + my $fm = shift;
1726 +
1727 + my $name = $fm->cgi->param('tracName');
1728 + if (my $acct = $AccountsDB->get($name)) {
1729 + if ($acct->prop('type') eq 'trac') {
1730 + $acct->set_prop('type', 'trac-deleted');
1731 +
1732 + # Untaint $name before use in system()
1733 + $name =~ /(.+)/; $name = $1;
1734 + if (system ("/sbin/e-smith/signal-event", "trac-project-delete", $name) == 0) {
1735 + $fm ->success("SUCCESSFULLY_DELETED_TRAC_PROJECT");
1736 + $acct->delete();
1737 + } else {
1738 + $fm ->error("ERROR_WHILE_DELETING_TRAC_PROJECT");
1739 + }
1740 + } else {
1741 + $fm->error('CANT_FIND_TRAC_PROJECT');
1742 + }
1743 +
1744 + } else {
1745 + $fm->error('CANT_FIND_TRAC_PROJECT');
1746 + }
1747 + $fm->wherenext('First');
1748 +}
1749 +
1750 +=head1 VALIDATION ROUTINES
1751 +
1752 +=head2 max_trac_project_name_length()
1753 +
1754 +Checks the length of a given trac project environment name against the
1755 +maximum set in the maxTracNameLength record of the configuration database.
1756 +Defaults to a maximum length of $self->{defaultMaxLength} if nothing is
1757 +set in the config db.
1758 +
1759 +=cut
1760 +
1761 +sub max_trac_project_name_length {
1762 + my ($fm, $data) = @_;
1763 +
1764 + $ConfigDB->reload();
1765 + my $max;
1766 + if (my $max_record = $ConfigDB->get('maxTracNameLength')) {
1767 + $max = $max_record->value();
1768 + }
1769 +
1770 + if (length($data) <= $max) {
1771 + return "OK";
1772 + } else {
1773 + return $fm->localise("MAX_TRAC_NAME_LENGTH_ERROR",
1774 + {acctName => $data,
1775 + maxRepositoryNameLength => $max,
1776 + maxLength => $max});
1777 + }
1778 +}
1779 +
1780 +=head2 getExtraParams()
1781 +
1782 +Sets variables used in the lexicon to their required values.
1783 +
1784 +=cut
1785 +
1786 +sub getExtraParams {
1787 +
1788 + my $fm = shift;
1789 + my $TracProjectName = $fm->cgi->param('tracName');
1790 + my $TracProjectDescription = '';
1791 + my $maxLength = $ConfigDB->get('maxTracNameLength');
1792 +
1793 + if ($TracProjectName)
1794 + {
1795 + my $TracAccount = $AccountsDB->get($TracProjectName);
1796 + if ($TracAccount)
1797 + {
1798 + $TracProjectDescription = $TracAccount->prop('Description');
1799 + }
1800 + }
1801 +
1802 + return (name => $TracProjectName,
1803 + description => $TracProjectDescription,
1804 + maxLength => $maxLength);
1805 +}
1806 +
1807 +=head2 validate_name()
1808 +
1809 +Checks that the name supplied does not contain any unacceptable chars.
1810 +Returns OK on success or a localised error message otherwise.
1811 +
1812 +=cut
1813 +
1814 +sub validate_name {
1815 +
1816 + my ($fm, $tracName) = @_;
1817 +
1818 + unless ($tracName =~ /^([a-z][\_\.\-a-z0-9]*)$/)
1819 + {
1820 + return $fm->localise('TRAC_PROJECT_NAME_HAS_INVALID_CHARS', {tracName => $tracName});
1821 + }
1822 +
1823 + return "OK";
1824 +}
1825 +
1826 +=head2 conflict_check()
1827 +
1828 +Check the proposed name for clashes with existing pseudonyms or other
1829 +accounts of any type.
1830 +
1831 +=cut
1832 +
1833 +sub conflict_check {
1834 +
1835 + my ($fm, $name) = @_;
1836 + my $rec = $AccountsDB->get($name);
1837 +
1838 + my $type;
1839 + if (defined $rec)
1840 + {
1841 + my $type = $rec->prop('type');
1842 + if ($type eq "pseudonym")
1843 + {
1844 + my $acct = $rec->prop("Account");
1845 + my $acct_type = $AccountsDB->get($acct)->prop('type');
1846 +
1847 + return $fm->localise('ACCT_CLASHES_WITH_PSEUDONYM',
1848 + {acctName => $name, acctType => $acct_type, acct => $acct});
1849 + }
1850 + }
1851 + elsif (defined getpwnam($name) || defined getgrnam($name))
1852 + {
1853 + $type = 'system';
1854 + }
1855 + else
1856 + {
1857 + # No account record and no account
1858 + return 'OK';
1859 + }
1860 + return $fm->localise('ACCOUNT_EXISTS',
1861 + {acctName => $name, acctType => $type});
1862 +}
1863 +
1864 +=head2 validate_trac_has_domains()
1865 +
1866 +Validates that the cgi parameter DOMAINS is an array with at least one entry
1867 +Returns OK if true. Otherwise, returns NO_DOMAINS
1868 +
1869 +=cut
1870 +
1871 +sub validate_trac_has_domains {
1872 +
1873 + my $fm = shift;
1874 + my @domains = @_;
1875 +
1876 + my $count = @domains;
1877 +
1878 + if ( $count == 0 ) {
1879 + return ('NO_DOMAINS');
1880 + }
1881 + else {
1882 + return ('OK');
1883 + }
1884 +}
1885 +
1886 +=head2 clear_params()
1887 +
1888 +This method clears-out the parameters used in form submission so that they are
1889 +not inadvertenly picked-up where they should not be.
1890 +
1891 +=cut
1892 +
1893 +sub clear_params {
1894 +
1895 + my $fm = shift;
1896 + my $q = $fm->{cgi};
1897 +
1898 + # Don't delete tracName here as we need in the next page for
1899 + # status messages.
1900 +
1901 + $q->delete('tracDescription');
1902 + $q->delete('tracRepository');
1903 + $q->delete('tracRepositoryPath');
1904 + $q->delete('tracDomains');
1905 + $q->delete('tracGroups');
1906 + $q->delete('tracUsers');
1907 + $q->delete('tracAccess');
1908 +
1909 +}
1910 +
1911 +1;
1912 --- smeserver-trac-0.4/root/etc/e-smith/locale/es/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
1913 +++ smeserver-trac-0.4/root/etc/e-smith/locale/es/etc/e-smith/web/functions/trac 2008-04-26 16:43:13.000000000 +0200
1914 @@ -161,12 +161,12 @@
1915 </entry>
1916
1917 <entry>
1918 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
1919 + <base>REPOSITORY</base>
1920 <trans>Repositorio</trans>
1921 </entry>
1922
1923 <entry>
1924 - <base>TRAC_TABLE_HEADER_PATH</base>
1925 + <base>PATH</base>
1926 <trans>Ruta</trans>
1927 </entry>
1928
1929 @@ -181,7 +181,7 @@
1930 </entry>
1931
1932 <entry>
1933 - <base>TRAC_ACTION_VIEW</base>
1934 + <base>VIEW</base>
1935 <trans>Ver Proyecto Trac</trans>
1936 </entry>
1937
1938 --- smeserver-trac-0.4/root/etc/e-smith/locale/sv/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
1939 +++ smeserver-trac-0.4/root/etc/e-smith/locale/sv/etc/e-smith/web/functions/trac 2008-04-26 16:46:30.000000000 +0200
1940 @@ -161,12 +161,12 @@
1941 </entry>
1942
1943 <entry>
1944 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
1945 + <base>REPOSITORY</base>
1946 <trans>Förråd</trans>
1947 </entry>
1948
1949 <entry>
1950 - <base>TRAC_TABLE_HEADER_PATH</base>
1951 + <base>PATH</base>
1952 <trans>Sökväg</trans>
1953 </entry>
1954
1955 @@ -181,7 +181,7 @@
1956 </entry>
1957
1958 <entry>
1959 - <base>TRAC_ACTION_VIEW</base>
1960 + <base>VIEW</base>
1961 <trans>Visa Trac-projekt</trans>
1962 </entry>
1963
1964 --- smeserver-trac-0.4/root/etc/e-smith/locale/de/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
1965 +++ smeserver-trac-0.4/root/etc/e-smith/locale/de/etc/e-smith/web/functions/trac 2008-04-26 16:42:09.000000000 +0200
1966 @@ -161,12 +161,12 @@
1967 </entry>
1968
1969 <entry>
1970 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
1971 + <base>REPOSITORY</base>
1972 <trans>Repository</trans>
1973 </entry>
1974
1975 <entry>
1976 - <base>TRAC_TABLE_HEADER_PATH</base>
1977 + <base>PATH</base>
1978 <trans>Pfad</trans>
1979 </entry>
1980
1981 @@ -181,7 +181,7 @@
1982 </entry>
1983
1984 <entry>
1985 - <base>TRAC_ACTION_VIEW</base>
1986 + <base>VIEW</base>
1987 <trans>Trac Projekt ansehen</trans>
1988 </entry>
1989
1990 --- smeserver-trac-0.4/root/etc/e-smith/locale/id/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
1991 +++ smeserver-trac-0.4/root/etc/e-smith/locale/id/etc/e-smith/web/functions/trac 2008-04-26 16:44:24.000000000 +0200
1992 @@ -161,12 +161,12 @@
1993 </entry>
1994
1995 <entry>
1996 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
1997 + <base>REPOSITORY</base>
1998 <trans>Repository</trans>
1999 </entry>
2000
2001 <entry>
2002 - <base>TRAC_TABLE_HEADER_PATH</base>
2003 + <base>PATH</base>
2004 <trans>Path</trans>
2005 </entry>
2006
2007 @@ -181,7 +181,7 @@
2008 </entry>
2009
2010 <entry>
2011 - <base>TRAC_ACTION_VIEW</base>
2012 + <base>VIEW</base>
2013 <trans>View Trac Project</trans>
2014 </entry>
2015
2016 --- smeserver-trac-0.4/root/etc/e-smith/locale/pt_BR/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2017 +++ smeserver-trac-0.4/root/etc/e-smith/locale/pt_BR/etc/e-smith/web/functions/trac 2008-04-26 16:45:37.000000000 +0200
2018 @@ -161,12 +161,12 @@
2019 </entry>
2020
2021 <entry>
2022 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2023 + <base>REPOSITORY</base>
2024 <trans>Repositório</trans>
2025 </entry>
2026
2027 <entry>
2028 - <base>TRAC_TABLE_HEADER_PATH</base>
2029 + <base>PATH</base>
2030 <trans>Caminho</trans>
2031 </entry>
2032
2033 @@ -181,7 +181,7 @@
2034 </entry>
2035
2036 <entry>
2037 - <base>TRAC_ACTION_VIEW</base>
2038 + <base>VIEW</base>
2039 <trans>Ver Projeto Trac</trans>
2040 </entry>
2041
2042 --- smeserver-trac-0.4/root/etc/e-smith/locale/sl/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2043 +++ smeserver-trac-0.4/root/etc/e-smith/locale/sl/etc/e-smith/web/functions/trac 2008-04-26 16:46:07.000000000 +0200
2044 @@ -161,12 +161,12 @@
2045 </entry>
2046
2047 <entry>
2048 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2049 + <base>REPOSITORY</base>
2050 <trans>Repository</trans>
2051 </entry>
2052
2053 <entry>
2054 - <base>TRAC_TABLE_HEADER_PATH</base>
2055 + <base>PATH</base>
2056 <trans>Path</trans>
2057 </entry>
2058
2059 @@ -181,7 +181,7 @@
2060 </entry>
2061
2062 <entry>
2063 - <base>TRAC_ACTION_VIEW</base>
2064 + <base>VIEW</base>
2065 <trans>View Trac Project</trans>
2066 </entry>
2067
2068 --- smeserver-trac-0.4/root/etc/e-smith/locale/fr/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2069 +++ smeserver-trac-0.4/root/etc/e-smith/locale/fr/etc/e-smith/web/functions/trac 2008-04-26 16:43:34.000000000 +0200
2070 @@ -161,12 +161,12 @@
2071 </entry>
2072
2073 <entry>
2074 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2075 + <base>REPOSITORY</base>
2076 <trans>Entrepôt</trans>
2077 </entry>
2078
2079 <entry>
2080 - <base>TRAC_TABLE_HEADER_PATH</base>
2081 + <base>PATH</base>
2082 <trans>Sentier</trans>
2083 </entry>
2084
2085 @@ -181,7 +181,7 @@
2086 </entry>
2087
2088 <entry>
2089 - <base>TRAC_ACTION_VIEW</base>
2090 + <base>VIEW</base>
2091 <trans>Vue</trans>
2092 </entry>
2093
2094 --- smeserver-trac-0.4/root/etc/e-smith/locale/nl/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2095 +++ smeserver-trac-0.4/root/etc/e-smith/locale/nl/etc/e-smith/web/functions/trac 2008-04-26 16:45:14.000000000 +0200
2096 @@ -161,12 +161,12 @@
2097 </entry>
2098
2099 <entry>
2100 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2101 + <base>REPOSITORY</base>
2102 <trans>Subversion bewaarplaats</trans>
2103 </entry>
2104
2105 <entry>
2106 - <base>TRAC_TABLE_HEADER_PATH</base>
2107 + <base>PATH</base>
2108 <trans>Pad</trans>
2109 </entry>
2110
2111 @@ -181,7 +181,7 @@
2112 </entry>
2113
2114 <entry>
2115 - <base>TRAC_ACTION_VIEW</base>
2116 + <base>VIEW</base>
2117 <trans>Bekijk Trac project</trans>
2118 </entry>
2119
2120 --- smeserver-trac-0.4/root/etc/e-smith/locale/hu/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2121 +++ smeserver-trac-0.4/root/etc/e-smith/locale/hu/etc/e-smith/web/functions/trac 2008-04-26 16:43:59.000000000 +0200
2122 @@ -161,12 +161,12 @@
2123 </entry>
2124
2125 <entry>
2126 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2127 + <base>REPOSITORY</base>
2128 <trans>Repository</trans>
2129 </entry>
2130
2131 <entry>
2132 - <base>TRAC_TABLE_HEADER_PATH</base>
2133 + <base>PATH</base>
2134 <trans>Path</trans>
2135 </entry>
2136
2137 @@ -181,7 +181,7 @@
2138 </entry>
2139
2140 <entry>
2141 - <base>TRAC_ACTION_VIEW</base>
2142 + <base>VIEW</base>
2143 <trans>View Trac Project</trans>
2144 </entry>
2145
2146 --- smeserver-trac-0.4/root/etc/e-smith/locale/el/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2147 +++ smeserver-trac-0.4/root/etc/e-smith/locale/el/etc/e-smith/web/functions/trac 2008-04-26 16:42:47.000000000 +0200
2148 @@ -161,12 +161,12 @@
2149 </entry>
2150
2151 <entry>
2152 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2153 + <base>REPOSITORY</base>
2154 <trans>Repository</trans>
2155 </entry>
2156
2157 <entry>
2158 - <base>TRAC_TABLE_HEADER_PATH</base>
2159 + <base>PATH</base>
2160 <trans>Path</trans>
2161 </entry>
2162
2163 @@ -181,7 +181,7 @@
2164 </entry>
2165
2166 <entry>
2167 - <base>TRAC_ACTION_VIEW</base>
2168 + <base>VIEW</base>
2169 <trans>View Trac Project</trans>
2170 </entry>
2171
2172 --- smeserver-trac-0.4/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2173 +++ smeserver-trac-0.4/root/etc/e-smith/locale/en-us/etc/e-smith/web/functions/trac 2008-04-26 16:39:18.000000000 +0200
2174 @@ -129,20 +129,6 @@
2175 </entry>
2176
2177 <entry>
2178 - <base>TRAC_FIELD_PROJECT_DESCRIPTION</base>
2179 - <trans>
2180 - Description
2181 - </trans>
2182 - </entry>
2183 -
2184 - <entry>
2185 - <base>TRAC_FIELD_DOMAIN</base>
2186 - <trans>
2187 - Domain
2188 - </trans>
2189 - </entry>
2190 -
2191 - <entry>
2192 <base>TRAC_FIELD_DOMAIN_DESCRIPTION</base>
2193 <trans>
2194 When you have more than one domain configured on this server, you can
2195 @@ -152,13 +138,6 @@
2196 </entry>
2197
2198 <entry>
2199 - <base>TRAC_FIELD_DOMAINS</base>
2200 - <trans>
2201 - Domains
2202 - </trans>
2203 - </entry>
2204 -
2205 - <entry>
2206 <base>TRAC_FIELD_DOMAINS_DESCRIPTION</base>
2207 <trans>
2208 There are multiple domains configured on this server. You can select
2209 @@ -241,90 +220,29 @@
2210 </entry>
2211
2212 <entry>
2213 - <base>TRAC_TABLE_HEADER_NAME</base>
2214 - <trans>
2215 - Name
2216 - </trans>
2217 - </entry>
2218 -
2219 - <entry>
2220 - <base>TRAC_TABLE_HEADER_DESCRIPTION</base>
2221 - <trans>
2222 - Description
2223 - </trans>
2224 - </entry>
2225 -
2226 - <entry>
2227 - <base>TRAC_TABLE_HEADER_DOMAINS</base>
2228 - <trans>
2229 - Domains
2230 - </trans>
2231 - </entry>
2232 -
2233 - <entry>
2234 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2235 + <base>REPOSITORY</base>
2236 <trans>
2237 Repository
2238 </trans>
2239 </entry>
2240
2241 <entry>
2242 - <base>TRAC_TABLE_HEADER_PATH</base>
2243 + <base>PATH</base>
2244 <trans>
2245 Path
2246 </trans>
2247 </entry>
2248
2249 <entry>
2250 - <base>TRAC_TABLE_HEADER_ACCESS</base>
2251 - <trans>
2252 - Access
2253 - </trans>
2254 - </entry>
2255
2256 <entry>
2257 - <base>TRAC_TABLE_HEADER_ACTION</base>
2258 - <trans>
2259 - Action
2260 - </trans>
2261 - </entry>
2262 -
2263 - <entry>
2264 - <base>TRAC_ACTION_VIEW</base>
2265 + <base>VIEW</base>
2266 <trans>
2267 View Trac Project
2268 </trans>
2269 </entry>
2270
2271 <entry>
2272 - <base>TRAC_ACTION_MODIFY</base>
2273 - <trans>
2274 - Modify
2275 - </trans>
2276 - </entry>
2277 -
2278 - <entry>
2279 - <base>TRAC_ACTION_REMOVE</base>
2280 - <trans>
2281 - Remove
2282 - </trans>
2283 - </entry>
2284 -
2285 - <entry>
2286 - <base>TRAC_ACTION_BACKUP</base>
2287 - <trans>
2288 - Backup
2289 - </trans>
2290 - </entry>
2291 -
2292 - <entry>
2293 - <base>TRAC_ACTION_RESTORE</base>
2294 - <trans>
2295 - Restore
2296 - </trans>
2297 - </entry>
2298 -
2299 - <entry>
2300 <base>ERROR_WHILE_CREATING_TRAC_PROJECT</base>
2301 <trans>
2302 An error occurred while creating the Trac project environment.
2303 @@ -364,13 +282,6 @@
2304 </entry>
2305
2306 <entry>
2307 - <base>DESCRIPTION_ERROR</base>
2308 - <trans>
2309 - Unexpected characters in description.
2310 - </trans>
2311 - </entry>
2312 -
2313 - <entry>
2314 <base>NO_DOMAINS</base>
2315 <trans>
2316 There are no domains selected for the Trac project environment.
2317 @@ -481,15 +392,5 @@
2318 <trans>Local Network Only</trans>
2319 </entry>
2320
2321 - <entry>
2322 - <base>YES</base>
2323 - <trans>Yes</trans>
2324 - </entry>
2325 -
2326 - <entry>
2327 - <base>NO</base>
2328 - <trans>No</trans>
2329 - </entry>
2330 -
2331 </lexicon>
2332
2333 --- smeserver-trac-0.4/root/etc/e-smith/locale/it/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2334 +++ smeserver-trac-0.4/root/etc/e-smith/locale/it/etc/e-smith/web/functions/trac 2008-04-26 16:44:51.000000000 +0200
2335 @@ -161,12 +161,12 @@
2336 </entry>
2337
2338 <entry>
2339 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2340 + <base>REPOSITORY</base>
2341 <trans>Repository</trans>
2342 </entry>
2343
2344 <entry>
2345 - <base>TRAC_TABLE_HEADER_PATH</base>
2346 + <base>PATH</base>
2347 <trans>Path</trans>
2348 </entry>
2349
2350 @@ -181,7 +181,7 @@
2351 </entry>
2352
2353 <entry>
2354 - <base>TRAC_ACTION_VIEW</base>
2355 + <base>VIEW</base>
2356 <trans>View Trac Project</trans>
2357 </entry>
2358
2359 --- smeserver-trac-0.4/root/etc/e-smith/locale/da/etc/e-smith/web/functions/trac.add2general 2008-04-26 16:17:44.000000000 +0200
2360 +++ smeserver-trac-0.4/root/etc/e-smith/locale/da/etc/e-smith/web/functions/trac 2008-04-26 16:40:46.000000000 +0200
2361 @@ -161,12 +161,12 @@
2362 </entry>
2363
2364 <entry>
2365 - <base>TRAC_TABLE_HEADER_REPOSITORY</base>
2366 + <base>REPOSITORY</base>
2367 <trans>Lager(repository)</trans>
2368 </entry>
2369
2370 <entry>
2371 - <base>TRAC_TABLE_HEADER_PATH</base>
2372 + <base>PATH</base>
2373 <trans>Sti</trans>
2374 </entry>
2375
2376 @@ -181,7 +181,7 @@
2377 </entry>
2378
2379 <entry>
2380 - <base>TRAC_ACTION_VIEW</base>
2381 + <base>VIEW</base>
2382 <trans>Vis Trac projekt</trans>
2383 </entry>
2384
2385 --- smeserver-trac-0.4/root/etc/e-smith/web/functions/trac.add2general 2007-04-27 04:42:10.000000000 +0200
2386 +++ smeserver-trac-0.4/root/etc/e-smith/web/functions/trac 2008-04-26 16:30:23.000000000 +0200
2387 @@ -1,235 +1,235 @@
2388 -#!/usr/bin/perl -wT
2389 -# vim: ft=xml:
2390 -# $Id: trac 69 2007-03-25 13:20:24Z marco $
2391 -
2392 -#----------------------------------------------------------------------
2393 -# heading : Collaboration
2394 -# description : TRAC_NAVIGATION_DESCRIPTION
2395 -# navigation : 2650 2650
2396 -#----------------------------------------------------------------------
2397 -
2398 -use strict;
2399 -use warnings;
2400 -use esmith::FormMagick::Panel::trac;
2401 -my $f = esmith::FormMagick::Panel::trac->new();
2402 -$f->display();
2403 -
2404 -=pod
2405 -
2406 -=head1 NAME
2407 -
2408 -Trac project environment -- add/remove/manage trac project environments
2409 -
2410 -=head2 DESCRIPTION
2411 -
2412 -This screen allows the administrator to manage Trac environments for the subversion repositories.
2413 -
2414 -=begin testing
2415 -
2416 -use esmith::FormMagick::Tester;
2417 -use esmith::TestUtils;
2418 -use esmith::TestUtils;
2419 -use esmith::ConfigDB;
2420 -use esmith::AccountsDB;
2421 -my $panel = $Original_File;
2422 -my $ua = esmith::FormMagick::Tester->new();
2423 -
2424 -my $c = esmith::ConfigDB->open();
2425 -my $a = esmith::AccountsDB->open();
2426 -
2427 -is (mode($panel), '4750', "Check permissions on script");
2428 -ok ($ua->get_panel($panel), "ABOUT TO RUN L10N TESTS");
2429 -is ($ua->{status}, 200, "200 OK");
2430 -like($ua->{content}, qr/FORM_TITLE/, "Saw untranslated form title");
2431 -ok ($ua->set_language("en"), "Set language to English");
2432 -ok ($ua->get_panel($panel), "Get panel");
2433 -is ($ua->{status}, 200, "200 OK");
2434 -
2435 -ok ($ua->get_panel($panel), "ABOUT TO TEST CREATING TRAC ENVIRONMENT");
2436 -ok ($ua->follow("Click here"), "Follow 'create repository' link");
2437 -is ($ua->{status}, 200, "200 OK");
2438 -like($ua->{content}, qr/Create a new Trac environment/, "Saw page title");
2439 -like($ua->{content}, qr/Brief description/, "Saw description field");
2440 -like($ua->{content}, qr/Add/, "Saw add button");
2441 -
2442 -SKIP: {
2443 -
2444 - skip 10, "Unsafe!" unless destruction_ok();
2445 -
2446 - ok ($ua->follow("Click here"), "ACTUALLY ADDING A TRAC ENVIRONMENT");
2447 - $ua->field();
2448 - $ua->click("Add");
2449 - like($ua->{content}, qr/Successfully added Trac environment/, "Saw success message");
2450 -
2451 - ok ($ua->follow("Remove"), "REMOVING TRAC ENVIRONMENT");
2452 - like($ua->{content}, qr/Are you sure/, "Saw confirmation message");
2453 - $ua->click("Remove");
2454 - like($ua->{content}, qr/Successfully deleted/, "Saw success message");
2455 -}
2456 -
2457 -=end testing
2458 -
2459 -=cut
2460 -
2461 -__DATA__
2462 -<form
2463 - title="TRAC_FORM_TITLE"
2464 - header="/etc/e-smith/web/common/head.tmpl"
2465 - footer="/etc/e-smith/web/common/foot.tmpl">
2466 -
2467 - <!-- page 0 -->
2468 - <page
2469 - name="First"
2470 - pre-event="print_status_message()">
2471 -
2472 - <description>TRAC_FORM_DESCRIPTION</description>
2473 -
2474 - <subroutine src="show_trac_projects()" />
2475 - </page>
2476 -
2477 - <!-- page 1 -->
2478 - <page
2479 - name="Create"
2480 - pre-event="turn_off_buttons()"
2481 - post-event="handle_trac_projects()">
2482 -
2483 - <title>TRAC_FORM_ADD_TITLE</title>
2484 -
2485 - <description>TRAC_FORM_ADD_DESCRIPTION</description>
2486 -
2487 - <subroutine src="print_trac_field_name()" />
2488 -
2489 - <field
2490 - type="text"
2491 - id="tracDescription"
2492 - validation="validate_description">
2493 - <label>TRAC_FIELD_PROJECT_DESCRIPTION</label>
2494 - </field>
2495 -
2496 - <field
2497 - type="select"
2498 - id="tracRepository"
2499 - options="repositories_list()">
2500 - <description>TRAC_FIELD_REPOSITORY_NAME_DESCRIPTION</description>
2501 - <label>TRAC_FIELD_REPOSITORY_NAME</label>
2502 - </field>
2503 -
2504 - <field
2505 - type="text"
2506 - id="tracRepositoryPath">
2507 - <description>TRAC_FIELD_REPOSITORY_PATH_DESCRIPTION</description>
2508 - <label>TRAC_FIELD_REPOSITORY_PATH</label>
2509 - </field>
2510 -
2511 - <subroutine src="print_trac_domains()" />
2512 -
2513 - <field
2514 - type="select"
2515 - id="tracAccess"
2516 - options="'local' => 'LOCAL',
2517 - 'global' => 'GLOBAL'"
2518 - value='local'>
2519 - <description>TRAC_FIELD_ACCESS_TYPE_DESCRIPTION</description>
2520 - <label>TRAC_FIELD_ACCESS_TYPE</label>
2521 - </field>
2522 -
2523 - <field
2524 - type="select"
2525 - id="tracGroups"
2526 - options="group_list()"
2527 - multiple="1" size="5">
2528 - <description>TRAC_FIELD_GROUPS_DESCRIPTION</description>
2529 - <label>TRAC_FIELD_GROUPS</label>
2530 - </field>
2531 -
2532 - <field
2533 - type="select"
2534 - id="tracUsers"
2535 - options="user_list()"
2536 - multiple="1" size="5">
2537 - <label>TRAC_FIELD_USERS</label>
2538 - </field>
2539 -
2540 - <subroutine src="print_save_or_add_button()" />
2541 - </page>
2542 -
2543 - <!-- page 2 -->
2544 - <page
2545 - name="Modify"
2546 - pre-event="turn_off_buttons()"
2547 - post-event="handle_trac_projects()">
2548 -
2549 - <title>TRAC_FORM_MODIFY_TITLE</title>
2550 - <description>TRAC_FORM_MODIFY_DESCRIPTION</description>
2551 -
2552 - <subroutine src="print_trac_field_name()" />
2553 -
2554 - <field
2555 - type="text"
2556 - id="tracDescription"
2557 - validation="validate_description">
2558 - <label>TRAC_FIELD_PROJECT_DESCRIPTION</label>
2559 - </field>
2560 -
2561 -
2562 - <field
2563 - type="select"
2564 - id="tracRepository"
2565 - options="repositories_list()">
2566 - <description>TRAC_FIELD_REPOSITORY_NAME_DESCRIPTION</description>
2567 - <label>TRAC_FIELD_REPOSITORY_NAME</label>
2568 - </field>
2569 -
2570 - <field
2571 - type="text"
2572 - id="tracRepositoryPath">
2573 - <description>TRAC_FIELD_REPOSITORY_PATH_DESCRIPTION</description>
2574 - <label>TRAC_FIELD_REPOSITORY_PATH</label>
2575 - </field>
2576 -
2577 - <subroutine src="print_trac_domains()" />
2578 -
2579 - <field
2580 - type="select"
2581 - id="tracAccess"
2582 - options="'local' => 'LOCAL',
2583 - 'global' => 'GLOBAL'">
2584 - <description>TRAC_FIELD_ACCESS_TYPE_DESCRIPTION</description>
2585 - <label>TRAC_FIELD_ACCESS_TYPE</label>
2586 - </field>
2587 -
2588 - <field
2589 - type="select"
2590 - id="tracGroups"
2591 - options="group_list()"
2592 - multiple="1" size="5">
2593 - <description>TRAC_FIELD_GROUPS_DESCRIPTION</description>
2594 - <label>TRAC_FIELD_GROUPS</label>
2595 - </field>
2596 -
2597 - <field
2598 - type="select"
2599 - id="tracUsers"
2600 - options="user_list()"
2601 - multiple="1" size="5">
2602 - <label>TRAC_FIELD_USERS</label>
2603 - </field>
2604 -
2605 - <subroutine src="print_save_or_add_button()" />
2606 -
2607 - </page>
2608 -
2609 - <!-- page 3 -->
2610 - <page
2611 - name="Remove"
2612 - pre-event="turn_off_buttons()"
2613 - post-event="remove_trac_project()">
2614 -
2615 - <title>TRAC_FORM_REMOVE_TITLE</title>
2616 - <description>TRAC_FORM_REMOVE_DESCRIPTION</description>
2617 -
2618 - <subroutine src="print_button('REMOVE')" />
2619 -
2620 - </page>
2621 -
2622 -</form>
2623 +#!/usr/bin/perl -wT
2624 +# vim: ft=xml:
2625 +# $Id: trac 69 2007-03-25 13:20:24Z marco $
2626 +
2627 +#----------------------------------------------------------------------
2628 +# heading : Collaboration
2629 +# description : TRAC_NAVIGATION_DESCRIPTION
2630 +# navigation : 2650 2650
2631 +#----------------------------------------------------------------------
2632 +
2633 +use strict;
2634 +use warnings;
2635 +use esmith::FormMagick::Panel::trac;
2636 +my $f = esmith::FormMagick::Panel::trac->new();
2637 +$f->display();
2638 +
2639 +=pod
2640 +
2641 +=head1 NAME
2642 +
2643 +Trac project environment -- add/remove/manage trac project environments
2644 +
2645 +=head2 DESCRIPTION
2646 +
2647 +This screen allows the administrator to manage Trac environments for the subversion repositories.
2648 +
2649 +=begin testing
2650 +
2651 +use esmith::FormMagick::Tester;
2652 +use esmith::TestUtils;
2653 +use esmith::TestUtils;
2654 +use esmith::ConfigDB;
2655 +use esmith::AccountsDB;
2656 +my $panel = $Original_File;
2657 +my $ua = esmith::FormMagick::Tester->new();
2658 +
2659 +my $c = esmith::ConfigDB->open();
2660 +my $a = esmith::AccountsDB->open();
2661 +
2662 +is (mode($panel), '4750', "Check permissions on script");
2663 +ok ($ua->get_panel($panel), "ABOUT TO RUN L10N TESTS");
2664 +is ($ua->{status}, 200, "200 OK");
2665 +like($ua->{content}, qr/FORM_TITLE/, "Saw untranslated form title");
2666 +ok ($ua->set_language("en"), "Set language to English");
2667 +ok ($ua->get_panel($panel), "Get panel");
2668 +is ($ua->{status}, 200, "200 OK");
2669 +
2670 +ok ($ua->get_panel($panel), "ABOUT TO TEST CREATING TRAC ENVIRONMENT");
2671 +ok ($ua->follow("Click here"), "Follow 'create repository' link");
2672 +is ($ua->{status}, 200, "200 OK");
2673 +like($ua->{content}, qr/Create a new Trac environment/, "Saw page title");
2674 +like($ua->{content}, qr/Brief description/, "Saw description field");
2675 +like($ua->{content}, qr/Add/, "Saw add button");
2676 +
2677 +SKIP: {
2678 +
2679 + skip 10, "Unsafe!" unless destruction_ok();
2680 +
2681 + ok ($ua->follow("Click here"), "ACTUALLY ADDING A TRAC ENVIRONMENT");
2682 + $ua->field();
2683 + $ua->click("Add");
2684 + like($ua->{content}, qr/Successfully added Trac environment/, "Saw success message");
2685 +
2686 + ok ($ua->follow("Remove"), "REMOVING TRAC ENVIRONMENT");
2687 + like($ua->{content}, qr/Are you sure/, "Saw confirmation message");
2688 + $ua->click("Remove");
2689 + like($ua->{content}, qr/Successfully deleted/, "Saw success message");
2690 +}
2691 +
2692 +=end testing
2693 +
2694 +=cut
2695 +
2696 +__DATA__
2697 +<form
2698 + title="TRAC_FORM_TITLE"
2699 + header="/etc/e-smith/web/common/head.tmpl"
2700 + footer="/etc/e-smith/web/common/foot.tmpl">
2701 +
2702 + <!-- page 0 -->
2703 + <page
2704 + name="First"
2705 + pre-event="print_status_message()">
2706 +
2707 + <description>TRAC_FORM_DESCRIPTION</description>
2708 +
2709 + <subroutine src="show_trac_projects()" />
2710 + </page>
2711 +
2712 + <!-- page 1 -->
2713 + <page
2714 + name="Create"
2715 + pre-event="turn_off_buttons()"
2716 + post-event="handle_trac_projects()">
2717 +
2718 + <title>TRAC_FORM_ADD_TITLE</title>
2719 +
2720 + <description>TRAC_FORM_ADD_DESCRIPTION</description>
2721 +
2722 + <subroutine src="print_trac_field_name()" />
2723 +
2724 + <field
2725 + type="text"
2726 + id="tracDescription"
2727 + validation="validate_description">
2728 + <label>DESCRIPTION</label>
2729 + </field>
2730 +
2731 + <field
2732 + type="select"
2733 + id="tracRepository"
2734 + options="repositories_list()">
2735 + <description>TRAC_FIELD_REPOSITORY_NAME_DESCRIPTION</description>
2736 + <label>TRAC_FIELD_REPOSITORY_NAME</label>
2737 + </field>
2738 +
2739 + <field
2740 + type="text"
2741 + id="tracRepositoryPath">
2742 + <description>TRAC_FIELD_REPOSITORY_PATH_DESCRIPTION</description>
2743 + <label>TRAC_FIELD_REPOSITORY_PATH</label>
2744 + </field>
2745 +
2746 + <subroutine src="print_trac_domains()" />
2747 +
2748 + <field
2749 + type="select"
2750 + id="tracAccess"
2751 + options="'local' => 'LOCAL',
2752 + 'global' => 'GLOBAL'"
2753 + value='local'>
2754 + <description>TRAC_FIELD_ACCESS_TYPE_DESCRIPTION</description>
2755 + <label>TRAC_FIELD_ACCESS_TYPE</label>
2756 + </field>
2757 +
2758 + <field
2759 + type="select"
2760 + id="tracGroups"
2761 + options="group_list()"
2762 + multiple="1" size="5">
2763 + <description>TRAC_FIELD_GROUPS_DESCRIPTION</description>
2764 + <label>TRAC_FIELD_GROUPS</label>
2765 + </field>
2766 +
2767 + <field
2768 + type="select"
2769 + id="tracUsers"
2770 + options="user_list()"
2771 + multiple="1" size="5">
2772 + <label>TRAC_FIELD_USERS</label>
2773 + </field>
2774 +
2775 + <subroutine src="print_save_or_add_button()" />
2776 + </page>
2777 +
2778 + <!-- page 2 -->
2779 + <page
2780 + name="Modify"
2781 + pre-event="turn_off_buttons()"
2782 + post-event="handle_trac_projects()">
2783 +
2784 + <title>TRAC_FORM_MODIFY_TITLE</title>
2785 + <description>TRAC_FORM_MODIFY_DESCRIPTION</description>
2786 +
2787 + <subroutine src="print_trac_field_name()" />
2788 +
2789 + <field
2790 + type="text"
2791 + id="tracDescription"
2792 + validation="validate_description">
2793 + <label>DESCRIPTION</label>
2794 + </field>
2795 +
2796 +
2797 + <field
2798 + type="select"
2799 + id="tracRepository"
2800 + options="repositories_list()">
2801 + <description>TRAC_FIELD_REPOSITORY_NAME_DESCRIPTION</description>
2802 + <label>TRAC_FIELD_REPOSITORY_NAME</label>
2803 + </field>
2804 +
2805 + <field
2806 + type="text"
2807 + id="tracRepositoryPath">
2808 + <description>TRAC_FIELD_REPOSITORY_PATH_DESCRIPTION</description>
2809 + <label>TRAC_FIELD_REPOSITORY_PATH</label>
2810 + </field>
2811 +
2812 + <subroutine src="print_trac_domains()" />
2813 +
2814 + <field
2815 + type="select"
2816 + id="tracAccess"
2817 + options="'local' => 'LOCAL',
2818 + 'global' => 'GLOBAL'">
2819 + <description>TRAC_FIELD_ACCESS_TYPE_DESCRIPTION</description>
2820 + <label>TRAC_FIELD_ACCESS_TYPE</label>
2821 + </field>
2822 +
2823 + <field
2824 + type="select"
2825 + id="tracGroups"
2826 + options="group_list()"
2827 + multiple="1" size="5">
2828 + <description>TRAC_FIELD_GROUPS_DESCRIPTION</description>
2829 + <label>TRAC_FIELD_GROUPS</label>
2830 + </field>
2831 +
2832 + <field
2833 + type="select"
2834 + id="tracUsers"
2835 + options="user_list()"
2836 + multiple="1" size="5">
2837 + <label>TRAC_FIELD_USERS</label>
2838 + </field>
2839 +
2840 + <subroutine src="print_save_or_add_button()" />
2841 +
2842 + </page>
2843 +
2844 + <!-- page 3 -->
2845 + <page
2846 + name="Remove"
2847 + pre-event="turn_off_buttons()"
2848 + post-event="remove_trac_project()">
2849 +
2850 + <title>TRAC_FORM_REMOVE_TITLE</title>
2851 + <description>TRAC_FORM_REMOVE_DESCRIPTION</description>
2852 +
2853 + <subroutine src="print_button('REMOVE')" />
2854 +
2855 + </page>
2856 +
2857 +</form>

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed