From 7f99a7a87157ffb14f00ed17dccfccaac13ff2a2 Mon Sep 17 00:00:00 2001 From: hylom Date: Thu, 21 Sep 2017 22:03:55 +0900 Subject: [PATCH] Archive and Timeline support polls contents --- src/newslash_web/css/main/polls.less | 6 ++ src/newslash_web/lib/Newslash/Web.pm | 4 + .../lib/Newslash/Web/Controller/Archive.pm | 93 +++++++++++++++++----- .../lib/Newslash/Web/Controller/Timeline.pm | 31 +++++--- src/newslash_web/templates/archive/index.html.tt2 | 4 +- .../templates/archive/index_header.html.tt2 | 24 +++++- .../templates/common/article/article.html.tt2 | 43 ++++++---- .../templates/common/poll/poll_body.html.tt2 | 13 ++- 8 files changed, 163 insertions(+), 55 deletions(-) diff --git a/src/newslash_web/css/main/polls.less b/src/newslash_web/css/main/polls.less index 39d491b8..1d97a259 100644 --- a/src/newslash_web/css/main/polls.less +++ b/src/newslash_web/css/main/polls.less @@ -1,5 +1,11 @@ @import "colors.less"; +article .body { + ol.poll-answers { + list-style-type: circle; + } +} + #vote-body { .vote { margin-left: 8px; diff --git a/src/newslash_web/lib/Newslash/Web.pm b/src/newslash_web/lib/Newslash/Web.pm index 69476b06..25008d43 100644 --- a/src/newslash_web/lib/Newslash/Web.pm +++ b/src/newslash_web/lib/Newslash/Web.pm @@ -193,6 +193,10 @@ sub startup { $r->get('/submission/:year/')->to('archive#submission'); $r->get('/submission/')->to('archive#submission'); + $r->get('/poll/:year/:month/')->to('archive#poll'); + $r->get('/poll/:year/')->to('archive#poll'); + $r->get('/poll/')->to('archive#poll'); + # my page $r->get('/my/settings')->to('user#settings', seclev => 1); $r->get('/my/sidebar')->to('user#sidebar', seclev => 1); diff --git a/src/newslash_web/lib/Newslash/Web/Controller/Archive.pm b/src/newslash_web/lib/Newslash/Web/Controller/Archive.pm index cb0728ac..4f982b05 100644 --- a/src/newslash_web/lib/Newslash/Web/Controller/Archive.pm +++ b/src/newslash_web/lib/Newslash/Web/Controller/Archive.pm @@ -10,31 +10,58 @@ use Newslash::Util::Formatters; use Newslash::Util::Items; sub _check_params { - my $c = shift; + my ($c, $type, $unit) = @_; my $year = $c->stash('year'); my $month = $c->stash('month'); my $day = $c->stash('day'); my $do_redirect = 0; + my $r_path = ""; - if ($year !~ m/^\d{2}$/) { + # check year + if (!$year || $year !~ m/^\d{2}$/) { $year = DateTime->now->year - 2000; $month = DateTime->now->month; $month = "0" . $month if ($month < 10); $day = "01"; $do_redirect = 1; } - if ($month !~ m/^\d{2}$/) { + # check month + if (!$month || $month !~ m/^\d{2}$/) { $month = "01"; $day = "01"; - $do_redirect = 1; + if ($unit eq "month" || $unit eq "day") { + $do_redirect = 1; + } } - if ($day !~ m/^\d{2}$/) { + # check day + if (!$day || $day !~ m/^\d{2}$/) { $day = "01"; - $do_redirect = 1; + if ($unit eq "day") { + $do_redirect = 1; + } } - return ($year, $month, $day, $do_redirect); + if ($unit eq "year") { + $r_path = "/$type/$year/" if $do_redirect; + return ($year, $month, $day, $r_path); + } + if ($unit eq "month") { + $r_path = "/$type/$year/$month/" if $do_redirect; + return ($year, $month, $day, $r_path); + } + if ($unit eq "day") { + $r_path = "/$type/$year/$month/$day/" if $do_redirect; + return ($year, $month, $day, $r_path); + } + + # invalid unit + $year = DateTime->now->year - 2000; + $month = DateTime->now->month; + $month = "0" . $month if ($month < 10); + $day = "01"; + $r_path = "/$type/$year/$month/$day/"; + return ($year, $month, $day, $r_path); } sub _render_archive { @@ -44,12 +71,14 @@ sub _render_archive { my $user = $c->stash('user'); my $model = $params->{model}; my $type = $params->{type}; - my ($year, $month, $day, $do_redirect) = _check_params($c); + my $unit = $params->{unit} || "day"; - if ($do_redirect) { + my ($year, $month, $day, $r_path) = _check_params($c, $type, $unit); + + if ($r_path) { $c->res->code(301); - $c->redirect_to("/$type/$year/$month/$day/"); - return 0; + $c->redirect_to($r_path); + return; } $year = $year + 2000; @@ -61,15 +90,25 @@ sub _render_archive { }; my $offset_sec = $user->{config}->{offset_sec} || 0; - my $items = $model->select(year => $year, - month => $month, - day => $day, - offset_sec => $offset_sec, - order_by => { create_time => "DESC" }); + my $q_params = { year => $year, + month => $month, + day => $day, + offset_sec => $offset_sec, + order_by => {create_time => "DESC"}, + }; + + my $unwanted_keys = []; + $unwanted_keys = [qw(month day)] if ($unit eq "year"); + $unwanted_keys = [qw(day)] if ($unit eq "month"); + for my $k (@$unwanted_keys) { + delete $q_params->{$k}; + } + + my $items = $model->select(%$q_params); - my $counts = $model->count(year => $year, - month => $month, - offset_sec => $offset_sec); + delete $q_params->{$unit}; + delete $q_params->{order_by}; + my $counts = $model->count(%$q_params); # get next/prev date my $next; @@ -81,17 +120,19 @@ sub _render_archive { offset_sec => $offset_sec, order_by => {create_time => "DESC"}, limit => 1); - $dt->add(days => 1); + + $dt->add(days => 1) if $unit eq "day"; + $dt->add(months => 1) if $unit eq "month"; my $next_items = $model->select(since => $dt, offset_sec => $offset_sec, order_by => {create_time => "ASC"}, limit => 1); if ($prev_items && @$prev_items) { - $prev = Newslash::Util::Items->get_date_string_from_item($prev_items->[0], $offset_sec); + $prev = Newslash::Util::Items->get_date_string_from_item($prev_items->[0], $offset_sec, $unit); } if ($next_items && @$next_items) { - $next = Newslash::Util::Items->get_date_string_from_item($next_items->[0], $offset_sec); + $next = Newslash::Util::Items->get_date_string_from_item($next_items->[0], $offset_sec, $unit); } $c->render(template => 'archive/index', @@ -136,4 +177,12 @@ sub submission { title => "タレコミ"); } +sub poll { + my $c = shift; + $c->_render_archive(model => $c->model("polls"), + type => "poll", + title => "タレコミ", + unit => "month"); +} + 1; diff --git a/src/newslash_web/lib/Newslash/Web/Controller/Timeline.pm b/src/newslash_web/lib/Newslash/Web/Controller/Timeline.pm index 96966cf4..93b54fcf 100644 --- a/src/newslash_web/lib/Newslash/Web/Controller/Timeline.pm +++ b/src/newslash_web/lib/Newslash/Web/Controller/Timeline.pm @@ -5,24 +5,19 @@ use Mojo::Util qw(dumper); use DateTime; use DateTime::Format::MySQL; use Newslash::Util::Formatters; +use Newslash::Util::Items; sub _make_navitem { my ($self, $item) = @_; return if !$item; - my $dt = Newslash::Util::Formatters::parse_mysql_datetime($item->{create_time}); - return if !$dt; - - my $user = $self->stash('user'); - # consider timezone + my $user = $self->stash('user'); my $offset_sec = $user->{config}->{offset_sec} || 0; - $dt->add(seconds => -$offset_sec) if ($offset_sec != 0); - my ($yyyy, $mm, $dd) = ($dt->year, $dt->month, $dt->day); - my $yy = substr($yyyy, 2); - $mm = "0$mm" if $mm < 10; - $dd = "0$dd" if $dd < 10; + my $unit = "day"; + $unit = "month" if $item->{content_type} eq "poll"; + my $date = Newslash::Util::Items->get_date_string_from_item($item, $offset_sec, $unit); my $id; if ($item->{content_type} eq "story") { @@ -33,7 +28,7 @@ sub _make_navitem { } return { - date =>"$yy/$mm/$dd", + date => $date, id => $id, type => $item->{content_type}, }; @@ -75,7 +70,8 @@ sub _render_timeline { $self->render("timeline/base", items => $items, prev => $prev, - title => $title); + title => $title, + timeline => 1); } sub stories { @@ -168,5 +164,16 @@ sub submissions { title => "タレコミ"); } +sub polls { + my $c = shift; + my $limit = $c->_get_config("item_per_page", 10); + my $items = $c->model('polls')->select(limit => $limit + 1, + order_by => {create_time => 'DESC'}); + + $c->_render_timeline(items => $items, + limit => $limit, + title => "国民投票"); +} + 1; diff --git a/src/newslash_web/templates/archive/index.html.tt2 b/src/newslash_web/templates/archive/index.html.tt2 index a32dc78e..66906291 100644 --- a/src/newslash_web/templates/archive/index.html.tt2 +++ b/src/newslash_web/templates/archive/index.html.tt2 @@ -18,12 +18,12 @@
[%- IF prev -%] - ≪前 + ≪前 [%- END -%] [%- IF next -%] - 次≫ + 次≫ [%- END -%]
diff --git a/src/newslash_web/templates/archive/index_header.html.tt2 b/src/newslash_web/templates/archive/index_header.html.tt2 index 65703f46..fceec7e1 100644 --- a/src/newslash_web/templates/archive/index_header.html.tt2 +++ b/src/newslash_web/templates/archive/index_header.html.tt2 @@ -23,19 +23,35 @@ IF n_mm < 10; n_mm = "0" _ n_mm; END;
+ [%- ELSE -%] + +
[% yyyy %]年[% m %]月[% d %]日
+ [%- END -%] + [%- IF archive_type != "poll" %] @@ -58,11 +74,13 @@ IF n_mm < 10; n_mm = "0" _ n_mm; END;
+ [%- END -%]
記事 / 日記 / - タレコミ + タレコミ / + 国民投票
diff --git a/src/newslash_web/templates/common/article/article.html.tt2 b/src/newslash_web/templates/common/article/article.html.tt2 index 5786a5f2..ef02fdaa 100644 --- a/src/newslash_web/templates/common/article/article.html.tt2 +++ b/src/newslash_web/templates/common/article/article.html.tt2 @@ -16,23 +16,24 @@ IF story.content_type == 'vote'; content_id = story.qid; END; [%- END -%] [%- IF story.content_type == 'story'; url = "/story/" _ story.sid _ "/"; END -%] [%- IF story.content_type == 'journal'; url = "/journal/" _ story.id _ "/"; END -%] - [%- IF story.content_type == 'submission'; url = "/submission/" _ story.subid _ "/"; END -%] - [%- IF story.content_type == 'poll'; url = "/poll/" _ story.qid _ "/"; END -%] + [%- IF story.content_type == 'submission'; url = "/submission/" _ story.id _ "/"; END -%] + [%- IF story.content_type == 'poll'; url = "/poll/" _ story.id _ "/"; END -%] [%- IF story.preview; url = "#"; END -%] [% story.title %] +
[%- IF story.content_type == 'story' -%]ストーリー[%- END -%] [%- IF story.content_type == 'journal' -%]日記[%- END -%] [%- IF story.content_type == 'submission' -%]タレコミ[%- END -%] [%- IF story.content_type == 'poll' -%]国民投票[%- END -%] - [%- IF story.content_type == 'vote' -%]国民投票[%- END -%] by [% story.author %] [% dtf.mysql_to_user(story.create_time, user.config.offset_sec, user.config.time_format) %] [% IF story.content_type == 'story' %][% story.dept %] 部門より[% END %]
+
[%- IF story.content_type == 'journal' && story.uid == user.uid || x_template -%]