#!/usr/bin/perl
use strict;
push(@INC,'/home/oc/cgi-bin/');
use lib '/home/oc/cgi-bin/';
use OC;
use CGI qw/:standard/;;
use HTML::Template;
use Tie::IxHash;
use vars qw/
%CONFIG
$template
%form
%cookie
$self_url
$TITLE
@LINKS
$BODY
$PANEL
%CATEGORY
@DISPLAYED
$CAN_EDIT
$LOGGED_IN
@NOTE
$NAVIGATION
$USERNAME
$AC_TYPE
$PAGE
/;
sub Initialize {
%form=();
my $query=new CGI;
foreach ($query->param) {
$form{$_}=$query->param($_);
}
%cookie=();
foreach ($query->cookie) {
$cookie{$_}=$query->cookie($_);
}
%CONFIG=%OC::CONFIG;
# $CONFIG{project_url}="/cgi-bin/project2.cgi";
$self_url=$CONFIG{project_url};
# $self_url=$ENV{REQUEST_URI};
# $self_url=~s/^(.*)\?.*$/$1/;
# $self_url=~s/^(.*.cgi).*$/$1/;
@DISPLAYED=();
%CATEGORY=();
tie (%CATEGORY,'Tie::IxHash');
@LINKS=();
$TITLE='';
$BODY='';
$PANEL='';
$PAGE='';
$CAN_EDIT=0;
$LOGGED_IN=0;
@NOTE=();
$NAVIGATION='';
$USERNAME=undef;
$AC_TYPE='';
}
sub ConnectToDatabase {
if (!defined $::db) {
$::db = DBI->connect("DBI:mysql:$CONFIG{db_name}:$CONFIG{db_host}:
$CONFIG{db_port}",$CONFIG{db_username},$CONFIG{db_password})
|| die "Can't connect to database server.";
}
}
sub PrepareSQL {
my ($str) = (@_);
$::sth=$::db->prepare($str);
}
sub ExecuteSQL {
$::sth->execute(@_) || die "Could not execute SQL statement";
}
sub SendSQL {
PrepareSQL(@_);
ExecuteSQL();
}
sub FetchSQLData {
return $::sth->fetchrow_array();
}
sub Note {
push(@NOTE,$_[0]);
}
sub Output_Notes {
my $result="";
foreach (@NOTE) {
$result.="$_ ";
}
$result.="
";
return $result;
}
sub Right_Table {
my $selected=$_[0];
my $table='Navigation';
unless ($LOGGED_IN) {
$table.=OC::Li("Login");
}
if ($selected eq 'browse_projects') {
$table.=OC::Li("Browse projects");
} else {
$table.=OC::Li("Browse projects");
}
if ($selected eq 'start_new_project') {
$table.=OC::Li('Start new project');
} else {
$table.=OC::Li("Start new project");
}
=comment
$table.="
Filter";
my $link="";
if ($form{category} eq '') {
$link="None";
} else {
$link="None";
}
$table.=OC::Li($link);
foreach (keys %CATEGORY) {
my $display=OC::Truncate($CATEGORY{$_}{display_name},12);
if ($form{category} ne $_) {
$link="$display";
} else {
$link="$display";
}
$table.=OC::Li($link);
}
=cut
return $table;
}
sub Prepare_Template {
$template=HTML::Template->new(
filename=>$_[0],
die_on_bad_params=>0,
loop_context_vars=>1,
global_vars=>0,
shared_cache=>0,
);
$template->param(table_color1=>$CONFIG{color}{table1});
$template->param(table_color3=>$CONFIG{color}{table3});
}
sub Append_Body {
my ($title,$body,$edit_link)=@_;
$edit_link='' unless($edit_link);
$BODY.="$title $edit_link
" if ($title ne '');
$BODY.="$body
";
}
sub Block_Edit_Link {
my ($pname,$page,$block)=@_;
$page=$PAGE if ($page eq '');
if ($CAN_EDIT) {
$page=~s/ /\%20/g;
$block=~s/ /\%20/g;
$page=~s/&/\%26/g;
$block=~s/&/\%26/g;
my $link="";
return $link;
}
}
sub Last_Updated {
my ($pname)=@_;
my $time=time;
SendSQL("update project set modified=$time where name='$pname'");
}
sub Tmpl_Details {
my ($category,$updated,$created,$wbc,$stage,$mailinglist)=@_;
my $created=OC::Time_To_Str($created,'nice');
my $updated=OC::Time_To_Str($updated,'nice');
SendSQL("select display_name from project_category where name='$category'");
my $cat_desc=FetchSQLData;
my $body="Category: $cat_desc Last updated: $updated Created: $created ";
$wbc=$wbc>0 ? "Yes" : "No";
$body.="Wishbone compliant core: $wbc ";
SendSQL("select display_name from project_stage where name='$stage'");
$stage=FetchSQLData;
$body.="Stage: $stage ";
$body.="Mailing list: ".ucfirst($mailinglist)."";
Append_Body('Details',$body);
return $cat_desc;
}
sub Tmpl_Files {
my ($pname)=@_;
my @table=();
my @row=();
push(@row,'Date','Description','Link');
push(@table,\@row);
SendSQL("select file,cvs,description,added from project_files where project='$pname' order by added desc");
while (my @result=FetchSQLData) {
my $date=OC::Time_To_Str($result[3],'nice');
my $description=${OC::Smart_Reformat(\$result[2])};
my $filename;
if ($result[1]) {
$result[0]=~s!/$!!g;
}
if (rindex($result[0],'/')$filename";
my @row=();
$description=' ' if ($description eq '');
push(@row,$date,$description,$link);
push(@table,\@row);
}
my $body=OC::Html_Table(\@table);
Append_Body('Downloads',$body,Block_Edit_Link($pname,$form{page},'files'));
}
sub Tmpl_Maintainers {
my ($pname)=@_;
my @username=();
SendSQL("select username from project_maintainers where project='$pname'");
while (my $user=FetchSQLData) {
push(@username,$user);
}
my $body='
';
foreach my $user (@username) {
SendSQL("select fullname from account where username='$user'");
my $fullname=FetchSQLData;
$fullname=ucfirst($user) if ($fullname eq '');
$body.="
";
Append_Body('Maintainers',$body,Block_Edit_Link($pname,$form{page},'maintainers'));
}
sub Tmpl_Block {
my ($pname,$block,$page)=@_;
SendSQL("select title,body from project_blocks where project='$pname' and block='$block'");
my ($title,$body)=FetchSQLData;
$title="$block" if($title eq '' && $CAN_EDIT);
$title=ucfirst($title);
$body=ucfirst($body);
$body=${OC::Smart_Reformat(\$body)};
Append_Body($title,$body,Block_Edit_Link($pname,$page,$block));
}
sub Tmpl_News {
my ($pname)=@_;
my @table=();
my @row=();
push(@row,'Date','News');
push(@table,\@row);
SendSQL("select news, added from project_news where project='$pname' order by added desc");
while (my ($news,$date)=FetchSQLData) {
$date=OC::Time_To_Str($date,'nice');
my @row=();
push(@row,$date,${OC::Smart_Reformat(\$news)});
push(@table,\@row);
}
Append_Body('Project news',OC::Html_Table(\@table),Block_Edit_Link($pname,$form{page},'news'));
}
sub Tmpl_Changes {
my ($pname)=@_;
my @table=();
my @row=();
push(@row,'Date','Changes');
push(@table,\@row);
SendSQL("select changes, added from project_changes where project='$pname'");
while (my ($changes,$date)=FetchSQLData) {
$date=OC::Time_To_Str($date,'nice');
my @row=();
push(@row,$date,${OC::Smart_Reformat(\$changes)});
push(@table,\@row);
}
Append_Body('Changes',OC::Html_Table(\@table),Block_Edit_Link($pname,$form{page},'changes'));
}
sub Tmpl_Links {
my ($pname,$page)=@_;
my %link=();
tie (%link,'Tie::IxHash');
@LINKS=();
SendSQL("select distinct(page) from project_pages where project='$pname' and visible=1 order by id");
while (my $result=FetchSQLData) {
$link{$result}=1;
}
if ($CAN_EDIT) {
my %row=();
$row{link}="$self_url/$pname/admin" unless($page eq 'admin');
$row{name}='Admin';
push(@LINKS,\%row);
}
foreach my $result (keys %link) {
my %row=();
my $url_result=$result;
$url_result=~s/ /%20/g;
$url_result=~s/&/%26/g;
$row{link}="$self_url/$pname/$url_result" if ($page ne $result);
$row{name}=ucfirst($result);
push(@LINKS,\%row);
}
}
sub Tmpl_Image {
my ($pname,$block,$title,$body)=@_;
if ($title) {
$title=" $title";
}
$BODY.="
$title
";
}
sub Tmpl_Comments {
my ($pname)=@_;
$BODY.="Comments";
$BODY.="
";
my @comment=();
SendSQL("select added,email,comment from project_comments where project='$pname' order by added desc");
while (my @result=FetchSQLData) {
my %row=();
$row{added}=OC::Time_To_Str($result[0],'nice');
$row{email}=$result[1];
$row{comment}=$result[2];
push(@comment,\%row);
}
if (scalar(@comment)) {
$BODY.="
";
$BODY.="
";
$BODY.="
Date/Author
Comment
";
my ($color2,$color1)=($CONFIG{color}{table2},$CONFIG{color}{table3});
foreach (@comment) {
($color1,$color2)=($color2,$color1);
my %row=%{$_};
my $email=OC::Store_Email($row{email});
$email="$row{email}";
$email=${OC::Filter_Emails(\$email)};
$BODY.="
";
}
sub Navigation {
my ($pname,$page,$block)=@_;
my $nav="Project";
if (defined $page) {
$nav.=" > Admin";
} else {
$nav.=" > Admin";
}
if (defined $page && !defined $block) {
$nav.=" > $page";
} elsif(defined $page && defined $block) {
my $link=$page;
$link=~s/ /%20/g;
$link=~s/&/%26/g;
$nav.=" > $page";
}
if (defined $block) {
$nav.=" > $block";
}
$nav.="
";
$NAVIGATION=$nav;
}
sub Admin_Screen {
my ($pname)=@_;
Navigation($pname);
Tmpl_Links($pname,'admin');
$TITLE="Edit project: $pname";
SendSQL("select count(page) from project_pages where project='$pname'");
my $size=FetchSQLData;
$size++;
SendSQL("select display_name,category,mailing_list,short_desc,stage,wbc,cvs_folder from project where name='$pname'");
my ($display_name,$category,$mailinglist,$short_desc,$stage,$wbc,$cvs_folder)=FetchSQLData;
$BODY.="
";
}
sub Display_Project {
my $pname=$_[0];
my $page=$form{page};
SendSQL("select count(page) from project_pages where project='$pname' and page='$page'");
unless (FetchSQLData) {
if (OC::File_Type("$CONFIG{cores_folder}/$pname/$form{page}")==$OC::_FILE) {
my $cat_result=OC::Cat_File("$CONFIG{cores_folder}/$pname/$form{page}");
if ($cat_result) {
$page='';
} else {
exit;
}
} else {
$page='';
}
}
unless ($page) {
SendSQL("select page from project_pages where project='$pname' and visible=1 order by id");
$page=FetchSQLData;
$PAGE=$page;
}
SendSQL("select project_page_block.block,
project_blocks.type,project_blocks.title, project_blocks.body
from project_page_block,project_blocks where project_page_block.project='$pname'
and project_page_block.page='$page' and project_blocks.project='$pname'
and project_page_block.block=project_blocks.block order by project_page_block.id");
my @blocks=();
while (my ($block,$type,$title,$body)=FetchSQLData) {
my %tmp=();
$tmp{block}=$block;
$tmp{type}=$type;
$tmp{title}=$title;
$tmp{body}=$body;
push(@blocks,\%tmp);
}
SendSQL("select name, category, display_name, mailing_list, cvs_folder, modified,
created, wbc, stage from project where name='$pname'");
my ($name, $category, $display_name, $mailing_list, $cvs_folder,
$modified, $created, $wbc, $stage)=FetchSQLData;
$template->param(page_title=>"project: $display_name");
$BODY.=OC::Title("Project: $display_name");
my $cat_display='';
SendSQL("select name,display_name from project where category='$category' and name<>'$pname'");
my %similar=();
while (my @result=FetchSQLData) {
$similar{$result[0]}=$result[1];
}
if (scalar(%similar)) {
my $table='';
$PANEL.="".OC::Truncate($cat_display,15)."";
foreach (keys %similar) {
$similar{$_}=OC::Truncate($similar{$_},15);
$PANEL.=OC::Li("$similar{$_} ");
}
}
Tmpl_Links($pname,$page);
foreach (@blocks) {
my %tmp=%{$_};
my $block=$tmp{block};
my $type=$tmp{type};
if ($type eq 'image') {
Tmpl_Image($pname,$block,$tmp{title},$tmp{body});
} elsif ($block eq 'details') {
$cat_display=Tmpl_Details($category,$modified,$created,$wbc,$stage,$mailing_list);
} elsif ($block eq 'files') {
Tmpl_Files($pname);
} elsif ($block eq 'maintainers') {
Tmpl_Maintainers($pname);
} elsif ($block eq 'news') {
Tmpl_News($pname);
} elsif ($block eq 'changes') {
Tmpl_Changes($pname);
} elsif ($block eq 'comments') {
Tmpl_Comments($pname);
} elsif ($block eq 'wishlist') {
Tmpl_Wishlist($pname,$page);
} else {
Tmpl_Block($pname,$block,$page);
}
push(@DISPLAYED,$block);
}
}
sub Delete_Page {
my ($pname,$page)=@_;
SendSQL("delete from project_pages where project='$pname' and page='$page'");
SendSQL("delete from project_page_block where project='$pname' and page='$page'");
Last_Updated($pname);
}
sub Create_Page {
my ($pname,$page)=@_;
if ($page eq '') {
Note("Error: invalid page name");
return;
}
SendSQL("select count(page) from project_pages where project='$pname' and page='$page'");
if (FetchSQLData()>0) {
Note("Error: page already exists!");
return;
}
PrepareSQL("insert into project_pages (project,page,visible) values (?,?,?)");
ExecuteSQL($pname,$page,0);
Last_Updated($pname);
}
sub Add_Block {
my ($pname,$page,$block)=@_;
SendSQL("select count(block) from project_page_block where project='$pname' and page='$page' and block='$block'");
unless (FetchSQLData) {
if ($block ne '') {
PrepareSQL("insert into project_page_block (project,page,block) values (?,?,?)");
ExecuteSQL($pname,$page,$block);
}
}
Last_Updated($pname);
}
sub Remove_Block {
my ($pname,$page,$block)=@_;
if ($block ne '') {
SendSQL("delete from project_page_block where project='$pname' and page='$page' and block='$block'");
}
Last_Updated($pname);
}
sub Get_Project_Blocks {
my ($pname)=@_;
my %block=();
tie (%block,'Tie::IxHash');
SendSQL("select block from project_blocks where project='$pname'");
while (my $block=FetchSQLData) {
$block{$block}='unused';
}
SendSQL("select block from project_page_block where project='$pname'");
while (my $block=FetchSQLData) {
$block{$block}='used';
}
return \%block;
}
sub Create_Block {
my ($pname,$block)=@_;
SendSQL("select count(block) from project_blocks where project='$pname' and block='$block'");
my $exists=FetchSQLData;
if ($pname ne '' && $block ne '' && !$exists) {
PrepareSQL("insert into project_blocks (project,block,title,deletable) values (?,?,?,?)");
ExecuteSQL($pname,$block,ucfirst($block),1);
} elsif ($exists) {
Note("Block already exists!");
} else {
Note("Invalid block name!");
}
Last_Updated($pname);
}
sub Upload_Image {
my ($pname)=@_;
SendSQL("select folder from project where name='$pname'");
my $project_folder=FetchSQLData();
if ($project_folder eq '') {
$project_folder=$CONFIG{cores_folder}."/".$pname;
}
$project_folder.='/' unless ($project_folder=~m/\/$/);
my $fh=$form{file};
my $new_filename=$fh;
$new_filename=substr($new_filename,rindex($new_filename,'\\')+1);
$new_filename=substr($new_filename,rindex($new_filename,'/')+1);
my $line;
if (defined $fh) {
if ($line=<$fh>) {
my $fexists=scalar(stat($project_folder.$new_filename));
if (open(FILE,">$project_folder$new_filename")) {
print FILE $line;
while ($line=<$fh>) {
print FILE $line;
}
close(FILE);
Note("Old file was owerwriten") if ($fexists);
my $url=$project_folder.$new_filename;
PrepareSQL("insert into project_blocks (project,block,title,body,type,deletable) values (?,?,?,?,?,?)");
ExecuteSQL($pname,"image $new_filename",$form{title},$url,"image",1);
} else {
Note("$project_folder$new_filename");
Note($!);
}
}
}
}
sub Delete_Block {
my ($pname,$block)=@_;
my %block=%{Get_Project_Blocks($pname)};
if ($block{$block} eq 'unused') {
SendSQL("select type,body from project_blocks where project='$pname' and block='$block'");
my @result=FetchSQLData;
if ($result[0] eq 'image') {
unlink($result[1]);
}
SendSQL("select count(block) from project_blocks where project='$pname' and block='$block' and deletable=1");
if (FetchSQLData) {
SendSQL("delete from project_blocks where project='$pname' and block='$block' and deletable=1");
} else {
Note("ERROR: this block is not deletable.");
}
} else {
Note("ERROR: cannot delete used block $block!");
}
Last_Updated($pname);
}
sub Edit_Page {
my ($pname,$page)=@_;
PrepareSQL("select count(page) from project_pages where project=? and page=?");
ExecuteSQL($pname,$page);
unless (FetchSQLData>0) {
Note("ERROR: invalid page '$page'!");
Admin_Screen($pname);
return;
}
Navigation($pname,$page);
my %block=%{Get_Project_Blocks($pname)};
my %this_page=();
tie (%this_page,'Tie::IxHash');
SendSQL("select block from project_page_block where project='$pname' and page='$page' order by id");
while (my $block=FetchSQLData) {
$this_page{$block}='1';
}
my $size=scalar(keys %block);
$size++;
$size=16 if ($size>16);
my @pages=();
SendSQL("select page from project_pages where project='$pname' order by id");
while (my $result=FetchSQLData) {
push(@pages,$result);
}
$BODY.="
";
}
sub Edit_Files {
my ($pname)=@_;
my @table=();
my @row=();
$row[0]="File";
$row[1]="Description";
$row[2]="Date";
$row[3]="Action";
push(@table,\@row);
SendSQL("select file,cvs,description,added,id from project_files where project='$pname' order by added desc");
while(my @result=FetchSQLData) {
my @row=();
$row[0]=$result[0];
$row[0]=~s!.*/([^/]+)!$1!g;
$row[1]=${OC::Smart_Reformat(\$result[2])};
$row[2]=OC::Time_To_Str($result[3],'nice');
$row[3]="Delete";
push(@table,\@row);
}
$BODY.="";
}
sub Delete_File {
my ($pname)=@_;
PrepareSQL("select file,cvs from project_files where project=? and id=?");
ExecuteSQL($pname,$form{delete_file});
my ($file,$cvs)=FetchSQLData;
SendSQL("delete from project_files where project=? and id=?");
ExecuteSQL($pname,$form{delete_file});
unless ($cvs) {
unlink($file);
}
Last_Updated($pname);
}
sub Add_Cvs_File {
my ($pname)=@_;
return if ($form{cvs_file} eq '');
my $cvs_file=$CONFIG{cvsroot}."/$form{cvs_file}";
$cvs_file=~s!/$!!g;
my $exists=0;
if (OC::File_Type($cvs_file)) {
$exists=1;
} elsif(OC::File_Type($cvs_file.",v")) {
# $form{cvs_file}.=",v";
$exists=1;
}
unless($exists) {
Note("File or folder doen't exist in CVS");
} else {
SendSQL("select count(file) from project_files where file='$form{cvs_file}' and project='$pname'");
if (FetchSQLData) {
Note("File already in the table!");
} else {
PrepareSQL("insert into project_files (project,username,file,cvs,description,added) values (?,?,?,?,?,?)");
ExecuteSQL($pname,$USERNAME,$form{cvs_file},1,$form{file_desc},time);
}
}
Last_Updated($pname);
}
sub Add_Uploaded_File {
my ($pname)=@_;
my $CURRENT_FOLDER="$CONFIG{cores_folder}/$pname/";
# $CURRENT_FOLDER.="/" unless ($CURRNET_FOLDER=~m!/$!);
mkdir($CURRENT_FOLDER,'493');
my $fh=$form{filename};
my $new_filename=$fh;
$new_filename=substr($new_filename,rindex($new_filename,'\\')+1);
$new_filename=substr($new_filename,rindex($new_filename,'/')+1);
my $line;
# if (!Valid_Path($CURRENT_FOLDER.$new_filename)) {
# Note("Invalid filename: $CURRENT_FOLDER$new_filename;
# File probably exists but you don't have access to it.");
# return;
# }
if (defined $fh) {
if ($line=<$fh>) {
my $fexists=scalar(stat($CURRENT_FOLDER.$new_filename));
if (open(FILE,">$CURRENT_FOLDER$new_filename")) {
print FILE $line;
while ($line=<$fh>) {
print FILE $line;
}
close(FILE);
PrepareSQL("insert into project_files (project,username,file,cvs,description,added) values (?,?,?,?,?,?)");
ExecuteSQL($pname,$USERNAME,$CURRENT_FOLDER.$new_filename,0,$form{file_desc},time);
Note("Old file was owerwriten") if ($fexists);
if ($fexists) {
# Log("Owerwriten: $CURRENT_FOLDER$new_filename");
} else {
# Log("$CURRENT_FOLDER$new_filename");
}
} else {
Note("Error: $!");
# Log("Error: $!");
}
}
}
$form{filename}=$CURRENT_FOLDER.$new_filename;
Last_Updated($pname);
}
sub Add_Changes {
my ($pname,$changes)=@_;
if ($pname && $changes) {
PrepareSQL("insert into project_changes (project,changes,added) values (?,?,?)");
ExecuteSQL($pname,$changes,time);
}
Last_Updated($pname);
}
sub Delete_Changes {
my ($pname,$id)=@_;
if ($pname && $id) {
SendSQL("delete from project_changes where project='$pname' and id='$id'");
}
Last_Updated($pname);
}
sub Edit_Changes {
my ($pname,$page)=@_;
my @table=();
my @row=();
$row[0]='Date';
$row[1]='Changes';
$row[2]='Action';
push(@table,\@row);
SendSQL("select added,changes,id from project_changes where project='$pname' order by added desc");
while(my @result=FetchSQLData) {
my @row=();
$row[0]=OC::Time_To_Str($result[0],'nice');
$row[1]=${OC::Smart_Reformat(\$result[1])};
$row[2]="Delete";
push(@table,\@row);
}
$BODY.="";
}
sub Edit_Maintainers {
my ($pname)=@_;
my @maintainers=();
my @table=();
my @row=();
$row[0]='Username';
$row[1]='Action';
push(@table,\@row);
SendSQL("select username from project_maintainers where project='$pname'");
while (my $result=FetchSQLData) {
my @row=();
$row[0]=$result;
$row[1]="Delete";
push(@table,\@row);
}
$BODY.="
";
}
sub Add_Maintainer {
my ($pname,$maintainer)=@_;
SendSQL("select count(username) from account where username='$maintainer'");
if (scalar (FetchSQLData)>0) {
SendSQL("select count(username) from project_maintainers where project='$pname' and username='$maintainer'");
if (FetchSQLData==0) {
PrepareSQL("insert into project_maintainers (project,username) values(?,?)");
ExecuteSQL($pname,$maintainer);
}
}
Last_Updated($pname);
}
sub Delete_Maintainer {
my ($pname,$maintainer)=@_;
if ($maintainer ne '') {
SendSQL("delete from project_maintainers where project='$pname' and username='$maintainer'");
}
Last_Updated($pname);
}
sub Save_Block {
my ($pname,$block)=@_;
if ($block) {
PrepareSQL("update project_blocks set title=?, body=? where project=? and block=?");
ExecuteSQL($form{title},$form{body},$pname,$block);
}
Last_Updated($pname);
}
sub Justify_Block {
my ($pname,$block)=@_;
my $body=$form{body};
$body=~s/([^\n^\r]+)\r?\n +([^-]{1})/$1 $2/sg;
$body=~s/(\r?\n) +([^ ^\n^\r]{1})/$1$2/sg;
if ($block) {
PrepareSQL("update project_blocks set title=?, body=? where project=? and block=?");
ExecuteSQL($form{title},$body,$pname,$block);
}
Last_Updated($pname);
}
sub Edit_Block {
my ($pname,$block)=@_;
unless ($block) {
Edit_Page($pname,$form{page});
return;
}
unless ($block eq 'details') {
Navigation($pname,$form{page},$block);
}
if ($block eq 'details') {
Note("Error: block '$block' is not editable!");
if ($form{page}) {
Edit_Page($pname,$form{page});
} else {
Admin_Screen($pname);
}
return;
} elsif ($block eq 'comments') {
Note("Error: block '$block' is not editable!");
if ($form{page}) {
Edit_Page($pname,$form{page});
} else {
Admin_Screen($pname);
}
return;
} elsif ($block eq 'wishlist') {
Note("Error: block '$block' is not editable!");
if ($form{page}) {
Edit_Page($pname,$form{page});
} else {
Admin_Screen($pname);
}
return;
} elsif ($block eq 'news') {
Edit_News($pname);
return;
} elsif ($block eq 'changes') {
Edit_Changes($pname,$form{page});
return;
} elsif ($block eq 'maintainers') {
Edit_Maintainers($pname);
return;
} elsif ($block eq 'files') {
Edit_Files($pname);
return;
}
SendSQL("select title,body from project_blocks where project='$pname' and block='$block'");
my ($title,$body)=FetchSQLData();
$BODY.="";
}
sub Move_Page {
my ($pname,$page,$desc)=@_;
my $prev;
my $id;
my $move_to;
SendSQL("select id,page from project_pages where project='$pname' order by id $desc");
while (my @result=FetchSQLData) {
if ($page eq $result[1]) {
$id=$result[0];
$move_to=$prev;
last;
}
$prev=$result[0];
}
if ($id && $move_to && $id!=$move_to) {
SendSQL("select max(id) from project_pages");
my $tmp_id=FetchSQLData;
$tmp_id++;
SendSQL("update project_pages set id=$tmp_id where id=$move_to");
SendSQL("update project_pages set id=$move_to where id=$id");
SendSQL("update project_pages set id=$id where id=$tmp_id");
}
Tmpl_Links($pname,'admin');
}
sub Move_Block {
my ($pname,$page,$block,$desc)=@_;
my $prev;
my $id;
my $move_to;
SendSQL("select id,block from project_page_block where project='$pname' and page='$page' order by id $desc");
while (my @result=FetchSQLData) {
if ($block eq $result[1]) {
$id=$result[0];
$move_to=$prev;
last;
}
$prev=$result[0];
}
if ($id && $move_to && $id!=$move_to) {
SendSQL("select max(id) from project_page_block");
my $tmp_id=FetchSQLData;
$tmp_id++;
SendSQL("update project_page_block set id=$tmp_id where id=$move_to");
SendSQL("update project_page_block set id=$move_to where id=$id");
SendSQL("update project_page_block set id=$id where id=$tmp_id");
}
}
sub Set_Visible {
my ($pname,$page,$visible)=@_;
if ($pname && $page && $visible ne '') {
SendSQL("update project_pages set visible=$visible where project='$pname' && page='$page'");
}
Tmpl_Links($pname,'admin');
Last_Updated($pname);
}
sub Admin {
$template->param(no_panel=>1);
my ($pname)=@_;
Tmpl_Links($pname,'admin');
$TITLE="Edit project: $pname";
if ($form{delete_page}) {
Delete_Page($pname,$form{page});
Admin_Screen($pname);
} elsif ($form{create_page}) {
Create_Page($pname,$form{newpage});
Admin_Screen($pname);
} elsif ($form{edit_page}) {
Edit_Page($pname,$form{page});
} elsif ($form{add_block}) {
Add_Block($pname,$form{page},$form{unused_block});
Edit_Page($pname,$form{page});
} elsif ($form{remove_block}) {
Remove_Block($pname,$form{page},$form{used_block});
Edit_Page($pname,$form{page});
} elsif ($form{save_properties}) {
Save_Properties($pname);
Admin_Screen($pname);
} elsif ($form{create_block}) {
Create_Block($pname,$form{new_block});
Edit_Page($pname,$form{page});
} elsif ($form{upload_image}) {
Upload_Image($pname);
Edit_Page($pname,$form{page});
} elsif ($form{edit_used_block}) {
Edit_Block($pname,$form{used_block});
} elsif ($form{edit_unused_block}) {
Edit_Block($pname,$form{unused_block});
} elsif ($form{delete_block}) {
Delete_Block($pname,$form{unused_block});
Edit_Page($pname,$form{page});
} elsif ($form{move_page_up}) {
Move_Page($pname,$form{page});
Admin_Screen($pname);
} elsif ($form{move_page_down}) {
Move_Page($pname,$form{page},'desc');
Admin_Screen($pname);
} elsif ($form{move_block_up}) {
Move_Block($pname,$form{page},$form{used_block});
Edit_Page($pname,$form{page});
} elsif ($form{move_block_down}) {
Move_Block($pname,$form{page},$form{used_block},'desc');
Edit_Page($pname,$form{page});
} elsif ($form{set_visible}) {
Set_Visible($pname,$form{page},$form{visible});
Edit_Page($pname,$form{page});
} elsif ($form{add_news}) {
Add_News($pname,$form{new_news});
Edit_Block($pname,'news');
} elsif ($form{delete_news}) {
Delete_News($pname,$form{id});
Edit_Block($pname,'news');
} elsif ($form{add_changes}) {
Add_Changes($pname,$form{new_changes});
Edit_Block($pname,'changes');
} elsif ($form{delete_changes}) {
Delete_Changes($pname,$form{id});
Edit_Block($pname,'changes');
} elsif ($form{delete_maintainer}) {
Delete_Maintainer($pname,$form{delete_maintainer});
Edit_Block($pname,'maintainers');
} elsif ($form{add_maintainer}) {
Add_Maintainer($pname,$form{maintainer});
Edit_Block($pname,'maintainers');
} elsif ($form{save_block}) {
Save_Block($pname,$form{block});
Edit_Block($pname,$form{block});
} elsif ($form{justify_block}) {
Justify_Block($pname,$form{block});
Edit_Block($pname,$form{block});
} elsif ($form{add_cvs_file}) {
Add_Cvs_File($pname);
Edit_Block($pname,'files');
} elsif ($form{add_uploaded_file}) {
Add_Uploaded_File($pname);
Edit_Block($pname,'files');
} elsif ($form{delete_file}) {
Delete_File($pname);
Edit_Block($pname,'files');
} else {
Admin_Screen($pname);
}
$BODY=$NAVIGATION.Output_Notes.$BODY;
}
sub Display_All_Groups {
$template->param(page_title=>'projects by category');
$TITLE='Projects';
$BODY.="
We use a few icons to help identify projects:
Indicates new project, that has been added in the last 30 days.
Indicates project that is ready to use
Indicates a WISHBONE Compliant Core
";
$BODY.="Click on category to see only its projects
";
my %group=();
tie (%group,'Tie::IxHash');
SendSQL("select name,display_name,description from project_category order by display_name");
while (my @result=FetchSQLData) {
$group{$result[0]}{display_name}=$result[1];
}
my $gcount=scalar(keys %group) /2 ;
$BODY.="
";
my $gcount=scalar(keys %group) /2 ;
my $cnt=0;
foreach my $category(keys %group) {
$cnt++;
$BODY.="$group{$category}{display_name}
";
SendSQL("select name,display_name,created,wbc,stage from project where category='$category' and hidden<1 order by display_name");
while (my @result=FetchSQLData) {
my ($done,$wbc,$new);
if ($result[4] eq 'development4' || $result[4] eq 'development5') {
$done="";
}
if ($result[3] ==1) {
$wbc="";
}
if ((time-$result[2])<3600*24*30) {
$new='';
}
if (length($result[1])>44) {
$result[1]=substr($result[1],0,40).'...';
}
$BODY.="$result[1]$done$wbc$new ";
}
$BODY.="
";
if ($cnt>$gcount) {
$BODY.="
";
$gcount=$gcount*3;
}
}
$BODY.="
";
$PANEL.=Right_Table('browse_projects');
}
sub Display_Group {
my %editable=();
if (LOGGED_IN) {
SendSQL("select project from project_maintainers where username='$USERNAME'");
while(my $result=FetchSQLData) {
$editable{$result}=1;
}
}
SendSQL("select name,display_name,description from project_category where name='$form{category}'");
my ($group_name,$group_display_name,$group_description)=FetchSQLData;
$TITLE="Category: $group_display_name";
# $BODY.="
$group_description
";
SendSQL("select name,display_name,short_desc,created,wbc,stage from project where category='$form{category}' and hidden<1 order by display_name");
while(my @result=FetchSQLData) {
my $edit_link="";
if ($editable{$result[0]}==1) {
$edit_link="";
}
my ($done,$wbc,$new);
if ($result[5] eq 'development4' || $result[4] eq 'development5') {
$done="";
}
if ($result[4] ==1) {
$wbc="";
}
if ((time-$result[3])<30) {
$new='';
}
$BODY.="$result[1]$done$wbc$new $edit_link
$result[2]
";
}
# $BODY.="
".Right_Table('browse_projects')."
";
$PANEL.=Right_Table('browse_projects');
}
sub Browse_Projects {
if ($AC_TYPE eq 'admin') {
my %row=();
$row{name}='Project queue';
$row{link}="$self_url?queue=show";
push(@LINKS,\%row);
}
# if ($LOGGED_IN) {
# my %row=();
# $row{name}='Start new project';
# $row{link}="$self_url?request=form";
# push(@LINKS,\%row);
# }
if (exists $form{category}) {
SendSQL("select count(name) from project_category where name='$form{category}'");
if (FetchSQLData>0) {
Display_Group();
} else {
Display_All_Groups();
}
} else {
Display_All_Groups();
}
}
sub Request_Form {
my %cat=();
SendSQL("select name,display_name from project_category");
while (my @result=FetchSQLData) {
$cat{$result[0]}=$result[1];
}
$TITLE='Start new project';
if (!$LOGGED_IN) {
$BODY.="You must be logged in to submit new project! Cleck
here to login or
here to get account.";
} elsif ($AC_TYPE ne 'project' && $AC_TYPE ne 'admin') {
$BODY.="Your account type is not project maintainer!";
} else {
$BODY.=Output_Notes;
$BODY.="Fill this form to submit new project. If you would like to join an existing one then
you should contact project maintaners.