package project; use sql; #@project::ISA=qw(record); use table; use strict; use project_image; use session; sub new { my $c=shift; my $mk=shift; my $t; if ($mk) { $t=&sql::select1("project","mainkey",$mk); } if (!$t) { return bless {new=>1}; } bless $t; $t->{fileprefix}=~s/ +$//; $t->{fileprefix}=~s/^ +//; $t->{admin} = ($t->isMember(&session::userName)); $t; } sub isMember { my $t=shift; my $u=shift; my $it=&sql::select(qq( select * from membership where project=@{[&sql::str($t->{mainkey})]} and _user= @{[&sql::str($u)]} )); $it->next; } sub isLicenseEditable { my $t=shift; return 0 if(!$t->{admin}); my $s=&sql::select1("version","project",$t->{mainkey}); (!$t->{license} or !$s); } sub columnProp { return ("admin"=>"e", "new"=>"e", "mainkey"=>"m", ); } sub overView { my $t=shift; my $edt; if ($t->{admin}) { $edt=&html::form(<$t->{mainkey}}); EOF } my $gs=$t->showGernes; my $tbl=new table; my $li=&html::link("ライセンスを確認する","viewLicense", {project=>$t->{mainkey}}); $tbl->addRow ->addCol( &html::preBreak( &html::escape($t->{description}) ). "
$gs

$li
$edt") ->addCol($t->randomImg); &html::titledBox("プロジェクトの概要" ,$tbl->out); } sub miniOverView { my $t=shift; my $date=shift; $date =~ s/:\d\d\+\d\d$//; my $gs=$t->showGernes(1); my $tbl=new table; $tbl->addRow ->addCol ( &html::preBreak ( &comment::digest (&html::escape($t->{description}), 60) )."
$gs
".$t->miniMembers. "
更新: $date") ->addCol("

".$t->randomImg(1)."
") ->setCellAttr("width",150); &html::titledBox("
@{[$t->link2Top($t->{title})]}
" ,$tbl->out); } sub showGernes { my $t=shift; my $iconOnly=shift; my @buf; my $it=&sql::select (qq( select g.mainkey, g.name from gerne g inner join gerneset gs on gs.gerne=g.mainkey where gs.project=@{[&sql::i($t->{mainkey})]} )); while (my $r=$it->next) { bless $r,"gerne"; if ($iconOnly) { push @buf,$r->icon; } else { push @buf, $r->gerneLink; } } if ($iconOnly) { return join("",@buf); } else { return join(" - ",@buf); } } sub randomImg { my $t=shift; my $img2Top=shift; my $it=&sql::select(qq( select * from project_image where project=$t->{mainkey} )); my @imgs; while (my $r=$it->next) { push @imgs, $r; } my $th; if (@imgs+0> 0) { my $r = $imgs[rand(@imgs+0)]; bless $r,"project_image"; $th=$r->thumbNail; } else { $th=qq(); } if ($img2Top) { &html::link( $th, "viewProject", {mainkey=>$t->{mainkey}} ); } else { &html::link( $th, "editImage", {mainkey=>$t->{mainkey}} ); } } sub members{ my $t=shift; my $it=&sql::select(qq(select m._user as _user , u.name as name from membership m inner join _user u on u.mainkey=m._user where m.project=$t->{mainkey})); my $c; while (my $r=$it->next) { $c.= &html::link( &html::escape($r->{name}) ,"userInfo",{user=>$r->{_user}}); } &html::titledBox("メンバー",$c); } sub miniMembers { my $t=shift; my $it=&sql::select(qq(select m._user as _user , u.name as name from membership m inner join _user u on u.mainkey=m._user where m.project=$t->{mainkey})); my $c; while (my $r=$it->next) { $c.= &html::link( &html::escape($r->{name}) ,"userInfo",{user=>$r->{_user}}); } $c; } use gerne; sub editOverView { my $t=shift; my $msg="プロジェクトの編集"; if ($t->{new}) {$msg="新規プロジェクト";} my @gs2; if (!$t->{new}) { my $gs=&sql::select (qq( select gerne from gerneset where project=$t->{mainkey} )); while (my $r=$gs->next) { push @gs2,$r->{gerne}; } } my $tbl=new table; $tbl->addRow ->addCol("タイトル") ->addCol(&tag::p("input",{type=>"text",name=>"title",size=>30,value=>$t->{title}})) ->addRow ->addCol("説明") ->addCol(&tag::p("textarea",{rows=>10,cols=>40,name=>"description"} ,$t->{description})) ->addRow ->addCol("ファイル名
(英字、数値、アンダースコア _ )") ->addCol(&tag::p("input",{type=>"text",name=>"fileprefix",value=>$t->{fileprefix}})) ->addRow ->addCol("ジャンル1(必須)") ->addCol(&gerne::selectBox("gerne1",@gs2[0])) ->addRow ->addCol("ジャンル2") ->addCol(&gerne::selectBox("gerne2",@gs2[1])) ->addRow ->addCol("ジャンル3") ->addCol(&gerne::selectBox("gerne3",@gs2[2])) ; my $cont; if ($t->{new}) { $cont=""; } if (!$t->{license}) { # $tbl->addRow # ->addCol("ライセンス
".&html::link("ライセンスとは?","licenseHelp")) # ->addCol(&tag::p("textarea",{rows=>10,cols=>40,name=>"license"}# # ,$t->{license})); $cont.= &html::form ( $tbl->out. qq(), ,"newLicense",{mainkey=>$t->{mainkey}}, ); } else { $cont.= &html::form ( $tbl->out. qq(), ,"editPrjOverViewDone",{mainkey=>$t->{mainkey}}, ); } &tmpl::default($msg,"edit/create Project",$cont); } sub failUnlessAdmin { my $t=shift; if(!$t->{admin} and !$t->{new}) { die(qq( ユーザ @{[&session::userName]}はこのプロジェクトの管理者でありません )); } } sub checkInput { # license is not cheked my $in=shift; $in->{fileprefix}=~s/ +$//; $in->{fileprefix}=~s/^ +//; if (!$in->{title} or !$in->{description} or !$in->{fileprefix} ) { &tmpl::default("失敗","Failed", <<" EOF"); 未入力の項目があります

@{[&html::back]} EOF return 0; } if ($in->{fileprefix}=~/[^a-zA-Z_0-9]/) { &tmpl::default("失敗","Failed", <<" EOF"); ファイル名は英数字、アンダースコア _ のみ使用できます @{[&html::back]} EOF return 0; } if (!$in->{gerne1}) { &tmpl::default("失敗","Failed", <<" EOF"); ジャンル1は必ず指定してください。

@{[&html::back]} EOF return 0; } return 1; } sub newLicense { my $t=shift; my $in=shift; if (!&checkInput($in)) { return; } my $f=&html::form( $t->licenseEditTable . &html::forwardParam($in). qq() ,"newProjectDone" ); &tmpl::default("ライセンスの設定","license",$f); } sub editLicense { my $t=shift; $t->failUnlessAdmin; if ($t->isLicenseEditable) { my $f=&html::form( $t->licenseEditTable . qq() ,"editLicenseDone" ,{mainkey=>$t->{mainkey}}); &tmpl::default("ライセンスの変更","license",$f); } else { &tmpl::default("失敗","license","ライセンスはもう変更できません"); } } sub licenseEditTable { my $t=shift; my $tbl=new table; $tbl->addRow ->addCol(&html::link("ライセンスとは?","licenseHelp")) ->addRow ->addCol ( &tag::p("textarea", {name=>"license",rows=>20,cols=>80}, $t->{license}) ) ; $tbl->out; } sub update{ my $t=shift; my $in=shift; $t->failUnlessAdmin; if (!&checkInput($in)) { return; } if (my $pak=&sql::select1("project","title",$in->{title})) { bless $pak; if ($t->{new} or ($pak->{mainkey} ne $t->{mainkey})) { &tmpl::default("失敗","Failed", <<" EOF"); @{[$pak->link2Top("同名のプロジェクト")]}があります
2重投稿した可能性があります。

@{[&html::back]} EOF return 0; } } if (my $pak=&sql::select1("project","fileprefix",$in->{fileprefix})) { bless $pak; if ($t->{new} or ($pak->{mainkey} ne $t->{mainkey})) { &tmpl::default("失敗","Failed", <<" EOF"); ファイル名 $in->{fileprefix}は他のプロジェクトで使用されています

@{[&html::back]} EOF return 0; } } $t->{title}=$in->{title}; $t->{description}=$in->{description}; $t->{fileprefix}=$in->{fileprefix}; if ($in->{license}) { $t->{license}=$in->{license}; } if ($t->{new}) { $t->{since}=&sql::now; &sql::insert("project",$t); my $mk=&sql::select1("project","title",$t->{title}); $t->{mainkey}=$mk->{mainkey}; $t->addMember(&session::userName); $t->updateGernes($in->{gerne1},$in->{gerne2},$in->{gerne3}); &tmpl::default("作成完了","Created", <<" EOF"); プロジェクト@{[&html::escape($t->{title})]}を作成しました

@{[$t->link2Top]} EOF } else { $t->updateGernes($in->{gerne1},$in->{gerne2},$in->{gerne3}); &sql::update("project",$t,"mainkey = $t->{mainkey}"); &html::redirect ( "viewProject",{mainkey=>$t->{mainkey}}, qq(プロジェクト@{[&html::escape($t->{title})]}の概要を更新しました) ); } } sub updateGernes { my $t=shift; if (!$t->{new}) { &sql::exe (qq( delete from gerneset where project=$t->{mainkey} )); } use gerneset; while (my $g=shift) { my $ge=new gerneset; $ge->{project}=$t->{mainkey}; $ge->{gerne}=$g; $ge->insert; } } sub addMember { my $t=shift; my $mem=shift; $t->failUnlessAdmin; if ($t->isMember($mem)) {return "$memはすでに管理者です";} &sql::insert("membership",{project=>$t->{mainkey},_user=>$mem}); return 0; } sub link2Top { my $t=shift; my $c=shift; if (!$c) {$c="「@{[&html::escape($t->{title})]}」トップへ";} &html::link(&html::escape($c), "viewProject",{mainkey=>$t->{mainkey}}); } sub link2TopWithIcon { my $t=shift; my $c=shift; if (!$c) {$c=&html::escape($t->{title});} $t->randomImg(1)."
". &html::link( "".&html::escape($c)."", "viewProject",{mainkey=>$t->{mainkey}})."
".$t->showGernes(1); } sub versions { my $t=shift; my $tbl=new table; my $upl; if ($t->{admin}) { $upl= &html::link("新規アップロード...","newVersion", {mainkey=>$t->{mainkey}}); } my $it=&sql::select (qq(select v.mainkey, v.project, v.number, v.filename, v.date, v.poster, com.content as comment, com.mainkey as comment_mainkey from version v left join (comment_for_version cv inner join comment com on cv.comment=com.mainkey ) on v.mainkey=cv.version where v.project=@{[&sql::i($t->{mainkey})]} order by date desc ) ); while (my $r=$it->next) { bless $r,"version"; $tbl->addRow ->addCol($r->{number}) ->addCol($r->dlConfirmLink) ->addCol($r->commentLink); } &html::titledBox("バージョン","$upl
".$tbl->out); } sub latestVersion { my $t=shift; my $it=&sql::select(qq(select * from version where project=$t->{mainkey})); my $v="0.00"; while (my $r=$it->next) { if (&version::compare($r->{number},$v)>0) { $v=$r->{number}; } } $v; } use version; sub newVersion { my $t=shift; $t->failUnlessAdmin; my $v=new version; $v->{project}=$t->{mainkey}; &tmpl::default("新規バージョン(アップロード)","New Version Upload", $v->uploadForm($t->latestVersion)); } sub comments { my $t=shift; my $cb; if (&session::userName) { $cb=&html::link("新しいコメント","newComment", {project=>$t->{mainkey}}). " | " ; } $cb .= &html::link("全部読む","allComments",{project=>$t->{mainkey}}); my $c="$cb

".&comment::dispAll($t->{mainkey}); &html::titledBox("コメント",$c); } sub comments2 { my $t=shift; my $all=shift; my $it=&sql::select(qq( select * from comment where project=$t->{mainkey} and (parent = 0 or parent is null) order by date desc )); my $tbl=new table; my $cb; if (&session::userName) { $cb=&html::link("新しいコメント","newComment", {project=>$t->{mainkey}}). " | " ; } $cb .= &html::link("全部読む","allComments",{project=>$t->{mainkey}}); $tbl->addRow->addCol($cb); my $buf=""; while (my $r=$it->next) { bless $r,"comment"; $buf .= $r->link. "". $r->replies($all ? 1000 : 1); } $tbl->addRow->addCol($buf); &html::titledBox("コメント",$tbl->out); } sub index { } use todo; sub showTodo { my $t=shift; return "" if (!$t->{admin}) ; my $tbl=new table; my $it=&sql::select (qq( select t.* , s.name from todo t inner join todo_state s on t.state=s.id where project=@{[&sql::i($t->{mainkey})]} and t.content <>'DELETE' )); while (my $r=$it->next) { bless $r,"todo"; $r->toTable($tbl); } $tbl->addRow->addCol ( &html::button("↑変更を反映","ADD")); my $newTodo = new todo; my $f = $tbl->out . "追加: ". &tag::p("input",{type=>"text",name=>"add_content"}). &html::button("OK","ADD"); &html::titledBox ("チェックリスト", &html::form($f ,"todoUpdate",{mainkey=>$t->{mainkey}} ) ); } 1;