diff --git a/docs/upgrades/templates-7.3.0/default-wiki-page.tmpl b/docs/upgrades/templates-7.3.0/default-wiki-page.tmpl index a450a57b5..b4e9015b1 100644 --- a/docs/upgrades/templates-7.3.0/default-wiki-page.tmpl +++ b/docs/upgrades/templates-7.3.0/default-wiki-page.tmpl @@ -10,21 +10,19 @@
- - - diff --git a/docs/upgrades/upgrade_7.2.3-7.3.0.pl b/docs/upgrades/upgrade_7.2.3-7.3.0.pl index 256aba9cf..febdf3d11 100644 --- a/docs/upgrades/upgrade_7.2.3-7.3.0.pl +++ b/docs/upgrades/upgrade_7.2.3-7.3.0.pl @@ -56,8 +56,8 @@ sub addWikiAssets { CREATE TABLE `WikiMaster` ( `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL, `revisionDate` bigint(20) NOT NULL, - `groupToEditPages` varchar(22) character set utf8 collate utf8_bin NOT NULL, - `groupToAdminister` varchar(22) character set utf8 collate utf8_bin NOT NULL, + `groupToEditPages` varchar(22) character set utf8 collate utf8_bin NOT NULL default '2', + `groupToAdminister` varchar(22) character set utf8 collate utf8_bin NOT NULL default '3', `richEditor` varchar(22) character set utf8 collate utf8_bin NOT NULL default 'PBrichedit000000000002', `frontPageTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL diff --git a/lib/WebGUI/Asset/WikiPage.pm b/lib/WebGUI/Asset/WikiPage.pm index 3e24a7566..e0aa14abc 100644 --- a/lib/WebGUI/Asset/WikiPage.pm +++ b/lib/WebGUI/Asset/WikiPage.pm @@ -60,34 +60,13 @@ sub canAdd { $class->SUPER::canAdd($session, undef, '7'); } -#------------------------------------------------------------------- -sub canDelete { - my $self = shift; - my $userId = shift || $self->session->user->userId; - return $self->getWiki->canAdminister($userId); -} - #------------------------------------------------------------------- sub canEdit { my $self = shift; - my $userId = shift || $self->session->user->userId; - return 0 if $self->isProtected and not $self->getWiki->canAdminister($userId); - return $self->couldEdit($userId); -} - -#------------------------------------------------------------------- -sub canProtect { - my $self = shift; - my $userId = shift || $self->session->user->userId; - return $self->getWiki->canAdminister($userId); -} - -#------------------------------------------------------------------- -sub couldEdit { - my $self = shift; - my $userId = shift || $self->session->user->userId; - return 0 unless $self->getWiki->canEditPages($userId); - return 1; + my $form = $self->session->form; + return (($form->process("func") eq "add" || ($form->process("assetId") eq "new" && $form->process("func") eq "editSave" && $form->process("class","className") eq "WebGUI::Asset::WikiPage")) && $self->getWiki->canEditPages) # account for new pages + || (!$self->isProtected && $self->getWiki->canEditPages) # account for normal editing + || $self->getWiki->canAdminister; # account for admins } #------------------------------------------------------------------- @@ -163,7 +142,7 @@ sub getEditForm { title=> $i18n->get("editing")." ".(defined($self->get('title'))? $self->get('title') : $i18n->get("assetName")), formHeader => WebGUI::Form::formHeader($session, { action => $url}) .WebGUI::Form::hidden($session, { name => 'func', value => 'editSave' }) - .WebGUI::Form::hidden($session, { name=>"proceed", value=>$form->process("proceed") }), + .WebGUI::Form::hidden($session, { name=>"proceed", value=>"showConfirmation" }), formTitle => WebGUI::Form::text($session, { name => 'title', maxlength => 255, size => 40, value => $self->get('title') }), formContent => WebGUI::Form::HTMLArea($session, { name => 'content', richEditId => $wiki->get('richEditor'), value => $self->get('content') }), formSubmit => WebGUI::Form::submit($session, { value => 'Save' }), @@ -310,7 +289,7 @@ sub view { mostPopularLabel=>$i18n->get("mostPopularLabel", "Asset_WikiMaster"), wikiHomeUrl=>$self->getParent->getUrl, historyUrl=>$self->getUrl("func=getHistory"), - editUrl=>$self->getUrl("func=edit;ajax=1"), + editContent=>$self->getEditForm, content => $self->getWiki->autolinkHtml($self->get('content')), }; return $self->processTemplate($var, $self->getWiki->get("pageTemplateId")); @@ -319,27 +298,23 @@ sub view { #------------------------------------------------------------------- sub www_delete { my $self = shift; - return $self->session->privilege->insufficient unless $self->canDelete; + return $self->session->privilege->insufficient unless $self->canAdminister; $self->trash; $self->session->asset($self->getParent); return $self->getParent->www_view; } #------------------------------------------------------------------- -# here to keep backward compatibility with traditional editing sub www_edit { my $self = shift; return $self->session->privilege->insufficient unless $self->canEdit; - if ($self->session->form->param("ajax")) { - $self->session->style->sent(1); - return $self->getEditForm; - } return $self->getWiki->processStyle($self->getEditForm); } #------------------------------------------------------------------- sub www_getHistory { my $self = shift; + return $self->session->privilege->insufficient unless $self->canEdit; my $var = {}; my ($icon, $date) = $self->session->quick(qw(icon datetime)); foreach my $revision (@{$self->getRevisions}) { diff --git a/lib/WebGUI/Asset/Wobject/WikiMaster.pm b/lib/WebGUI/Asset/Wobject/WikiMaster.pm index 2425e3a32..204bdc958 100644 --- a/lib/WebGUI/Asset/Wobject/WikiMaster.pm +++ b/lib/WebGUI/Asset/Wobject/WikiMaster.pm @@ -18,196 +18,6 @@ use WebGUI::Utility; use HTML::Parser; use URI::Escape; -#------------------------------------------------------------------- -sub _appendFuncTemplateVars { - my $self = shift; - my $var = shift; - my @funcs = @_; - my $i18n = WebGUI::International->new($self->session, 'Asset_WikiMaster'); - my %specialFuncs = - (addPage => 'func=add;class=WebGUI::Asset::WikiPage'); - - foreach my $func (@funcs) { - $var->{$func.'Url'} = $self->getUrl($specialFuncs{$func} || "func=$func"); - $var->{$func.'Text'} = $i18n->get("func $func link text"); - } -} - -#------------------------------------------------------------------- -sub _appendRecentChangesVars { - my $self = shift; - my $var = shift; - my $limit = shift; - my $time = $self->session->datetime->time; - my $entries = $self->_templateSubvarsRefOfEdits($self->_editsRefOfRecentChanges($limit), $time); - my $days = $self->_daysRefOfTemplateSubvars($entries); - - $var->{'recentChangesEntries'} = $entries; - $var->{'recentChangesDays'} = $days; - return $self; -} - -#------------------------------------------------------------------- -sub _appendSearchBoxVars { - my $self = shift; - my $var = shift; - my $queryText = shift; - my $submitText = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('searchLabel'); - $var->{'searchFormHeader'} = join '', - (WebGUI::Form::formHeader($self->session, { action => $self->getUrl}), - WebGUI::Form::hidden($self->session, { name => 'func', value => 'search' })); - $var->{'searchQuery'} = WebGUI::Form::text($self->session, { name => 'query', value => $queryText }); - $var->{'searchSubmit'} = WebGUI::Form::submit($self->session, { value => $submitText }); - $var->{'searchFormFooter'} = WebGUI::Form::formFooter($self->session); - return $self; -} - -#------------------------------------------------------------------- -sub _appendVarsOfDate { - my $self = shift; - my $var = shift; - my $date = shift; - my $prefix = shift; - my $relativeTo = shift; - my $dt = $self->session->datetime; - - $var->{$prefix . (length($prefix)? 'Date':'date')} = $dt->epochToHuman($date, '%z'); - $var->{$prefix . (length($prefix)? 'Time':'time')} = $dt->epochToHuman($date, '%Z'); - if (defined $relativeTo) { - my $ago = WebGUI::International->new($self->session, 'Asset')->get('ago'); - $var->{$prefix . (length($prefix)? 'Interval':'interval')} = sprintf '%s %s %s', - ($dt->secondsToInterval($relativeTo - $date), $ago); - } - - return $self; -} - -#------------------------------------------------------------------- -sub _daysRefOfTemplateSubvars { - my $self = shift; - my $subvars = shift; - my @days = (); - - foreach my $subvar (@$subvars) { - if (!@days or $subvar->{date} ne $days[-1][0]{date}) { - push @days, [$subvar]; - } else { - push @{$days[-1]}, $subvar; - } - } - - return [map { {'dayDate' => $$_[0]{date}, 'dayEntries' => $_} } @days]; -} - -#------------------------------------------------------------------- -sub _editsRefOfQuery { - my $self = shift; - my $queryPiece = shift || 'true'; - my $placeholders = shift || []; - my $allowedActions = shift || [qw/edited trashed protected unprotected/]; - my $allowedActionsPredicate = "IN (".join(', ', ('?') x @$allowedActions).")"; - my $limit = shift; - my $limitClause = $limit? sprintf("LIMIT %d,%d", @$limit[0..1]) : ""; - - # Ick. Apparently assetHistory.dateStamp isn't always equivalent to assetData.revisionDate. - # It looks like the relationship between them is in fact semi-arbitrary. Then there's also that - # it doesn't seem to be safe to add extra possible values to assetHistory. So we have to do this. - # Bleagh. - $self->session->db->buildArrayRefOfHashRefs(<<"EOT", [(@$placeholders, @$allowedActions) x 3]); -SELECT h.userId AS userId, u.username AS username, h.dateStamp AS dateStamp, - h.actionTaken AS action, CONCAT('/', d.url) AS url, d.title AS title, a.assetId AS assetId - FROM assetHistory AS h LEFT JOIN users AS u ON h.userId = u.userId - INNER JOIN asset AS a ON h.assetId = a.assetId - INNER JOIN assetData AS d ON a.assetId = d.assetId AND h.dateStamp = d.revisionDate - WHERE $queryPiece AND h.actionTaken $allowedActionsPredicate - UNION -SELECT eh.userId AS userId, u.username AS username, eh.dateStamp AS dateStamp, - eh.actionTaken AS action, CONCAT('/', eh.url) AS url, eh.title AS title, a.assetId AS assetId - FROM WikiPage_extraHistory AS eh LEFT JOIN users AS u ON eh.userId = u.userId - INNER JOIN asset AS a ON eh.assetId = a.assetId - WHERE $queryPiece AND eh.actionTaken $allowedActionsPredicate - UNION -SELECT d.revisedBy AS userId, u.username AS username, d.revisionDate AS dateStamp, - 'edited' AS action, CONCAT('/', d.url) AS url, d.title AS title, a.assetId AS assetId - FROM assetData AS d LEFT JOIN users AS u on d.revisedBy = u.userId - INNER JOIN asset AS a ON d.assetId = a.assetId - WHERE $queryPiece AND 'edited' $allowedActionsPredicate - ORDER BY dateStamp DESC - $limitClause -EOT -} - -#------------------------------------------------------------------- -sub _editsRefOfRecentChanges { - my $self = shift; - my $limit = shift; - $self->_editsRefOfQuery("a.lineage LIKE CONCAT(?, '%') AND a.assetId <> ?", [$self->get('lineage'), $self->getId], [qw/edited trashed/], $limit); -} - -#------------------------------------------------------------------- -sub _templateSubvarOfEdit { - my $self = shift; - my $edit = shift; - my $time = shift; - my $i18n = WebGUI::International->new($self->session, 'Asset_WikiMaster'); - my $subvar = +{%$edit}; - - $self->_appendVarsOfDate($subvar, $subvar->{dateStamp}, '', $time); - - # If only HTML::Template::Expr were standard. - $subvar->{isDelete} = ($subvar->{action} eq 'trashed'); - $subvar->{isEdit} = ($subvar->{action} eq 'edited'); - $subvar->{isProtect} = ($subvar->{action} eq 'protected'); - $subvar->{isUnprotect} = ($subvar->{action} eq 'unprotected'); - $subvar->{isCreateOrEdit} = $subvar->{isEdit}; - if ($subvar->{isEdit}) { - my $icon = $self->session->icon; - $subvar->{toolbar} = $icon->delete("func=purgeRevision;revisionDate=".$subvar->{dateStamp}, $subvar->{url}, "Delete this revision?") - .$icon->edit('func=edit;revision='.$subvar->{dateStamp}, $subvar->{url}) - .$icon->view('func=view;revision='.$subvar->{dateStamp}, $subvar->{url}); - } - - if ($subvar->{isEdit} and ($self->session->db->quickArray("SELECT MIN(revisionDate) FROM assetData WHERE assetId = ?", [$subvar->{assetId}]))[0] == $subvar->{dateStamp}) { - $subvar->{action} = 'created'; - $subvar->{isEdit} = 0; - $subvar->{isCreate} = 1; - } - - $subvar->{actionTaken} = $i18n->get('actionN '.$subvar->{action}); - $subvar->{actionTakenLowerCase} = lc $subvar->{actionN}; - - return $subvar; -} - -#------------------------------------------------------------------- -sub _templateSubvarOfPage { - my $self = shift; - my $page = shift; - my $subvar = {}; - $page = WebGUI::Asset->newByDynamicClass($self->session, $page) unless ref $page; - - $subvar->{title} = $page->get('title'); - $subvar->{assetId} = $page->getId; - $subvar->{viewLatest} = $page->getUrl; - $subvar->{editLatest} = $page->getUrl('func=edit'); - return $subvar; -} - -#------------------------------------------------------------------- -sub _templateSubvarsRefOfEdits { - my $self = shift; - my $edits = shift; - my $time = shift; - return [map { $self->_templateSubvarOfEdit($_, $time) } @$edits]; -} - -#------------------------------------------------------------------- -sub _templateSubvarsRefOfPages { - my $self = shift; - my $pages = shift; - return [map { $self->_templateSubvarOfPage($_) } @$pages]; -} - #------------------------------------------------------------------- sub appendMostPopular { my $self = shift; @@ -245,6 +55,21 @@ sub appendRecentChanges { } } +#------------------------------------------------------------------- +sub appendSearchBoxVars { + my $self = shift; + my $var = shift; + my $queryText = shift; + my $submitText = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('searchLabel'); + $var->{'searchFormHeader'} = join '', + (WebGUI::Form::formHeader($self->session, { action => $self->getUrl}), + WebGUI::Form::hidden($self->session, { name => 'func', value => 'search' })); + $var->{'searchQuery'} = WebGUI::Form::text($self->session, { name => 'query', value => $queryText }); + $var->{'searchSubmit'} = WebGUI::Form::submit($self->session, { value => $submitText }); + $var->{'searchFormFooter'} = WebGUI::Form::formFooter($self->session); + return $self; +} + #------------------------------------------------------------------- sub autolinkHtml { my $self = shift; @@ -287,9 +112,7 @@ sub autolinkHtml { #------------------------------------------------------------------- sub canAdminister { my $self = shift; - my $userId = shift || $self->session->user->userId; - my $user = WebGUI::User->new($self->session, $userId); - return $self->canView($userId) && $user->isInGroup($self->get('groupToAdminister')); + return $self->session->user->isInGroup($self->get('groupToAdminister')) || $self->canEdit; } #------------------------------------------------------------------- @@ -313,7 +136,7 @@ sub definition { %properties = ( groupToEditPages => { fieldType => 'group', - defaultValue => ['7'], + defaultValue => ['2'], tab => 'security', hoverHelp => $i18n->get('groupToEditPages hoverHelp'), label => $i18n->get('groupToEditPages label') }, @@ -485,10 +308,9 @@ sub view { recentChangesLabel=>$i18n->get("recentChangesLabel"), }; my $template = $self->{_frontPageTemplate}; - $self->_appendSearchBoxVars($var); + $self->appendSearchBoxVars($var); $self->appendRecentChanges($var, $self->get('recentChangesCountFront')); $self->appendMostPopular($var, $self->get('mostPopularCountFront')); - $self->_appendFuncTemplateVars($var, qw/recentChanges/); return $self->processTemplate($var, undef, $template); } @@ -543,10 +365,10 @@ sub www_search { mostPopularUrl=>$self->getUrl("func=mostPopular"), mostPopularLabel=>$i18n->get("mostPopularLabel"), wikiHomeUrl=>$self->getUrl, - getEditFormUrl=>$self->getUrl("func=add;class=WebGUI::Asset::WikiPage;ajax=1"), + addPageUrl=>$self->getUrl("func=add;class=WebGUI::Asset::WikiPage"), }; my $queryString = $self->session->form->process('query', 'text'); - $self->_appendSearchBoxVars($var, $queryString); + $self->appendSearchBoxVars($var, $queryString); if (length $queryString) { my $search = WebGUI::Search->new($self->session); $search->search({ keywords => $queryString,