Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
7883d25
a rudimentary wiki system for breedbase.
lukasmueller Feb 3, 2026
63c75c1
Adding ability to delete a page; add page that shows all the currentl…
lukasmueller Feb 5, 2026
02a8f0b
add a test.
lukasmueller Feb 6, 2026
b7fbaa9
add a page that lists all wiki pages.
lukasmueller Feb 11, 2026
b13c1b3
add working test with some refactoring.
lukasmueller Feb 11, 2026
abea24e
update object state after new page creation.
lukasmueller Feb 11, 2026
1bf0850
fix test and tweak object state for Wiki object.
lukasmueller Feb 11, 2026
640af16
remove special handling of WikiHome page.
lukasmueller Feb 12, 2026
0045c2c
add some debug info to STDERR
lukasmueller Feb 12, 2026
73696c4
remove debug alerts; tweak textarea size
lukasmueller Feb 12, 2026
991906b
add selenium test for the wiki.
lukasmueller Feb 12, 2026
98aa7b5
add db patch for wiki.
lukasmueller Feb 12, 2026
cd5f25d
report errors from deletion using alert.
lukasmueller Feb 12, 2026
ba00d7b
let only curators create pages for now.
lukasmueller Feb 12, 2026
9514448
comment out unused function.
lukasmueller Feb 12, 2026
3b604da
improve error handling.
lukasmueller Feb 12, 2026
aa14f4d
replace return undef; with return; to make linter happy.
lukasmueller Feb 17, 2026
ede09be
grant permissions to web_usr for new wiki tables.
lukasmueller Feb 17, 2026
20c41c7
present an empty textarea when a new wiki page is created.
lukasmueller Feb 18, 2026
bc8ca5d
fix issues with ownership. Names of pages are converted to wiki forma…
lukasmueller Feb 18, 2026
a44c2dc
fix some issues with ownership and converted wiki names.
lukasmueller Feb 18, 2026
dcd8eb6
remove stray alert that interferes with selenium test.
lukasmueller Feb 18, 2026
ea06437
also remove special characters from the wiki page names.
lukasmueller Feb 18, 2026
b38b27c
keep track of page name using page name div.
lukasmueller Feb 18, 2026
9bd3a1e
fix an issue with page deletion. Delete the correct page.
lukasmueller Feb 18, 2026
c7110c0
disable buttons when login is not a curator.
lukasmueller Feb 19, 2026
4268df9
fix an issue with deletion and tweak the way code is called.
lukasmueller Feb 19, 2026
36b850e
check for wiki page names of zero length or only consisting of specia…
lukasmueller Feb 19, 2026
edc5af6
fix origin of page name div so that the correct page gets deleted.
lukasmueller Feb 19, 2026
055a53a
expand test by creating another new page, then deleting both new pages.
lukasmueller Feb 19, 2026
b6d4028
try to turn off css linting.
lukasmueller Feb 20, 2026
ac644ff
fix indent
lukasmueller Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ jobs:
VALIDATE_CHECKOV: false
VALIDATE_JSCPD: false
VALIDATE_LATEX: false
VALIDATE_CSS: false
FIX_YAML_PRETTIER: true
VALIDATE_JAVASCRIPT_PRETTIER: false
VALIDATE_JAVASCRIPT_STANDARD: false
Expand Down
80 changes: 80 additions & 0 deletions db/00201/AddWikiTable.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env perl


=head1 NAME

AddWikiTable.pm

=head1 SYNOPSIS

mx-run AddWikiTable [options] -H hostname -D dbname -u username [-F]

this is a subclass of L<CXGN::Metadata::Dbpatch>
see the perldoc of parent class for more details.

=head1 DESCRIPTION

This is a test dummy patch.
This subclass uses L<Moose>. The parent class uses L<MooseX::Runnable>

=head1 AUTHOR

Naama Menda<nm249@cornell.edu>

=head1 COPYRIGHT & LICENSE

Copyright 2010 Boyce Thompson Institute for Plant Research

This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut


package AddWikiTable;

use Moose;
extends 'CXGN::Metadata::Dbpatch';


has '+description' => ( default => <<'' );
Description of this patch goes here

has '+prereq' => (
default => sub {
[],
},
);

sub patch {
my $self=shift;

print STDOUT "Executing the patch:\n " . $self->name . ".\n\nDescription:\n ". $self->description . ".\n\nExecuted by:\n " . $self->username . " .";

print STDOUT "\nChecking if this db_patch was executed before or if previous db_patches have been executed.\n";

print STDOUT "\nExecuting the SQL commands.\n";

$self->dbh->do(<<EOSQL);
--do your SQL here
--
CREATE TABLE sgn_people.sp_wiki (sp_wiki_id serial primary key, page_name varchar(255) unique, sp_person_id bigint references sgn_people.sp_person not null, is_public boolean default false, create_date timestamp without time zone default now());

CREATE TABLE sgn_people.sp_wiki_content (sp_wiki_content_id serial primary key, sp_wiki_id bigint references sgn_people.sp_wiki on delete cascade, page_content text, page_version bigint, create_date timestamp without time zone default now());


grant select,insert,delete on table sgn_people.sp_wiki to web_usr;
grant usage on sgn_people.sp_wiki_sp_wiki_id_seq to web_usr;

grant select,insert,delete on table sgn_people.sp_wiki_content to web_usr;
grant usage on sgn_people.sp_wiki_content_sp_wiki_content_id_seq to web_usr;

EOSQL

print "You're done!\n";
}


####
1; #
####
258 changes: 258 additions & 0 deletions lib/CXGN/People/Wiki.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@

package CXGN::People::Wiki;

use Moose;

use Data::Dumper;
use CXGN::People::Schema;

has people_schema => (isa => 'Ref', is => 'rw');

has page_name => ( isa => 'Str',
is => 'rw');

has page_content => ( isa => 'Str',
is => 'rw');

has page_version => ( isa => 'Maybe[Int]',
is => 'rw');

has sp_person_id => ( isa => 'Int',
is => 'rw');

has sp_wiki_id => (isa => 'Int',
is => 'rw');

has create_date => (isa => 'Str',
is => 'rw');


sub BUILD {
my $self = shift;

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $self->page_name } );

if ($row) {
$self->sp_person_id($row->sp_person_id());
$self->create_date($row->create_date());
$self->sp_wiki_id($row->sp_wiki_id());
$self->page_version($self->get_version());
}

}


sub new_page {
my $self = shift;
my $page_name = shift || $self->page_name();
my $sp_person_id = shift || $self->sp_person_id();

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $page_name } );

if ($row) {
die "Page named $page_name already exists!\n";
}
elsif (! $sp_person_id) {
die "The sp_person_id parameter is required!";
}
else {
my $new_data = {
page_name => $page_name,
sp_person_id => $sp_person_id,

};

my $new_row = $self->people_schema()->resultset("SpWiki")->create($new_data);

return $new_row->sp_wiki_id();

}

}

sub retrieve_page {
my $self = shift;
my $page_name = shift;

print STDERR "RETRIEVING WIKI PAGE NAMED $page_name\n";

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $page_name });

# if (! $row && ($page_name eq "" || $page_name eq "WikiHome" )) {

# print STDERR "NO PAGE EXISTS... RETURNING GREETING\n";
# return {
# page_content => "WELCOME TO THE WIKI!",
# page_version => 0,
# };

# }

if (! $row) {
print STDERR "PAGE DOES NOT EXIST!\n";
die "The page with name $page_name does not exist!";
}

else {
my $sp_wiki_id = $row->sp_wiki_id();

print STDERR "RETRIEVING PAGE $page_name WITH sp_wiki_id $sp_wiki_id\n";
my $content_rs = $self->people_schema()->resultset("SpWikiContent")->search( { sp_wiki_id => $sp_wiki_id }, { order_by => { -desc => 'page_version' } } );

my $content_row;
if ($content_rs->count() > 0) {
$content_row = $content_rs->next();

$self->page_name($page_name);
$self->page_version($content_row->page_version());
$self->page_content($content_row->page_content());
$self->sp_person_id($row->sp_person_id());

return {
page_content => $content_row->page_content(),
page_version => $content_row->page_version(),
sp_person_id => $row->sp_person_id(),
};
}

else {
return;
}
}

}


sub store_page {
my $self = shift;
my $page_name = shift || $self->page_name() || 'WikiHome';
my $content = shift || $self->page_content();
my $sp_person_id = shift || $self->sp_person_id();

print STDERR "STORE_PAGE: $page_name, $content\n";

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $page_name });

# if (! $row && $page_name eq 'WikiHome') {
# $row = $self->people_schema()->resultset("SpWiki")->create(
# {
# sp_person_id => $sp_person_id,
# page_name => "WikiHome",
# });

# $row->insert();

# }
if (! $row) {
print STDERR "THE WIKI PAGE DOES NOT EXIST ($page_name)\n";
die "The page with page name $page_name does not exist!";
}

my $sp_wiki_id = $row->sp_wiki_id();

# figure out previous version, if any
#
my $current_version = 0;

my $previous_content_rs = $self->people_schema()->resultset("SpWikiContent")->search( { sp_wiki_id => $sp_wiki_id }, { order_by => { -desc => 'page_version' } } );

my $previous_content_row;

print STDERR "FINDING CURRENT VERSION...\n";

if ($previous_content_rs->count() > 0) {
print STDERR "WE HAVE PREVIOUS DATA...\n";
$previous_content_row = $previous_content_rs->next();
if ($previous_content_row->page_content() eq $content) {
return { error => "The new content is identical to the content of the page already exists!" };
}

if ($previous_content_row) {
print STDERR "WE HAVE A ROW...\n";
$current_version = $previous_content_row->page_version();
}
}

print STDERR "CURRENT VERSION: $current_version\n";

my $new_version = $current_version + 1;

print STDERR "NEW VERSION : $new_version\n";
my $wiki_content = {
page_content => $content,
page_version => $new_version,
sp_wiki_id => $sp_wiki_id,
};

my $new_row;
eval {
print STDERR "STORING PAGE DATA... $content\n";
$new_row = $self->people_schema()->resultset("SpWikiContent")->create($wiki_content);
$new_row->insert();
};
if ($@) {
print STDERR "An error occurred storing content. $@\n";
return { error => $@ };
}

$self->page_content($content);
$self->page_version($new_version);

return {
page_version => $new_row->page_version(),
wiki_content_id => $new_row->sp_wiki_content_id()
};
}

sub delete {
my $self = shift;
my $page_name = shift || $self->page_name();

print STDERR "DELETING PAGE $page_name\n";

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $page_name });

$row->delete();
}


sub get_version {
my $self =shift;
my $page_name = shift || $self->page_name();

my $row = $self->people_schema()->resultset("SpWiki")->find( { page_name => $page_name });

my $page_version;

if (! $row) {
return 0;
}

my $version_rs = $self->people_schema()->resultset("SpWikiContent")->search( { sp_wiki_id => $row->sp_wiki_id() }, { order_by => { -desc => 'page_version' } } );

if ($version_rs->count() > 0) {
my $version_row = $version_rs->next();
$page_version = $version_row->page_version();
}

return $page_version;
}


sub all_pages {
my $self = shift;

my $rs = $self->people_schema()->resultset("SpWiki")->search();

my @pages;
while (my $row = $rs->next()) {
push @pages, $row->page_name();
}

@pages = sort(@pages);

print STDERR "PAGES ".Dumper(\@pages);
return @pages;
}

1;
Loading