1 # This file is part of Email-Reminder.
3 # Email-Reminder is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License as
5 # published by the Free Software Foundation; either version 3 of the
6 # License, or (at your option) any later version.
8 # Email-Reminder is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with Email-Reminder; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 package EmailReminder
::Event
;
20 # Base class for all other events.
22 # This class should never be used directly, use a derived class instead.
30 use EmailReminder
::Utils
;
33 __PACKAGE__
->mk_accessors(qw(name));
36 my ($self, @field_names) = @_;
38 # get the classname since it might be a derived class calling this
39 my $class = ref $self || $self;
41 foreach my $field_name ( @field_names ) {
42 my $get_method = sub {
44 my $valid_sub = "valid_$field_name";
45 my $value = EmailReminder
::Utils
::get_node_value
($self->{XML_NODE
}, $field_name);
46 return $self->$valid_sub( $value );
49 my $set_method = sub {
50 my ($self, $new_value) = @_;
51 return EmailReminder
::Utils
::set_node_value
($self->{XML_NODE
}, $field_name, $new_value);
56 *{"${class}::get_$field_name"} = $get_method;
57 *{"${class}::set_$field_name"} = $set_method;
63 # other XML tags, attributes and values
64 my $REMINDER_TAG = 'reminder';
65 my $REMINDERS_TAG = 'reminders';
66 my $RECIPIENT_TAG = 'recipient';
67 my $RECIPIENTS_TAG = 'recipients';
69 my $EMAIL_ATTR = 'email';
70 my $NAME_ATTR = 'name';
71 my $TYPE_ATTR = 'type';
73 my $DAYS_BEFORE_VAL = 'days before';
74 my $SAME_DAY_VAL = 'same day';
76 # Hard-coded value for this event's type (class method)
82 # Number of fields this event adds to its parent (class method)
89 my ($class, $new_value) = @_;
96 my $event_node = shift;
99 my $self = { "OCCURRING" => 0,
100 "XML_NODE" => $event_node,
107 # Create empty data array
108 my $count = $self->get_nb_fields() - 1;
109 for (my $i = 0; $i < $count; $i++) {
110 push(@
{$self->{DATA
}}, undef);
113 # Where to send this reminder email
114 my $recipients = $self->{XML_NODE
}->getElementsByTagName($RECIPIENTS_TAG)->item(0);
115 if (defined($recipients)) {
116 $self->{RECIPIENTS_NODE
} = $recipients;
117 $self->{RECIPIENTS_CACHE
} = $self->get_recipients();
121 my $reminders = $self->{XML_NODE
}->getElementsByTagName($REMINDERS_TAG)->item(0);
122 if (defined($reminders)) {
123 $self->{REMINDERS_NODE
} = $reminders;
124 $self->{REMINDERS_CACHE
} = $self->get_reminders();
133 my $node = $self->{XML_NODE
};
134 $node->getParentNode()->removeChild($node);
143 if (!defined($self->{RECIPIENTS_CACHE
})) {
146 if (defined($self->{RECIPIENTS_NODE
})) {
147 foreach my $recipient ($self->{RECIPIENTS_NODE
}->getElementsByTagName($RECIPIENT_TAG)) {
148 my $email = $recipient->getAttribute($EMAIL_ATTR);
149 if (defined($email)) {
152 my $fullname = $recipient->getAttribute($NAME_ATTR);
154 my @name_parts = split(/ /, $fullname);
155 $fname = $name_parts[0];
156 $lname = $name_parts[-1] if @name_parts > 1;
158 push(@recipients, [$email, $fname, $lname]);
163 $self->{RECIPIENTS_CACHE
} = \
@recipients;
165 return $self->{RECIPIENTS_CACHE
};
172 if (!defined($self->{REMINDERS_CACHE
})) {
175 if (defined($self->{REMINDERS_NODE
}))
177 foreach my $reminder ($self->{REMINDERS_NODE
}->getElementsByTagName($REMINDER_TAG)){
178 my $type = $reminder->getAttribute($TYPE_ATTR);
180 if ($type eq $SAME_DAY_VAL) {
183 if ($self->will_occur("")) {
184 $self->{WHEN
} = "today";
185 $self->{OCCURRING
}++;
188 elsif (($type eq $DAYS_BEFORE_VAL) &&
189 ($reminder->getFirstChild()))
191 my $days = $reminder->getFirstChild()->getNodeValue();
192 push(@reminders, $days);
194 if ($self->will_occur($days)) {
196 my $upcoming_date = DateCalc
("today", "+${days}days");
197 $self->{WHEN
} = "in $days days (" . UnixDate
($upcoming_date, "%A %b %e") . ")";
200 $self->{WHEN
} = "tomorrow";
203 $self->{WHEN
} = "today";
206 next; # Negative days are ignored
209 $self->{OCCURRING
}++;
215 $self->{REMINDERS_CACHE
} = \
@reminders;
218 return $self->{REMINDERS_CACHE
};
223 my ($self, $new_reminders) = @_;
225 my $event = $self->{XML_NODE
};
226 my $doc = $event->getOwnerDocument();
227 my $reminders = $self->{REMINDERS_NODE
};
229 if (!defined($reminders)) {
230 # Create a blank <reminders> tag
231 $reminders = $doc->createElement($REMINDERS_TAG);
232 $event->appendChild($reminders);
234 $self->{REMINDERS_NODE
} = $reminders;
237 # TODO: preserve extra reminders in the XML but not in the UI
239 # Delete all current reminders
240 foreach my $child ($reminders->getChildNodes()) {
241 $reminders->removeChild($child);
245 # Add all reminders to the <reminders> node
246 foreach my $nb_days (@
$new_reminders)
248 my $new_node = $doc->createElement($REMINDER_TAG);
252 $new_node->setAttribute($TYPE_ATTR, $SAME_DAY_VAL);
256 $new_node->setAttribute($TYPE_ATTR, $DAYS_BEFORE_VAL);
257 $new_node->addText($nb_days);
261 # Invalid number, ignore
265 $reminders->appendChild($new_node);
269 undef $self->{REMINDERS_CACHE
};
277 return $self->{OCCURRING
};
285 my $first_name = shift || 'there';
287 my $body = $self->get_message_body(@_);
290 $message = <<"MESSAGEEND" if $body;
297 Sent by Email-Reminder $EmailReminder::Utils::VERSION
298 https://launchpad.net/email-reminder
307 return $self->{DATA
};