/[MITgcm]/mitgcm.org/devel/buildweb/pkg/swish-e/example/modules/DateRanges.pm
ViewVC logotype

Annotation of /mitgcm.org/devel/buildweb/pkg/swish-e/example/modules/DateRanges.pm

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


Revision 1.1.1.1 - (hide annotations) (download) (vendor branch)
Fri Sep 20 19:47:30 2002 UTC (22 years, 10 months ago) by adcroft
Branch: Import, MAIN
CVS Tags: baseline, HEAD
Changes since 1.1: +0 -0 lines
Importing web-site building process.

1 adcroft 1.1 # $Id: DateRanges.pm,v 1.2 2002/01/28 13:00:02 whmoseley Exp $
2    
3     package DateRanges;
4     use strict;
5    
6     =head1 NAME
7    
8     DateRanges
9    
10     =head1 SYNOPSIS
11    
12     use DateRanges;
13     use CGI;
14     my $cgi = CGI->new();
15     ...
16    
17     my %hash = (
18     date_ranges => {
19    
20     # Define what buttons to include
21     time_periods => [
22     'All',
23     'Today',
24     'Yesterday',
25     #'Yesterday onward',
26     'This Week',
27     'Last Week',
28     'Last 90 Days',
29     'This Month',
30     'Last Month',
31     #'Past',
32     #'Future',
33     #'Next 30 Days',
34     ],
35    
36     # Default button
37     default => 'All',
38    
39     # Should buttons be in a row or a column?
40     line_break => 0,
41    
42     # Should a date input form be shown, too?
43     date_range => 1,
44     },
45     );
46    
47    
48    
49    
50     =head1 DESCRIPTION
51    
52     This module provides I<basic> support for entering and using date ranges. It
53     was written to use with swish-e (http://swish-e.org).
54    
55     See swish.cgi in the swish-e distribution for an example.
56    
57     Sorry about the interface -- if anyone really wants to use this please let me know and I'll
58     rewrite as OO interface!
59    
60     =head1 FUNCTIONS
61    
62     =cut
63    
64     require Exporter;
65    
66     use vars qw/$VERSION @ISA @EXPORT/;
67    
68    
69     @ISA = qw(Exporter);
70     $VERSION = '0.01';
71    
72     @EXPORT = qw (
73     DateRangeForm
74     DateRangeParse
75     GetDateRangeArgs
76     );
77    
78     # what to pick from
79     my @TIME_PERIODS = (
80     'Today',
81     'Yesterday',
82     'Yesterday onward',
83     'This Week',
84     'Last Week',
85     'Last 90 Days',
86     'This Month',
87     'Last Month',
88     'Past',
89     'Future',
90     'Next 30 Days',
91     'All'
92     );
93    
94     my %TIME_PERIODS = map { $_, 1} @TIME_PERIODS;
95    
96    
97     use Date::Calc qw /
98     Day_of_Week_to_Text
99     Day_of_Week
100     Date_to_Text
101     Monday_of_Week
102     Week_of_Year
103     Today
104     Add_Delta_Days
105     Days_in_Month
106     check_date
107     /;
108    
109     use Time::Local;
110    
111    
112     =item DateRangeForm( $cgi, $params, $fields );
113    
114     This function simple creates a simple form for selecting date ranges based
115     on the fields passed in C<$params>. Will call C<die()> on errors.
116    
117     C<$params> must be a hash reference with a key named C<time_periods> as shown in
118     B<SYNOPSIS> above. This is used to select which time periods to display.
119    
120     C<$fields> is a reference to a hash where C<DateRanges> returns data.
121    
122     These store the HTML for display on your form.
123    
124     buttons - the buttons to select the different time ranges
125     date_range_button - the button to select a date range
126     date_range_low - the low range select form fields
127     date_range_hi - the hight range select form fields
128    
129     =cut
130    
131     sub DateRangeForm {
132     my ( $CGI, $params, $fields ) = @_;
133    
134     die "Must supply arrary ref for 'options'"
135     unless $params->{time_periods} && ref $params->{time_periods} eq 'ARRAY';
136    
137     my @time_periods = grep { $TIME_PERIODS{$_} } @{ $params->{time_periods} };
138    
139    
140     $fields->{buttons} = '';
141     $fields->{date_range_button} = '';
142     $fields->{date_range_low} = '';
143     $fields->{date_range_high} = '';
144    
145     $fields->{buttons} =
146     $CGI->radio_group(
147     -name => 'DateRanges_date_option',
148     -values => \@time_periods,
149     -default => ($params->{default} || $time_periods[0]),
150     -linebreak => (exists $params->{line_break} ? $params->{line_break} : 1),
151     #-columns=>2,
152     ) if @time_periods;
153    
154    
155     return unless $params->{date_range};
156    
157     $fields->{date_range_button} =
158     $CGI->radio_group(
159     -name => 'DateRanges_date_option',
160     -values => ['Select Date Range'],
161     -default => ($params->{default} || $time_periods[0]),
162     -linebreak => (exists $params->{line_break} ? $params->{line_break} : 1),
163     );
164    
165    
166    
167     $fields->{date_range_low} = show_date_input($CGI, 'start');
168     $fields->{date_range_high} = show_date_input($CGI, 'end');
169    
170     =pod
171     print '<br>Limit to the hour of: ',
172     popup_menu( -name => 'Limit_hour',
173     -default => ' ',
174     -values => [' ',0..23], ),
175     '<br>';
176     =cut
177    
178     }
179    
180     =item my $args = GetDateRangeArgs( $cgi );
181    
182     Returns a string to use in a HREF with all the parameters set.
183    
184     =cut
185    
186     sub GetDateRangeArgs {
187     my $CGI = shift;
188    
189     my %args;
190    
191    
192     $args{DateRanges_date_option} = $CGI->param('DateRanges_date_option')
193     if defined $CGI->param('DateRanges_date_option');
194    
195    
196     for ( qw/ mon day year / ) {
197     my $start = "DateRanges_start_$_";
198     my $end = "DateRanges_end_$_";
199     $args{$start} = $CGI->param($start) if defined $CGI->param($start);
200     $args{$end} = $CGI->param($end) if defined $CGI->param($end);
201     }
202    
203     return '' unless %args;
204    
205     return join '&amp;', map { "$_=" . $CGI->escape($args{$_}) } keys %args;
206    
207     }
208    
209     =item DateRangeParse( $cgi, $form )
210    
211     Parses the date range form and returns a low and high range unix timestamp.
212     Returns false on error with the folowing key set in C<$form>:
213    
214     DateRanges_error - error string explaining the problem
215    
216     C<$form> is a hash reference where the following keys may be set:
217    
218     All - no date ranges were selected
219     DateRanges_time_low - low range unix timestamp
220     DateRanges_time_high - high range unix timestamp
221    
222     =cut
223    
224    
225    
226    
227     #------------------------ Get the report dates ---------------------
228     sub DateRangeParse {
229     my ( $q, $form ) = @_;
230    
231     $form->{DateRanges_error} = '';
232    
233    
234    
235     # If requesting ALL (or not found in form) return true for all
236     if ( !$q->param('DateRanges_date_option') || $q->param('DateRanges_date_option') eq 'All' ) {
237     $form->{All}++;
238     return 1;
239     }
240    
241     my $time = time();
242    
243     my ( @start, @end );
244    
245     for ($q->param('DateRanges_date_option') ) {
246    
247     /^Today/ && do { @start = @end = Today(); last; };
248    
249     /^Yesterday onward/ && do { @start = Add_Delta_Days( Today(), -1 ); last };
250    
251     /^Yesterday/ && do { @start = @end = Add_Delta_Days( Today(), -1 ); last };
252    
253    
254     /^This Week/ && do {
255     @start = Monday_of_Week( Week_of_Year( Today() ) );
256     @end = Add_Delta_Days( @start, 6 );
257     last;
258     };
259    
260     /^Last Week/ && do {
261     @start = Monday_of_Week( Week_of_Year( Add_Delta_Days( Today(), -7 ) ) );
262     @end = Add_Delta_Days( @start, 6 );
263     last;
264     };
265    
266     /^This Month/ && do {
267     @start = @end = Today();
268     $start[2] = 1;
269     $end[2] = Days_in_Month($end[0],$end[1]);
270     last;
271     };
272    
273     /^Last Month/ && do {
274     @start = Today();
275     $start[2] = 1;
276     --$start[1];
277     if ( $start[1] == 0 ) {
278     $start[1] = 12;
279     $start[0]--;
280     }
281     @end = @start;
282     $end[2] = Days_in_Month($end[0],$end[1]);
283     last;
284     };
285    
286     /^Last 90 Days/ && do {
287     @end = Today();
288     @start = Add_Delta_Days( Today(), -90 );
289     last
290     };
291    
292     /^Past/ && return 1; # use defaults;
293    
294     /^Future/ && do {
295     $form->{DateRanges_time_low} = time;
296     delete $form->{DateRanges_time_high};
297     return 1;
298     };
299    
300     /^Next 30 Days/ && do {
301     @start = Today();
302     @end = Add_Delta_Days( Today(), +30 );
303     last
304     };
305    
306    
307    
308     /^Select/ && do {
309     my ( $day, $mon, $year );
310    
311     $day = $q->param('DateRanges_start_day') || 0;
312     $mon = $q->param('DateRanges_start_mon') || 0;
313     $year = $q->param('DateRanges_start_year') || 0;
314     @start = ( $year, $mon, $day );
315    
316     $day = $q->param('DateRanges_end_day') || 0;
317     $mon = $q->param('DateRanges_end_mon') || 0;
318     $year = $q->param('DateRanges_end_year') || 0;
319     @end = ( $year, $mon, $day );
320     last;
321     };
322    
323     $form->{DateRanges_error} = 'Invalid Date Option ' . $q->param('DateRanges_date_option') . ' Selected';
324     return;
325     }
326    
327    
328    
329     $form->{DateRanges_error} = 'Invalid Start Date' && return if @start && !check_date( @start );
330     $form->{DateRanges_error} = 'Invalid Ending Date' && return if @end && !check_date( @end );
331    
332    
333     my $start_time = @start ? timelocal( 0, 0, 0, $start[2], $start[1]-1, $start[0]-1900 ) : 0;
334     my $end_time = @end ? timelocal( 59, 59, 23, $end[2], $end[1]-1, $end[0]-1900 ) : 0;
335    
336    
337     $form->{DateRanges_error} = "Starting time should be before now, don't you think?" && return
338     if $start_time && $start_time > time();
339    
340     $form->{DateRanges_error} = 'Start date must be same day or before end date' && return
341     if $start_time && $end_time && $start_time > $end_time;
342    
343    
344     $form->{DateRanges_time_low} = $start_time;
345     $form->{DateRanges_time_high} = $end_time;
346     return 1;
347     }
348    
349    
350     #----------------------------------------------------------------------------
351     sub show_date_input {
352     my ( $CGI, $name ) = @_;
353    
354     $name = "DateRanges_$name";
355    
356     my @months = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
357     my $x = 1;
358     my %months = map { $x++, $_ } @months;
359    
360     my ($mon, $day, $year) = (localtime)[4,3,5];
361    
362     $year = $year + 1900;
363     $mon++;
364    
365     my $cur_year = $year;
366    
367     $cur_year += 5;
368    
369     ($year,$mon,$day) = Date::Calc::Add_Delta_Days($year,$mon,$day, -28 ) if $name eq 'start';
370    
371    
372     my $str = join "\n",
373     $CGI->popup_menu(
374     -name => "${name}_mon",
375     -values => [1..12],
376     -default => $mon,
377     -labels => \%months
378     ),
379     '&nbsp',
380     $CGI->popup_menu(
381     -name => "${name}_day",
382     -default => $day,
383     -values => [1..31],
384     ),
385    
386     '&nbsp',
387     $CGI->popup_menu(
388     -name => "${name}_year",
389     -default => $year,
390     -values => [$year-5..$cur_year],
391     );
392    
393    
394     return $str;
395     }
396    
397     #----------------------- ymd_to_unix --------------------------
398     # Silly Date::Calc
399     sub ymd_to_unix {
400     my ($y, $m, $d ) = @_;
401     $m--;
402     $y -= 1900;
403     return timelocal( 0, 0, 0, $d, $m, $y );
404     }
405    
406     1;
407    
408     =back
409    
410     =head1 COPYRIGHT
411    
412     Copyright 2001 Bill Moseley
413    
414     This library is free software; you can redistribute it and/or
415     modify it under the same terms as Perl itself.
416    
417     =cut
418    

  ViewVC Help
Powered by ViewVC 1.1.22