use use DateTime for date math, add "days from now"
authorTroy Sankey <sankeytms@gmail.com>
Mon, 23 Dec 2013 07:22:26 +0000 (23:22 -0800)
committerTroy Sankey <sankeytms@gmail.com>
Mon, 23 Dec 2013 07:22:26 +0000 (23:22 -0800)
index.pl

index 44dbe82..83097eb 100755 (executable)
--- a/index.pl
+++ b/index.pl
@@ -166,17 +166,21 @@ sub connect_db {
 ###############################################################################
 # Function: get_next_party
 # Parameters: database
-# Return: map contianing the party index and datetime.
+# Return: tuple contianing the party index and datetime.
 # Description:
 #   Get the index and date of the upcoming party. If there are two or more
 #   parties in the future, return the index of the earliest one.
 ###############################################################################
 sub get_next_party {
-  my $sth = $dbh->prepare("SELECT idx,datetime FROM party WHERE datetime > now() ORDER BY datetime ASC")
+  my $sth = $dbh->prepare("SELECT idx,EXTRACT(EPOCH FROM datetime) FROM party WHERE datetime > now() ORDER BY datetime ASC")
     or die "Couldn't prepare statement: " . $dbh->errstr;
   $sth->execute()
     or die "Couldn't execute statement: " . $dbh->errstr;
   my @row = $sth->fetchrow_array(); # should just be one row
+  if (!defined @row) {
+    return undef;
+  }
+  $row[1] = DateTime->from_epoch(epoch => $row[1], time_zone => 'local');
   return @row;
 }
 
@@ -357,7 +361,13 @@ sub handle_submit {
     return;
   }
   $dbh = connect_db();
-  my ($party_idx,$party_timestamp) = get_next_party();
+  my ($party_idx,$party_datetime) = get_next_party();
+  if (!defined $party_idx) {
+    print "<p style=\"color:red\">Registration closed :-(</p>";
+    print_tail();
+    print $q->end_html;
+    return;
+  }
   my $sth = $dbh->prepare("INSERT INTO key (party_idx,name,email,fingerprint,pubkey) VALUES ( ?, ?, ?, ?, 'x')")
     or die "Couldn't prepare statement: " . $dbh->errstr;
   $sth->execute($party_idx,
@@ -398,13 +408,23 @@ sub print_body_home {
     print $q->end_html;
     return;
   }
-  my ($party_idx,$party_timestamp) = get_next_party();
-  my $next_party_string = "none planned yet :-(";
+  my ($party_idx,$party_datetime) = get_next_party();
   if (defined $party_idx) {
-    $next_party_string = $party_timestamp;
+    my $delta_party = $party_datetime->clone()
+                                     ->add(days => 1)  # i don't know why
+                                     ->delta_days(DateTime->today())
+                                     ->delta_days();
+    print "<p>Next keysigning party: <ins>" .
+          $party_datetime->strftime("%F %R %z") .
+          "</ins> (" .
+          ($delta_party == 0 ? "today!" :
+           $delta_party == 1 ? "$delta_party day from now" :
+                               "$delta_party days from now") .
+          ")</p>";
+  } else {
+    print "<p>Next keysigning party: <ins>none planned yet :-(</ins></p>";
   }
-  print "<p>Next keysigning party: <ins>".$next_party_string."</ins></p>",
-        "<p>If you would like to attend, please RSVP by filling in the form below.",
+  print "<p>If you would like to attend, please RSVP by filling in the form below.",
         "<br>For instructions, see the ",
         "<a href=\"https://linux.ucla.edu/wiki/index.php/Keysigning_party\">Keysigning party</a> ",
         "page on the wiki.</p>";
@@ -424,7 +444,7 @@ sub print_body_keylists {
     print $q->end_html;
     return;
   }
-  my ($party_idx,$party_timestamp) = get_next_party();
+  my ($party_idx,$party_datetime) = get_next_party();
   if ($rel_url =~ /^keylist(_.*)?\.txt$/) {
     print $q->header(-type => 'text/plain', -charset=>"utf-8");
     if ($rel_url =~ /^keylist\.txt$/) {