]> _ Git - fluidbook-toolbox.git/commitdiff
wip #4209 @0.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 12 Jul 2022 15:50:30 +0000 (17:50 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 12 Jul 2022 15:50:30 +0000 (17:50 +0200)
app/Console/Commands/WorkshopMigration.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php
app/Models/FluidbookDocument.php [new file with mode: 0644]
resources/views/fields/fluidbook_composition.blade.php

index 66a3b3b4f9110337739403231fbb98146b1344c2..de4040babbd7e9a88c465c819505fae435fc8a9f 100644 (file)
@@ -4,6 +4,7 @@
 namespace App\Console\Commands;
 
 use App\Models\AuthUser;
+use App\Models\FluidbookDocument;
 use App\Models\FluidbookPublication;
 use App\Models\FluidbookQuote;
 use App\Models\FluidbookTheme;
@@ -12,6 +13,7 @@ use Cubist\Backpack\Magic\Fields\Color;
 use Cubist\Backpack\Magic\Fields\Date;
 use Cubist\Backpack\Magic\Fields\Datetime;
 use Cubist\Backpack\Magic\Fields\Files;
+use Cubist\Util\ObjectUtil;
 use Cubist\Util\PHP;
 use Illuminate\Support\Facades\DB;
 
@@ -32,7 +34,8 @@ class WorkshopMigration extends CubistCommand
         $actions = [
             //'Backup current database' => 'backup',
             'Migrate magic models' => 'migrate',
-            'Import publications' => 'importPublications',
+            'Import documents' => 'importDocuments',
+            //'Import publications' => 'importPublications',
             'Clean caches' => 'cleanCache'
         ];
 
@@ -68,15 +71,37 @@ class WorkshopMigration extends CubistCommand
         $this->executeProcessQuiet('/usr/bin/php8.0 artisan optimize:clear');
     }
 
-
-    protected function _unserialize($str)
+    protected function importDocuments()
     {
-        $class = 'stdClass';
-        $str = preg_replace('/^O:\d+:"[^"]++"/', 'O:' . strlen($class) . ':"' . $class . '"', $str);
-        $str = str_replace("s:8:\"\0*\0datas\"", 's:5:"datas"', $str);
-        return unserialize($str);
+        PHP::neverStop();
+        FluidbookDocument::truncate();
+
+        foreach (DB::table($this->_oldDB . '.documents')->orderBy('document_id', 'desc')->get() as $e) {
+            $this->line('Import ' . $e->document_id);
+            $c = new FluidbookDocument();
+            $c->setIncrementing(false);
+            $c->id = $e->document_id;
+            $date = new \DateTime();
+            $date->setTimestamp($e->date);
+            $c->created_at = $c->updated_at = $date;
+            $c->file = $e->file;
+            $c->owner = $e->proprietaire;
+            $c->pages = $e->pages;
+            $c->pdf_data = $this->_unserializeAndJSON($e->generalInfos);
+            $c->file_data = $this->_unserializeAndJSON($e->localInfos);
+            $c->bookmarks = str_replace('"titre":', '"title":', $this->_unserializeAndJSON($e->bookmarks, '[]'));
+            $c->saveWithoutFlushingCache();
+        }
     }
 
+    protected function _unserializeAndJSON($s, $default = '[]')
+    {
+        $r = ObjectUtil::safeUnserialize($s);
+        if (!$r) {
+            return $default;
+        }
+        return json_encode($r);
+    }
 
     protected function importPublications()
     {
@@ -111,7 +136,7 @@ class WorkshopMigration extends CubistCommand
 //        }
         FluidbookPublication::truncate();
 
-        foreach (DB::table($this->_oldDB . '.books')->orderBy('book_id', 'desc')->get() as $e) {
+        foreach (DB::table($this->_oldDB . '.books')->orderBy('book_id', 'asc')->get() as $e) {
             $this->line('Import ' . $e->book_id);
             $oldRoot = $this->_oldRoot . 'books/working/' . $e->book_id . '/';
             $c = new FluidbookPublication();
@@ -163,7 +188,7 @@ class WorkshopMigration extends CubistCommand
             $c->setAttribute('composition', $composition);
 
             try {
-                $c->save();
+                $c->saveWithoutFlushingCache();
             } catch (\Exception $e) {
                 dd($e);
             }
index cfce1a77a2f9f27f5edb9cd176752f4e95e9002d..595849b9a5b1b217d0d3761f0f87c9502bc3cfa8 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
 
+use Cubist\Util\Files\Files;
 use Illuminate\Support\Facades\Route;
 
 trait CompositionOperation
@@ -9,12 +10,19 @@ trait CompositionOperation
     protected function setupCompositionRoutes($segment, $routeName, $controller)
     {
         Route::match(['get'], $segment . '/{id}/composition', $controller . '@getComposition');
+        Route::match(['get'], $segment . '/docs/{doc_id}/thumb_{doc_page}.jpg', $controller . '@getThumb');
     }
 
     protected function setupCompositionDefaults()
     {
     }
 
+    protected function getThumb($doc_id, $doc_page)
+    {
+        $path = '/mnt/sshfs/godzilla/data/fluidbook/docs/' . $doc_id . '/p' . $doc_page . '.jpg';
+        return response(null)->header('Content-Type', Files::_getMimeType($path))->header('X-Sendfile', $path);
+    }
+
     protected function getComposition()
     {
         $res = [];
diff --git a/app/Models/FluidbookDocument.php b/app/Models/FluidbookDocument.php
new file mode 100644 (file)
index 0000000..a1bd83a
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Models;
+
+use App\Models\Base\ToolboxModel;
+use Cubist\Backpack\Magic\Fields\Datetime;
+use Cubist\Backpack\Magic\Fields\Integer;
+use Cubist\Backpack\Magic\Fields\Text;
+use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+
+class FluidbookDocument extends ToolboxModel
+{
+    protected $table = 'fluidbook_document';
+    protected $_options = ['name' => 'fluidbook-document',
+        'singular' => 'document',
+        'plural' => 'documents'];
+    protected static $_permissionBase = 'fluidbook-document';
+
+    public function setFields()
+    {
+        parent::setFields();
+
+        $this->addField('file', Text::class);
+        $this->addField('pages', Integer::class);
+        $this->addOwnerField();
+        $this->addField('bookmarks', Textarea::class);
+        $this->addField('pdf_data', Textarea::class);
+        $this->addField('file_data', Textarea::class);
+    }
+}
index 97c2cce424a9420dccee85386c28f802c4b34cae..be31047643856cf009dc40639098a82406e23f44 100644 (file)
@@ -3,16 +3,20 @@
     @push('crud_fields_scripts')
         <script>
             $(function () {
-                var id = $('input[name="id"]').val();
-                loadFormDatabase();
-
-
-                function loadFormDatabase() {
-
+                function initPages() {
+                    var data = JSON.parse($("#compositionField").val());
+                    var numbers = $('input[name="page_numbers"]').val().split(',');
+                    $.each(data, function (pageNr, page) {
+                        addPage(page[0], page[1], numbers[pageNr - 1]);
+                    });
                 }
-            });
 
+                function addPage(document_id, document_page, pageNumber) {
+                    $("#composition_pages").append('<div class="page"><img src="/fluidbook-publication/docs/' + document_id + '/thumb_' + document_page + '.jpg" /><span>' + pageNumber + '</span></div>');
+                }
 
+                initPages();
+            });
         </script>
     @endpush
 
         </style>
     @endpush
 @endif
+<div id="composition">
+    <input
+        id="compositionField"
+        type="hidden"
+        name="{{ $field['name'] }}"
+        value="{{ old(square_brackets_to_dots($field['name'])) ?? $field['value'] ?? $field['default'] ?? '' }}"
+        @include('crud::fields.inc.attributes')
+    >
+    <div id="composition_uploader"></div>
+    <div id="composition_pages"></div>
+</div>