The user account expiration date is used in login().
[gruta.git] / Gruta / Data.pm
blobc0ebd5718ced35a3dc2763a64c989908b4b0bce1
1 package Gruta::Data;
3 use strict;
4 use warnings;
6 package Gruta::Data::BASE;
8 use Carp;
10 sub fields { return (); }
11 sub vfields { return (); }
12 sub afields { return ($_[0]->fields(), $_[0]->vfields()); }
14 sub source {
15 my $self = shift;
17 if (@_) {
18 $self->{_source} = shift;
21 return $self->{_source};
25 sub _assert {
26 my $self = shift;
28 my $id = $self->get('id') || '';
29 $id =~ /^[\d\w_-]+$/ or croak "Bad id [$id]";
31 return $self;
34 sub new {
35 my $class = shift;
36 my %args = @_;
38 my $self = bless({ }, $class);
40 foreach my $k ($self->afields()) {
41 $self->{$k} = $args{$k};
44 return $self;
47 sub get {
48 my $self = shift;
49 my $field = shift;
51 croak 'get ' . ref($self) . " field '$field'?" unless exists $self->{$field};
53 return $self->{$field};
56 sub set {
57 my $self = shift;
58 my $field = shift;
60 croak 'set ' . ref($self) . " field '$field'?" unless exists $self->{$field};
62 $self->{$field} = shift;
64 return $self->{$field};
68 package Gruta::Data::Topic;
70 use base 'Gruta::Data::BASE';
72 sub fields { return qw(id name editors max_stories internal); }
74 package Gruta::Data::Story;
76 use base 'Gruta::Data::BASE';
78 use Carp;
80 sub fields { return qw(id topic_id title date userid format hits ctime content); }
81 sub vfields { return qw(tags abstract body); }
83 sub _assert {
84 my $self = shift;
86 $self->SUPER::_assert();
88 my $topic_id = $self->get('topic_id') || '';
89 $topic_id =~ /^[\d\w_-]+$/ or croak "Bad topic_id";
91 return $self;
94 sub date {
95 my $self = shift;
96 my $format = shift;
98 if (defined($format)) {
99 my ($y, $m, $d, $H, $M, $S) = ($self->get('date') =~
100 /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);
102 $format =~ s/%Y/$y/g;
103 $format =~ s/%y/$y/g;
104 $format =~ s/%m/$m/g;
105 $format =~ s/%d/$d/g;
106 $format =~ s/%H/$H/g;
107 $format =~ s/%M/$M/g;
108 $format =~ s/%S/$S/g;
110 else {
111 $format = $self->get('date');
114 return($format);
117 sub touch { return $_[0]; }
119 sub tags {
120 my $self = shift;
121 my @ret = undef;
123 if (scalar(@_)) {
124 $self->set('tags', [ @_ ]);
126 else {
127 @ret = @{ $self->get('tags') };
130 return @ret;
133 sub new_id {
134 my $self = shift;
136 return sprintf ('%08x', int(rand(0xffffffff)));
139 package Gruta::Data::User;
141 use base 'Gruta::Data::BASE';
143 sub fields { return qw(id username email password can_upload is_admin xdate); }
144 sub vfields { return qw(sid); }
146 package Gruta::Data::Session;
148 use base 'Gruta::Data::BASE';
150 sub fields { return qw(id time user_id ip); }