Skip to content
Snippets Groups Projects
Commit d39f8d01 authored by Rasmus Fuhse's avatar Rasmus Fuhse
Browse files

Resolve "Wiki: Einzelne Wikiversionen können nicht mehr gelöscht werden"

Closes #4079

Merge request studip/studip!2925
parent 33325611
No related branches found
No related tags found
No related merge requests found
...@@ -142,12 +142,21 @@ class Course_WikiController extends AuthenticatedController ...@@ -142,12 +142,21 @@ class Course_WikiController extends AuthenticatedController
Icon::create('settings'), Icon::create('settings'),
['data-dialog' => 'width=700'] ['data-dialog' => 'width=700']
); );
$action_menu->addButton( if (count($this->page->versions) > 0) {
'delete', $action_menu->addLink(
_('Seite löschen'), $this->ask_deletingURL($this->page),
Icon::create('trash'), _('Seite / Version löschen'),
['data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?'), 'form' => 'delete_page'] Icon::create('trash'),
); ['data-dialog' => 'size=auto']
);
} else {
$action_menu->addButton(
'delete',
_('Seite löschen'),
Icon::create('trash'),
['data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?'), 'form' => 'delete_page']
);
}
} }
$action_menu->addLink( $action_menu->addLink(
'#', '#',
...@@ -256,7 +265,10 @@ class Course_WikiController extends AuthenticatedController ...@@ -256,7 +265,10 @@ class Course_WikiController extends AuthenticatedController
"[[ " . $values['name'], "[[ " . $values['name'],
$p2['content'] $p2['content']
); );
$p2->store(); if ($p2->isDirty()) {
$p2['user_id'] = User::findCurrent()->id;
$p2->store();
}
} }
})->validate(); })->validate();
if (Request::isPost()) { if (Request::isPost()) {
...@@ -272,9 +284,17 @@ class Course_WikiController extends AuthenticatedController ...@@ -272,9 +284,17 @@ class Course_WikiController extends AuthenticatedController
$this->render_form($this->form); $this->render_form($this->form);
} }
public function ask_deleting_action(WikiPage $page)
{
if (!$page->isEditable()) {
throw new AccessDeniedException();
}
PageLayout::setTitle(_('Was genau soll gelöscht werden?'));
}
public function delete_action(WikiPage $page) public function delete_action(WikiPage $page)
{ {
if (!Request::isPost() || !CSRFProtection::verifyRequest()) { if (!Request::isPost() || !$page->isEditable() || !CSRFProtection::verifyRequest()) {
throw new AccessDeniedException(); throw new AccessDeniedException();
} }
$name = $page->name; $name = $page->name;
...@@ -283,6 +303,38 @@ class Course_WikiController extends AuthenticatedController ...@@ -283,6 +303,38 @@ class Course_WikiController extends AuthenticatedController
$this->redirect($this->allpagesURL()); $this->redirect($this->allpagesURL());
} }
public function deleteversion_action(WikiPage $page, $version_id = null)
{
if (!Request::isPost() || !$page->isEditable() || !CSRFProtection::verifyRequest()) {
throw new AccessDeniedException();
}
if ($version_id === null) {
$version = $page->versions[0];
if ($version) {
$page['name'] = $version['name'];
$page['content'] = $version['content'];
$page['user_id'] = $version['user_id'];
$page['chdate'] = $version['mkdate'];
$page->store();
$version->delete();
} else {
$page->delete();
}
} else {
$version = WikiVersion::find($version_id);
if ($version['page_id'] === $page->id) {
$version->delete();
}
}
PageLayout::postSuccess(_('Version wurde gelöscht.'));
if (Request::get('redirect_to') === 'page') {
$this->redirect($this->page($page));
} else {
$this->redirect($this->history($page));
}
}
public function allpages_action() public function allpages_action()
{ {
$this->pages = WikiPage::findBySQL( $this->pages = WikiPage::findBySQL(
...@@ -535,8 +587,11 @@ class Course_WikiController extends AuthenticatedController ...@@ -535,8 +587,11 @@ class Course_WikiController extends AuthenticatedController
} }
$page->content = \Studip\Markup::markAsHtml(trim(Request::get('content'))); $page->content = \Studip\Markup::markAsHtml(trim(Request::get('content')));
$page->store();
$user = User::findCurrent(); $user = User::findCurrent();
if ($page->isDirty()) {
$page['user_id'] = $user->id;
$page->store();
}
$pageData = [ $pageData = [
'page_id' => $page->id, 'page_id' => $page->id,
'user_id' => $user->id 'user_id' => $user->id
...@@ -774,6 +829,10 @@ class Course_WikiController extends AuthenticatedController ...@@ -774,6 +829,10 @@ class Course_WikiController extends AuthenticatedController
'type' => 'no', 'type' => 'no',
'mapper' => function () { return $this->range->id; } 'mapper' => function () { return $this->range->id; }
], ],
'user_id' => [
'type' => 'no',
'mapper' => function () { return User::findCurrent()->id; }
],
'name' => [ 'name' => [
'required' => true, 'required' => true,
'label' => _('Name der Seite'), 'label' => _('Name der Seite'),
...@@ -828,7 +887,10 @@ class Course_WikiController extends AuthenticatedController ...@@ -828,7 +887,10 @@ class Course_WikiController extends AuthenticatedController
'[[ ' . $values['name'] . ' ]]', '[[ ' . $values['name'] . ' ]]',
$page->content $page->content
); );
$page->store(); if ($page->isDirty()) {
$page['user_id'] = User::findCurrent()->id;
$page->store();
}
} }
} }
} }
......
...@@ -299,7 +299,10 @@ class JsupdaterController extends AuthenticatedController ...@@ -299,7 +299,10 @@ class JsupdaterController extends AuthenticatedController
$page->content = \Studip\Markup::markAsHtml( $page->content = \Studip\Markup::markAsHtml(
$pageInfo['wiki_editor_status']['page_content'] $pageInfo['wiki_editor_status']['page_content']
); );
$page->store(); if ($page->isDirty()) {
$page['user_id'] = User::findCurrent()->id;
$page->store();
}
} }
$onlineData = [ $onlineData = [
'user_id' => $user->id, 'user_id' => $user->id,
......
<form action="" method="post">
<?= CSRFProtection::tokenTag() ?>
<div class="file_select_possibilities">
<div>
<div class="clickable">
<?= Icon::create('archive2')->asInput(50, [
'formaction' => $controller->deleteversionURL($page, ['redirect_to' => 'page']),
'data-confirm' => _('Wirklich die letzte Änderung löschen?')
]) ?>
<button
class="undecorated"
data-confirm="<?= _('Wirklich die letzte Änderung löschen?') ?>"
formaction="<?= $controller->deleteversionURL($page, ['redirect_to' => 'page']) ?>">
<?= _('Nur die letzte Änderung löschen') ?>
</button>
</div>
<div class="clickable">
<?= Icon::create('wiki')->asInput(50, [
'formaction' => $controller->deleteURL($page),
'data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?')
]) ?>
<button
class="undecorated"
data-confirm="<?= _('Wollen Sie wirklich die komplette Seite löschen?') ?>"
formaction="<?= $controller->deleteURL($page) ?>">
<?= _('Ganze Wikiseite löschen') ?>
</button>
</div>
</div>
</div>
</form>
...@@ -45,6 +45,16 @@ ...@@ -45,6 +45,16 @@
<a href="<?= $controller->versiondiff($page) ?>" data-dialog> <a href="<?= $controller->versiondiff($page) ?>" data-dialog>
<?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?> <?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?>
</a> </a>
<? if ($page->isEditable()) : ?>
<form action="<?= $controller->deleteversion($page) ?>"
method="post"
class="inline"
title="<?= _('Version löschen') ?>"
data-confirm="<?= _('Wirklich diese Version löschen?') ?>">
<?= CSRFProtection::tokenTag() ?>
<?= Icon::create('trash')->asInput() ?>
</form>
<? endif ?>
</td> </td>
</tr> </tr>
<? foreach ($page->versions as $i => $version) : ?> <? foreach ($page->versions as $i => $version) : ?>
...@@ -69,6 +79,16 @@ ...@@ -69,6 +79,16 @@
<a href="<?= $controller->versiondiff($page, $version->id) ?>" data-dialog> <a href="<?= $controller->versiondiff($page, $version->id) ?>" data-dialog>
<?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?> <?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?>
</a> </a>
<? if ($page->isEditable()) : ?>
<form action="<?= $controller->deleteversion($page, $version->id) ?>"
method="post"
class="inline"
title="<?= _('Version löschen') ?>"
data-confirm="<?= _('Wirklich diese Version löschen?') ?>">
<?= CSRFProtection::tokenTag() ?>
<?= Icon::create('trash')->asInput() ?>
</form>
<? endif ?>
</td> </td>
</tr> </tr>
<? endforeach ?> <? endforeach ?>
......
...@@ -152,7 +152,7 @@ class WikiPage extends SchemaProvider ...@@ -152,7 +152,7 @@ class WikiPage extends SchemaProvider
*/ */
private function addAuthorRelationship($relationships, $wiki, $includeList) private function addAuthorRelationship($relationships, $wiki, $includeList)
{ {
if ($wiki->user_id) { if ($wiki->user_id && $wiki->user_id !== 'nobody') {
$relationships[self::REL_AUTHOR] = [ $relationships[self::REL_AUTHOR] = [
self::RELATIONSHIP_LINKS => [ self::RELATIONSHIP_LINKS => [
Link::RELATED => $this->createLinkToResource($wiki->user), Link::RELATED => $this->createLinkToResource($wiki->user),
......
...@@ -96,7 +96,7 @@ class WikiPage extends SimpleORMap implements PrivacyObject ...@@ -96,7 +96,7 @@ class WikiPage extends SimpleORMap implements PrivacyObject
protected function createVersion() protected function createVersion()
{ {
$this->user_id = User::findCurrent()->id; $last_version = $this->versions[0];
if ( if (
!$this->isNew() !$this->isNew()
&& $this->content['content'] !== $this->content_db['content'] && $this->content['content'] !== $this->content_db['content']
...@@ -104,6 +104,7 @@ class WikiPage extends SimpleORMap implements PrivacyObject ...@@ -104,6 +104,7 @@ class WikiPage extends SimpleORMap implements PrivacyObject
$this->content_db['user_id'] !== $this->content['user_id'] $this->content_db['user_id'] !== $this->content['user_id']
|| $this->content_db['chdate'] < time() - 60 * 30 || $this->content_db['chdate'] < time() - 60 * 30
) )
&& (!$last_version || $last_version['content'] !== $this['content'])
) { ) {
//Neue Version anlegen: //Neue Version anlegen:
WikiVersion::create([ WikiVersion::create([
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment