aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRon Lucke <lucke@elan-ev.de>2022-04-26 07:23:04 +0000
committerMarcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de>2022-04-26 07:23:04 +0000
commitd0a835f4a67c890cc0a53973ba5066a49b458f97 (patch)
treecb38983809207894423e632c4b8b4b5284ffd01b /lib
parent35819b9364a04d7c3c223f5654a4d86d17761efa (diff)
CoursewareImport
Closes #886 and #906
Diffstat (limited to 'lib')
-rwxr-xr-xlib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php17
-rwxr-xr-xlib/models/Courseware/StructuralElement.php80
2 files changed, 83 insertions, 14 deletions
diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
index 2dfee89..6e14b72 100755
--- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
+++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCopy.php
@@ -33,7 +33,11 @@ class StructuralElementsCopy extends NonJsonApiController
throw new AuthorizationFailedException();
}
- $newElement = $this->copyElement($user, $sourceElement, $newParent);
+ if ($data['migrate']) {
+ $newElement = $this->mergeElement($user, $sourceElement, $newParent);
+ } else {
+ $newElement = $this->copyElement($user, $sourceElement, $newParent);
+ }
if ($data['remove_purpose']) {
$newElement->purpose = '';
}
@@ -43,9 +47,16 @@ class StructuralElementsCopy extends NonJsonApiController
private function copyElement(\User $user, StructuralElement $sourceElement, StructuralElement $newParent)
{
- $new_element = $sourceElement->copy($user, $newParent);
+ $newElement = $sourceElement->copy($user, $newParent);
+
+ return $newElement;
+ }
+
+ private function mergeElement(\User $user, StructuralElement $sourceElement, StructuralElement $targetElement)
+ {
+ $newElement = $sourceElement->merge($user, $targetElement);
- return $new_element;
+ return $newElement;
}
/**
diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php
index b135e4a..ee5e92a 100755
--- a/lib/models/Courseware/StructuralElement.php
+++ b/lib/models/Courseware/StructuralElement.php
@@ -662,17 +662,7 @@ SQL;
*/
public function copy(User $user, StructuralElement $parent): StructuralElement
{
- /** @var ?\FileRef $original_file_ref */
- $original_file_ref = \FileRef::find($this->image_id);
- if ($original_file_ref) {
- $instance = new Instance($this->getCourseware($parent->range_id, $parent->range_type));
- $folder = \Courseware\Filesystem\PublicFolder::findOrCreateTopFolder($instance);
- /** @var \FileRef $file_ref */
- $file_ref = \FileManager::copyFile($original_file_ref->getFileType(), $folder, $user);
- $file_ref_id = $file_ref->id;
- } else {
- $file_ref_id = null;
- }
+ $file_ref_id = self::copyImage($user, $parent);
$element = self::build([
'parent_id' => $parent->id,
@@ -697,6 +687,74 @@ SQL;
return $element;
}
+ private function copyImage(User $user, StructuralElement $parent) : ?String
+ {
+ $file_ref_id = null;
+
+ /** @var ?\FileRef $original_file_ref */
+ $original_file_ref = \FileRef::find($this->image_id);
+ if ($original_file_ref) {
+ $instance = new Instance($this->getCourseware($parent->range_id, $parent->range_type));
+ $folder = \Courseware\Filesystem\PublicFolder::findOrCreateTopFolder($instance);
+ /** @var \FileRef $file_ref */
+ $file_ref = \FileManager::copyFile($original_file_ref->getFileType(), $folder, $user);
+ $file_ref_id = $file_ref->id;
+ }
+
+ return $file_ref_id;
+ }
+
+ public function merge(User $user, StructuralElement $target): StructuralElement
+ {
+ // merge with target
+ if (!$target->image_id) {
+ $target->image_id = self::copyImage($user, $target);
+ }
+
+ if ($target->title === 'neue Seite' || $target->title === 'New page') {
+ $target->title = $this->title;
+ }
+
+ if (!$target->purpose) {
+ $target->purpose = $this->purpose;
+ }
+
+ if (!$target->payload['color']) {
+ $target->payload['color'] = $this->payload['color'];
+ }
+
+ if (!$target->payload['description']) {
+ $target->payload['description'] = $this->payload['description'];
+ }
+
+ if (!$target->payload['license_type']) {
+ $target->payload['license_type'] = $this->payload['license_type'];
+ }
+
+ if (!$target->payload['required_time']) {
+ $target->payload['required_time'] = $this->payload['required_time'];
+ }
+
+ if (!$target->payload['difficulty_start']) {
+ $target->payload['difficulty_start'] = $this->payload['difficulty_start'];
+ }
+
+ if (!$target->payload['difficulty_end']) {
+ $target->payload['difficulty_end'] = $this->payload['difficulty_end'];
+ }
+
+ $target->store();
+
+ // add Containers to target
+ self::copyContainers($user, $target);
+
+ // copy Children
+
+ self::copyChildren($user, $target);
+
+ return $this;
+ }
+
private function copyContainers(User $user, StructuralElement $newElement): void
{
$containers = \Courseware\Container::findBySQL('structural_element_id = ?', [$this->id]);