add support for $base/../templates/
[ikiwiki/events.git] / newevent.pm
index 2d60517..ec34b72 100644 (file)
@@ -29,7 +29,7 @@ sub getsetup () {
                 , rebuild => undef
                 , section => "misc"
                 }
-        , newevent_base =>
+        , base =>
                 { type        => "string"
                 , example     => "Agenda"
                 , description => "prefix of the agenda hierarchy"
@@ -38,6 +38,12 @@ sub getsetup () {
                 }
         );
  }
+sub tmpl ($$) {
+       my ($base, $model) = @_;
+       my $page = IkiWiki::dirname($base).'/'.'templates/'.$model;
+       my $file = defined srcfile($page, 1) ? '/'.$page : $model;
+       return template($file);
+ }
 sub date_of_form ($$;%) {
        my ($form, $prefix, %default) = @_;
        %default =
@@ -79,7 +85,7 @@ sub duration_of_form ($$) {
        return $dur;
  };
 sub page_of_event ($$$$$) {
-       my ($form, $from_date, $to_date, $name, $newevent_base) = @_;
+       my ($form, $from_date, $to_date, $name, $base) = @_;
        my $time = '';
        if ($form->field('from_hour') ne '' or $form->field('from_minute') ne '') {
                if ($from_date->hour() == $to_date->hour()
@@ -93,8 +99,8 @@ sub page_of_event ($$$$$) {
                 }
         }
        return
-        ( $newevent_base
-        . ($newevent_base?'/':'').$from_date->year()
+        ( $base
+        . ($base?'/':'').$from_date->year()
         . '/'.sprintf('%02d', $from_date->month())
         . '/'.sprintf('%02d', $from_date->day())
         . '/'. ($time ne '' ? $time . '/' : '')
@@ -156,7 +162,7 @@ sub post_newevent ($$$) {
  }
 sub preprocess (@) {
        #my %params =
-       # ( base => ($config{newevent_base} ? $config{newevent_base} : gettext('Agenda'))
+       # ( base => ($config{base} ? $config{base} : gettext('Agenda'))
        # , @_ );
        #($form, $buttons) = newevent_form()
        #       if not defined $form;
@@ -167,6 +173,9 @@ sub sessioncgi ($$) {
        my ($cgi, $session) = @_;
        if (defined $cgi->param('do') && $cgi->param('do') eq "newevent") {
                # TOTRY: decode_cgi_utf8($cgi);
+               my $base = Encode::decode_utf8(URI::Escape::uri_unescape(IkiWiki::possibly_foolish_untaint($cgi->param('base'))));
+               &IkiWiki::check_canedit($base, $cgi, $session);
+               my $page = Encode::decode_utf8(URI::Escape::uri_unescape(IkiWiki::possibly_foolish_untaint($cgi->param('page'))));
                
                my $now_date = DateTime->now
                 ( time_zone => 'local'
@@ -196,7 +205,6 @@ sub sessioncgi ($$) {
                 : 1;
                my @dow_order = ($week_start_day .. 6, 0 .. $week_start_day-1);
                
-               my $page = Encode::decode_utf8($cgi->param("page"));
                my $tags = $typedlinks{$page}{tag};
                my $buttons = [qw{Preview Create}];
                my ($from_date, $to_date, $end_date, $inc_dur);
@@ -204,7 +212,7 @@ sub sessioncgi ($$) {
                 ( action => IkiWiki::cgiurl()
                 , charset => "utf-8"
                 , fields => [qw{
-                        do
+                        do base
                         from_date from_year from_month from_day from_hour from_minute
                         to_date to_year to_month to_day to_hour to_minute
                         inc_dur inc_year inc_month inc_week inc_day inc_hour inc_minute
@@ -225,7 +233,7 @@ sub sessioncgi ($$) {
                 , name       => "newevent"
                 , stylesheet => 1
                 , params     => $cgi
-                , required   => [qw{do year month day name from_date to_date end_date inc_dur}]
+                , required   => [qw{do base year month day name from_date to_date end_date inc_dur}]
                 , submit     => [qw{Preview Create}]
                 , title      => gettext("newevent")
                 , template   => { template("newevent.tmpl") }
@@ -276,6 +284,7 @@ sub sessioncgi ($$) {
                                         }
                                 } }
                         , name => '/^.+$/'
+                        , base => '/^.*$/'
                         , end_times  => sub { $_[0] =~ m/^\d+$/ and $_[0] >= 0 }
                         , inc_year   => sub { $_[0] =~ m/^\d+$/ and $_[0] >= 0 }
                         , inc_month  => sub { $_[0] =~ m/^\d+$/ and $_[0] >= 0 }
@@ -291,8 +300,10 @@ sub sessioncgi ($$) {
                                 }
                         }
                 );
+               $base = $form->field('base') ? $form->field('base') : $base;
                $form->title(sprintf(gettext("creating new events"), pagetitle(IkiWiki::basename($page))));
                $form->field(name => "do", type => "hidden", value => 'newevent', force => 1);
+               $form->field(name => "base", type => "hidden", force => 1 , value => $base);
                $form->field(name => "from_date", type => "hidden", value => '1', force => 1);
                $form->field(name => "to_date", type => "hidden", value => '1', force => 1);
                $form->field(name => "end_date", type => "hidden", value => '1', force => 1);
@@ -329,7 +340,7 @@ sub sessioncgi ($$) {
                $form->field(name => "inc_day", type => 'text', value => '0', size => 2);
                $form->field(name => "inc_hour", type => 'text', value => '0', size => 2);
                $form->field(name => "inc_minute", type => 'text', value => '0', size => 2);
-               my $tmpl_neweventcontent = template("neweventcontent.tmpl");
+               my $tmpl_neweventcontent = tmpl($base, 'neweventcontent.tmpl');
                $tmpl_neweventcontent->param(title => gettext('Title of the event'));
                $tmpl_neweventcontent->param(tags => [map {{name => $_}} (sort keys %$tags)]);
                $form->field(name => "content", type => "textarea", size => 30, rows => 20, cols => 80
@@ -345,11 +356,10 @@ sub sessioncgi ($$) {
                
                if (($form->submitted eq 'Create' || $form->submitted eq 'Preview') && $form->validate) {
                        #IkiWiki::checksessionexpiry($cgi, $session, $cgi->param('sid'));
-                       my $newevent_base = $cgi->param('base');
-                       $newevent_base = $config{newevent_base}
-                               unless defined $newevent_base;
-                       $newevent_base = gettext('Agenda')
-                               unless defined $newevent_base;
+                       $base
+                        = $form->field('base')
+                        ? $form->field('base')
+                        : (defined $config{base} ? $config{base} : gettext('Agenda'));
                        my $end_times
                         = $form->field('end_times') == 0
                         ? undef : $form->field('end_times');
@@ -376,7 +386,7 @@ sub sessioncgi ($$) {
                        while (++$events_try <= $events_max
                         and (not defined $end_times or --$end_times >= 0)
                         and (not defined $end_date or DateTime->compare($from_date, $end_date) <= 0)) {
-                               my $dest = page_of_event($form, $from_date, $to_date, $name, $newevent_base);
+                               my $dest = page_of_event($form, $from_date, $to_date, $name, $base);
                                my $week = $from_date->weekday_of_month();
                                my $day = $now_date->{locale}->day_format_wide->[$from_date->day_of_week()-1];
                                if (not defined $dom or exists $dom->{"$week° $day"}) {
@@ -394,7 +404,7 @@ sub sessioncgi ($$) {
                         }
                        error("events try per commit overflow: $events_max")
                                unless $events_try <= $events_max;
-                       my $tmpl_neweventpage = template("neweventpage.tmpl");
+                       my $tmpl_neweventpage = tmpl($base, 'neweventpage.tmpl');
                        my $i = 0;
                        foreach (@events) {
                                $tmpl_neweventpage->clear_params();
@@ -424,7 +434,7 @@ sub sessioncgi ($$) {
                                        IkiWiki::disable_commit_hook()
                                 }
                                foreach my $event (@events) {
-                                       create($event, $cgi, $session, \%months, $newevent_base);
+                                       create($event, $cgi, $session, \%months, $base);
                                 }
                                if ($config{rcs}) {
                                        IkiWiki::rcs_commit_staged
@@ -531,7 +541,7 @@ sub preview($$$$) {
         }
  }
 sub create ($$$$$) {
-       my ($event, $cgi, $session, $months, $newevent_base) = @_;
+       my ($event, $cgi, $session, $months, $base) = @_;
        check_cannewevent
         ( $event->{page}
         , $event->{file}
@@ -547,15 +557,16 @@ sub create ($$$$$) {
         }
        # month page
                my $monthpage =
-                ( $newevent_base
-                . ($newevent_base?'/':'').$event->{from}->year()
+                ( $base
+                . ($base?'/':'').$event->{from}->year()
                 . '/'.sprintf('%02d', $event->{from}->month())
                 );
                my $monthfile = IkiWiki::newpagefile($monthpage, $pageext);
                if (not exists $pagesources{$monthpage}
                 and not -l $config{srcdir}.'/'.$monthfile
                 and not -e _) {
-                       my $tmpl_neweventmonth = template("neweventmonth.tmpl");
+                       my $tmpl_neweventmonth = tmpl($base, 'neweventmonth.tmpl');
+                       $tmpl_neweventmonth->param(base      => $base);
                        $tmpl_neweventmonth->param(year      => $event->{from}->year());
                        $tmpl_neweventmonth->param(month     => sprintf('%02d', $event->{from}->month()));
                        $tmpl_neweventmonth->param(monthname => $months->{$event->{from}->month()});
@@ -574,7 +585,8 @@ sub create ($$$$$) {
                if (not exists $pagesources{$daypage}
                 and not -l $config{srcdir}.'/'.$dayfile
                 and not -e _) {
-                       my $tmpl_neweventday = template("neweventday.tmpl");
+                       my $tmpl_neweventday = tmpl($base, 'neweventday.tmpl');
+                       $tmpl_neweventday->param(base      => $base);
                        $tmpl_neweventday->param(year      => $event->{from}->year());
                        $tmpl_neweventday->param(month     => sprintf('%02d', $event->{from}->month()));
                        $tmpl_neweventday->param(monthname => $months->{$event->{from}->month()});