]> iEval git - gruntmaster-page.git/blobdiff - lib/Gruntmaster/Page/Generic.pm
Add links and full names to usernames in tables
[gruntmaster-page.git] / lib / Gruntmaster / Page / Generic.pm
index 37e793105b1de231c1b04ce024e01baebb833318..3fdd47c0a157d7e190ab5c5c6464bf1e5b53787e 100644 (file)
@@ -3,12 +3,11 @@ package Gruntmaster::Page::Generic;
 use 5.014000;
 use strict;
 use warnings;
+our $VERSION = '0.001';
 
 use Gruntmaster::Data;
 use Gruntmaster::Page::Base;
-use JSON qw/decode_json/;
-our @ISA = qw/Gruntmaster::Page::Base/;
-our $VERSION = '0.001';
+use JSON qw/encode_json decode_json/;
 
 sub hgetall {
        my $hash = shift;
@@ -28,52 +27,51 @@ sub makepkg {
        return if $INC{"$fn.pm"};
        $INC{"$fn.pm"} = 1;
        Gruntmaster::Page::Base->import_to($pkg, $id, $title);
-       putsym "${pkg}::ISA", ['Gruntmaster::Page::Base'];
+       1
 }
 
-sub make_generate {
-       my %thing = @_;
-       sub {
-               my ($self, $htc, $lang, $env, $ct) = @_;
-               undef $ct unless $thing{contest};
-               debug $env => "Contest is $ct";
-               local $Gruntmaster::Data::contest = $ct if $ct;
-               my @thing = hgetall $thing{hash};
-               @thing = map  { $thing{mangle}->(); $_ } @thing if exists $thing{mangle};
-               @thing = grep { $thing{choose}->() } @thing if exists $thing{choose};
-               @thing = sort { $thing{sortby}->() } @thing if exists $thing{sortby};
-               my %params;
-               $thing{group} //= sub { $thing{id} };
-               for (@thing) {
-                       my $group = $thing{group}->();
-                       $params{$group} //= [];
-                       push $params{$group}, $_
-               }
-               $htc->param(%params);
+sub list {
+       my ($thing, $lang, $env, $ct) = @_;
+       my %thing = %$thing;
+       undef $ct unless $thing{contest};
+       debug $env => "Contest is $ct";
+       local $Gruntmaster::Data::contest = $ct if $ct;
+       my @thing = hgetall $thing{hash};
+       @thing = map  { $thing{mangle}->(); $_ } @thing if exists $thing{mangle};
+       @thing = grep { $thing{choose}->() } @thing if exists $thing{choose};
+       @thing = sort { $thing{sortby}->() } @thing if exists $thing{sortby};
+       my %params;
+       $thing{group} //= sub { $thing{id} };
+       for (@thing) {
+               my $group = $thing{group}->();
+               $params{$group} //= [];
+               push $params{$group}, $_
        }
+       wantarray ? %params : \%params
 }
 
-sub make_entry_generate{
-       my %thing = @_;
-       sub {
-               my ($self, $htc, $lang, $env, $id, $ct) = @_;
-               ($id, $ct) = ($ct, $id) if $thing{contest};
-               local $Gruntmaster::Data::contest = $ct if $ct;
-               debug $env => "Hash is $thing{hash} and id is $id";
-               my %params = HGETALL "$thing{hash}.$id";
-               $thing{mangle}->(local $_ = \%params) if exists $thing{mangle};
-               %params = (%params, $thing{hook}->(local $_ = \%params)) if exists $thing{hook};
-               $htc->param(%params);
-       }
+sub entry {
+       my ($thing, $lang, $env, $id, $ct) = @_;
+       my %thing = %$thing;
+       ($id, $ct) = ($ct, $id) if $thing{contest};
+       local $Gruntmaster::Data::contest = $ct if $ct;
+       debug $env => "Hash is $thing{hash} and id is $id";
+       my %params = HGETALL "$thing{hash}.$id";
+       $thing{mangle}->(local $_ = \%params) if exists $thing{mangle};
+       wantarray ? %params : \%params
 }
 
+sub headers ($) { ['Content-Type' => 'application/json', 'Cache-Control' => 'max-age=' . $_[0]->max_age] }
+
 sub create_thing {
        my %thing = @_;
        my $ucid = ucfirst $thing{id};
        my $pkg = "Gruntmaster::Page::$ucid";
 
-       putsym "${pkg}::_generate", make_generate %thing if makepkg $pkg, @thing{qw/id title/};
-       putsym "${pkg}::Entry::_generate", make_entry_generate %thing if makepkg "${pkg}::Entry", "$thing{id}_entry", '<tmpl_var name>';
+       putsym "${pkg}::_generate", sub { $_[1]->param(list \%thing, @_[2..$#_]) } if makepkg $pkg, @thing{qw/id title/};
+       putsym "${pkg}::Entry::_generate",  sub { $_[1]->param(entry \%thing, @_[2..$#_]) } if makepkg "${pkg}::Entry", "$thing{id}_entry", '<tmpl_var name>';
+       putsym "${pkg}::Read::generate", sub { [200, headers shift, [encode_json list \%thing, @_]] } if makepkg "${pkg}::Read";
+       putsym "${pkg}::Entry::Read::generate", sub { [200, headers shift, [encode_json entry \%thing, @_]] } if makepkg "${pkg}::Entry::Read";
 }
 
 sub params;
@@ -82,7 +80,6 @@ sub choose (&);
 sub sortby (&);
 sub group  (&);
 sub mangle (&);
-sub hook   (&);
 
 sub thing (&){
        my %thing;
@@ -93,7 +90,6 @@ sub thing (&){
        local *{"mangle"} = sub { $thing{mangle} = shift };
        local *{"group"} = sub { $thing{group} = shift };
        local *{"contest"} = sub { $thing{contest} = 1 };
-       local *{"hook"} = sub { $thing{hook} = shift };
        use strict 'refs';
 
        shift->();
@@ -113,26 +109,20 @@ thing {
        contest;
        sortby { $a->{name} cmp $b->{name} };
        group { $_->{level} };
+       mangle { $_->{owner_name} = do { local $Gruntmaster::Data::contest; user_name $_->{owner} } }
 };
 
 thing {
        params qw/ct contest Contests/;
-       mangle {
-               $_->{start} = strftime '%c', localtime $_->{start};
-               $_->{end} = strftime '%c', localtime $_->{end};
-       };
        sortby { $a->{start} <=> $b->{start} };
        group { time < $_->{start} ? 'pending' : time > $_->{end} ? 'finished' : 'running' };
-       hook { started => time >= $_->{start} };
+       mangle { $_->{started} = time >= $_->{start}; $_->{owner_name} = do { local $Gruntmaster::Data::contest; user_name $_->{owner} } };
 };
 
 thing {
        params qw/log job/, 'Job log';
        contest;
-       mangle {
-               $_->{results} &&= decode_json $_->{results};
-               $_->{time} = sprintf "%.4fs", $_->{time} for values ($_->{results} // [])
-       }
+       mangle { $_->{results} &&= decode_json $_->{results}; $_->{user_name} = do { local $Gruntmaster::Data::contest; user_name $_->{user} } }
 };
 
 1
This page took 0.019103 seconds and 4 git commands to generate.