6 package Gruta
::Data
::BASE
;
19 return ($_[0]->fields(), $_[0]->vfields());
30 $self->{_source
} = shift;
33 return $self->{_source
};
40 my $id = $self->get('id') || '';
41 $id =~ /^[\d\w_-]+$/ or confess
"Bad id '$id' [" . ref($self) . '] ';
50 my $self = bless({ }, $class);
52 foreach my $k ($self->afields()) {
54 $self->set($k, $args{$k});
64 confess
'get ' . ref($self) . " field '$field'?" unless exists $self->{$field};
66 return $self->{$field};
74 confess
'set ' . ref($self) . " field '$field'?" unless exists $self->{$field};
76 $self->{$field} = $self->filter_field($field, $value);
78 return $self->{$field};
82 package Gruta
::Data
::Topic
;
84 use base
'Gruta::Data::BASE';
87 return qw(id name editors max_stories internal description);
95 # ensure empty numeric values are 0
96 if ($field =~ /^(max_stories|internal)$/ && !$value) {
105 my $user = shift; # Gruta::Data::User
107 return $user && ($user->get('is_admin') ||
108 ($self->get('editors') || '')
109 =~ m{\b$user->get('id')\b}) ?
1 : 0;
112 package Gruta
::Data
::Story
;
114 use base
'Gruta::Data::BASE';
119 return qw(id topic_id title date date2 userid format hits ctime toc has_comments full_story content description abstract body);
127 # ensure empty numeric values are 0
128 if ($field =~ /^(hits|ctime)$/ && !$value) {
138 $self->SUPER::_assert
();
140 my $topic_id = $self->get('topic_id') || '';
141 $topic_id =~ /^[\d\w_-]+$/ or croak
"Bad topic_id";
147 return Gruta
::Data
::format_date
($_[0]->get('date'), $_[1]);
151 return Gruta
::Data
::format_date
($_[0]->get('date2'), $_[1]);
163 $self->set('tags', [ @_ ]);
166 @ret = @
{ $self->get('tags') };
177 my ($s, $m, $h, $d, $M, $y) = localtime(time());
179 $id = sprintf("%02x%c%c%c%c%02x",
181 (($y + $m) % 25) + 97,
182 (($d + $M) % 25) + 97,
193 my $user = shift; # Gruta::Data::User
195 return !$user && $self->get('date') gt Gruta
::Data
::today
() ?
0 : 1;
199 package Gruta
::Data
::User
;
201 use base
'Gruta::Data::BASE';
204 return qw(id username email password can_upload is_admin xdate);
212 # ensure empty numeric values are 0
213 if ($field =~ /^(can_upload|is_admin)$/ && !$value) {
221 return Gruta
::Data
::format_date
($_[0]->get('xdate'), $_[1]);
228 $self->set('password', Gruta
::Data
::crypt($passwd));
234 package Gruta
::Data
::Session
;
236 use base
'Gruta::Data::BASE';
239 return qw(id time user_id ip);
245 my $sid = time() . $$;
247 return $class->SUPER::new
( id
=> $sid, time => time(), @_);
251 package Gruta
::Data
::Template
;
253 use base
'Gruta::Data::BASE';
256 return qw(id content);
260 package Gruta
::Data
::Comment
;
262 use base
'Gruta::Data::BASE';
267 return qw(id topic_id story_id ctime date approved author email content);
276 if ($field eq 'approved' && !$value) {
285 return Gruta
::Data
::format_date
($_[0]->get('date'), $_[1]);
291 my $id = sprintf("%08x%04x", time(), $$);
293 return $class->SUPER::new
(
296 date
=> Gruta
::Data
::today
(),
315 my ($y, $m, $d, $H, $M, $S) = ($date =~
316 /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);
318 # convert %y to %Y for compatibility
319 $format =~ s/%y/%Y/g;
321 $format = POSIX
::strftime
($format, $S, $M, $H,
322 $d, $m - 1, $y - 1900);
332 $Gruta::Data
::_today
= undef;
337 my $date = $Gruta::Data
::_today
;
340 my ($S, $M, $H, $d, $m, $y) = (localtime)[0..5];
342 $date = sprintf('%04d%02d%02d%02d%02d%02d',
343 1900 + $y, $m + 1, $d, $H, $M, $S);
345 $Gruta::Data
::_today
= $date;
348 return Gruta
::Data
::format_date
($date, $format);
356 # no salt? pick one at random
358 $salt = sprintf('%02d', rand(100));
361 return crypt($key, $salt);