{"id":19640604,"url":"https://github.com/daniel-km/omeka-s-module-easyadmin","last_synced_at":"2026-02-17T16:05:51.135Z","repository":{"id":63889562,"uuid":"459076500","full_name":"Daniel-KM/Omeka-S-module-EasyAdmin","owner":"Daniel-KM","description":"Module for Omeka S to install modules and themes automatically and to do bulk checks on data and files.","archived":false,"fork":false,"pushed_at":"2026-02-03T09:27:30.000Z","size":1221,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-03T22:32:57.786Z","etag":null,"topics":["curation","omeka-s","omeka-s-module"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cecill-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Daniel-KM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.en.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-02-14T08:30:57.000Z","updated_at":"2026-02-03T09:27:33.000Z","dependencies_parsed_at":"2023-11-13T12:27:36.709Z","dependency_job_id":"3f88d7a0-cf78-4846-a651-612a9dd8419a","html_url":"https://github.com/Daniel-KM/Omeka-S-module-EasyAdmin","commit_stats":null,"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/Daniel-KM/Omeka-S-module-EasyAdmin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-EasyAdmin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-EasyAdmin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-EasyAdmin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-EasyAdmin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Daniel-KM","download_url":"https://codeload.github.com/Daniel-KM/Omeka-S-module-EasyAdmin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-EasyAdmin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29549266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T14:33:00.708Z","status":"ssl_error","status_checked_at":"2026-02-17T14:32:58.657Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["curation","omeka-s","omeka-s-module"],"created_at":"2024-11-11T14:06:14.503Z","updated_at":"2026-02-17T16:05:51.124Z","avatar_url":"https://github.com/Daniel-KM.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Easy Admin (module for Omeka S)\n===============================\n\n\u003e __New versions of this module and support for Omeka S version 3.0 and above\n\u003e are available on [GitLab], which seems to respect users and privacy better\n\u003e than the previous repository.__\n\n[Easy Admin] is a module for [Omeka S] that allows to manage Omeka from the\nadmin interface:\n\n- bulk upload multiple files in item form, bypassing any server post limits\n- per-user private directories for uploads and imports\n- buttons to public view and previous/next resources in admin resource show page\n- install modules and themes\n- install [curated selection of modules]\n- update modules (in a future version)\n- add more asset media types\n- maintenance state for public and admin even when no migration\n- checks database and files\n- backup install\n- clear php caches\n- launch simple tasks, that can be any job of any module\n- allow (or not) reviewer to delete any resources\n- allow more file types for assets\n\nChecks and fixes that are doable:\n\n- list files in the file system (original and thumbnails), but not in the\n  database\n- remove useless files in the files directory (moved to files/check)\n- list files in the database, but not in the file system (for original and\n  thumbnails)\n- copy original files from a directory, for example after a disk crash or an\n  inadvertent deletion; files are copied via the hash, and they can be anywhere\n  in the directory or in subdirectories of the source path.\n- re-hash storage file names, for example after import or for security.\n- rebuild derivative files\n- remove empty directories in file system (original and thumbnails, mainly for\n  module [Archive Repertory])\n- check and update file size of media (required to fix Omeka installed before\n  Omeka 1.2 ([omeka/omeka-s#1257]), or after a hard update of files)\n- check and fix sha256 hashes of files\n- check and fix positions of media (start from 1, without missing number)\n- check and set precise media types (for example application/alto+xml instead of text/xml)\n- check and prepare dimensions of medias for module [Iiif Server]\n- check and fix the encoding (iso-8859 to utf-8) of resource values and page\n  contents (fix Windows issues)\n- check and update titles\n- check and update the primary media for each item\n- check and stop dead jobs (living in database, but non-existent in system)\n- check the size of the database table of sessions and remove them\n- check the size of the database table of logs and remove them\n- backup install\n- clear php caches\n- loop resources, for example to update them when a new settings is set\n\nAnd many more.\n\nThe feature \"content lock\" to avoid concurrent edition was moved to the module\n[Lock Edit] since version 3.4.31.\n\nModules that add tasks:\n\n- [Compilatio]\n  - Send files to https://compilatio.net, an anti-plagiarism app.\n  - Append urls to https://compilatio.net for files checked by Compilatio.\n- [Guest]\n  - Reset acceptation of conditions.\n- [Iiif Server]\n  - Convert old three-columns table contents to new four columns.\n- [Lock Edit]\n  - Check and reset content locks.\n- [Reference]\n  - Reindex references.\n- [Thesaurus]\n  - Reindex thesaurus.\n- [Zip]\n  - Create zips.\n\n\nInstallation\n------------\n\nSee general end user documentation for [installing a module].\n\nThis module requires the module [Common], that should be installed first.\n\nThe module [Cron] is recommended for advanced scheduling, but not required: the\nmodule can clean sessions and run scheduled tasks independently via page loads.\n\nThe module uses external libraries, so use the release zip to install it, or use\nand init the source.\n\n- From the zip\n\nDownload the last release [EasyAdmin.zip] from the list of releases, and\nuncompress it in the `modules` directory.\n\n- From the source and for development\n\nIf the module was installed from the source, rename the name of the folder of\nthe module to `EasyAdmin`, go to the root of the module, and run:\n\n```sh\ncomposer install --no-dev\n```\n\nThen install it like any other Omeka module and follow the config instructions.\n\n- For test\n\nThe module includes a comprehensive test suite with unit and functional tests.\nRun them from the root of Omeka:\n\n```sh\nvendor/bin/phpunit -c modules/EasyAdmin/phpunit.xml --testdox\n```\n\n- Proxy issue\n\nIn some cases, in particular when the server is behind a proxy, a firewall or a\nspecific infrastructure, your may need to add credentials in your config (omeka\nfile \"config/local.config.php\"), depending on your linux distribution:\n\n```php\n    'http_client' =\u003e [\n        // 'adapter' =\u003e \\Laminas\\Http\\Client\\Adapter\\Curl::class,\n        'sslcapath' =\u003e '/usr/local/etc/ssl/certs',\n        'sslcafile' =\u003e '/usr/local/etc/ssl/certs/ca.crt',\n        // 'sslcapath' =\u003e '/etc/pki/tls/certs',\n        // 'sslcafile' =\u003e '/etc/pki/tls/certs/ca-bundle.crt',\n    ],\n```\n\nIn some cases, the path should be relative:\n\n```php\n    'http_client' =\u003e [\n        // 'adapter' =\u003e \\Laminas\\Http\\Client\\Adapter\\Curl::class,\n        'sslcapath' =\u003e '/usr/local/etc/ssl/certs/',\n        'sslcafile' =\u003e 'ca.crt',\n        // 'sslcapath' =\u003e '/etc/pki/tls/certs/',\n        // 'sslcafile' =\u003e 'ca-bundle.crt',\n    ],\n```\n\nYou can find more information on the params in [Laminas help] and [curl].\n\n\nUsage\n-----\n\n### Various settings\n\nSome options are added in main settings:\n\n- Display previous/next button in resource page.\n- Allow the reviewer to delete any resource.\n- Manage the maintenance.\n- Display a quick button to create a resource template\n\n### Bulk Upload in item form and in separate form\n\nThe module adds a way to bulk upload files manually without limit of [size or number of files]\nin resource form and via a separate bulk upload form for future imports.\n\nSimply select \"Files\" in the media list in item form.\n\nFor security, some characters are forbidden in filenames. Media-types and\nextensions are checked according to main settings too.\n\nTo list files in this directory and to delete them, use the file manager, via\nthe link Easy admin in the left sidebar, then tab File manager.\n\nNot all directories can be browsed: only the list of paths set in main settings\ncan be browsed. Furthermore, by default, only paths inside directory files/ and\nthat are not managed by Omeka are allowed. To bypass this limit, an option in\nthe config form allows to use any path inside files/.\n\nAnother option allows to use any other writeable directory. For this one, update\nthe file local.config.php for key \"easyadmin_local_path_any\".\n**Warning**: there are security implications with this option, so check access\nrights or use it only temporarily.\n\n### Per-user directories\n\nAn option in settings allows to enable private directories for each user who can\ncreate items (author, reviewer, editor, and administrators). When enabled:\n\n- Each user gets a personal directory at `/files/userdata/{userId}/`.\n- The directory is created automatically on first access.\n- Administrators can browse and download files in all user directories, but\n  cannot upload or delete files in another user's directory.\n- Non-admin users (editors, reviewers, authors) can only see and use their own\n  directory.\n- Researchers do not have access to user directories (they cannot create items).\n- The `/files/userdata/` directory is protected by `.htaccess` to deny direct\n  HTTP access. The `.htaccess` is created automatically and recreated if deleted.\n- Files can still be imported via their filesystem path (sideload), since PHP\n  reads the disk directly and is not affected by the `.htaccess`. The filesystem\n  path is displayed in the file manager interface.\n- Download in the file manager works via a dedicated controller action that\n  streams the file after verifying authentication.\n- When the setting is disabled, existing directories remain on disk but no longer\n  appear in the dropdown.\n\n### Buttons in resource page\n\nThe option can be enabled in main settings.\n\n#### Button \"Public view\"\n\nDisplay a button \"Public view\" in resource show pages. The link is the resource\npage of the default user site or the default site.\n\nThis feature has been integrated partially in Omeka S v4.1, but only for items\nintegrated in a site, not for item sets or media.\n\n#### Buttons to previous next resources\n\nAllow to get the previous or the next resources, that simplifies browsing like\nin Omeka Classic.\n\n### Checks and fixes\n\nGo to the menu \"Bulk Check\", select your process, set your options if needed,\nand click the submit buttons. The results are available in logs currently.\n\n### Install and update modules and themes\n\nSimply select either the desired module or the desired theme and click \"upload\".\n\nSee more details on [modules] and [themes].\n\n### Content lock (Easy Admin until version 3.4.30)\n\nThe feature was moved to the module [Lock Edit] since version 3.4.31.\n\nThis feature is inspired by Drupal [Content Lock] mechanism and allows to block\nconcurrent editing: when a user is editing a resource, other users cannot edit\nit until submission.\n\n### Tasks and cron tasks\n\nCron tasks are now managed via module [Cron]. Nevertheless, it is still possible\nto run any tasks (jobs) from this module.\n\nA script allows to run any job of any module from the command line, even if they\nare not initialized in the admin interface. It’s useful to run one time tasks or\ncron tasks, for example to harvest and update resources regularly with module\n[Bulk Import], or to clean up sessions (see included jobs), or to reindex\nresources in the search engine with module [Search SolR].\n\nHere is the command line to use:\n\n```sh\nphp '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --help\n```\n\nIn main cron tab or in the one of the user \"www-data\", you can add a task like\nthat:\n\n```sh\n/bin/su - www-data -c \"php /path/to/omeka/modules/EasyAdmin/data/scripts/task.php --task 'EasyAdmin\\Job\\LoopItems' --user-id 1 --server-url 'https://example.org' --base-path '/'\"\n```\n\nTo use the command with the user \"www-data\" (or equivalent) may be required when\nthe task creates files inside Omeka \"/files/\" directory. If the task only uses\nthe database, it is usually not needed, but you need to take care of modules\nthat can create derivative or temp files. And you may need to take care of\nescaping json arguments.\n\nA sudo command may be used:\n\n```sh\nsudo -u www-data php '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --task 'BulkImport\\Job\\Import' --user-id 1 --server-url 'https://example.org' --base-path '/omeka-s' --args '{\"bulk_import_id\": 1}'\n```\n\nRequired arguments are:\n\n- `-t` `--task` [Name]\n  May be the full class of a job (\"EasyAdmin\\Job\\LoopItems\") or its basename\n  (\"LoopItems\"). You should take care of case sensitivity and escaping \"\\\" or\n  quoting name on cli.\n- `-u` `--user-id` [#id]\n  The Omeka user id is required, else the job won’t have any rights.\n\nRecommended arguments:\n\n- `-s` `--server-url` [url] (default: \"http://localhost\")\n- `-b` `--base-path` [path] (default: \"/\")\n  The url path to complete the server url.\n\nOptional arguments:\n\n- `-a` `--args` [json]\n  Arguments to pass to the task. Arguments are specific to each job. To find\n  them, check the code, or run a job manually then check the job page in admin\n  interface.\n- `-k` `--as-task`\n  Process a a simple task and do not create a job. May be used for tasks that\n  do not need to be checked as a job. This is the inverse of the deprecated\n  argument `--job`.\n\nAs an example, you can try the included job/task, for example \"LoopItems\" that\nloops all items to save them. This task allows to update all items, so all the\nmodules that uses api events are triggered. This job can be use as a one-time\ntask that help to process existing items when a new feature is added in a\nmodule:\n\n```sh\nphp '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --task 'LoopItems' --user-id 1 --server-url 'https://example.org' --base-path '/' --args '{}'\n```\n\nAnother example: run a bulk import job whose config is stored. Indeed, because\nthe config of a bulk import may be complex, it is simpler to store it in the\nadmin interface with its option \"Store job as a task\".\n\n```sh\nphp '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --task 'BulkImport\\Job\\Import' --user-id 1 --server-url 'https://example.org' --base-path '/' --args '{\"bulk_import_id\": 1}'\n```\n\nAnother example: run a bulk export job whose config is stored with option \"Store job as a task\".\n\n```sh\nphp '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --task 'BulkExport\\Job\\Export' --user-id 1 --server-url 'https://example.org' --base-path '/' --args '{\"bulk_export_id\": 1}'\n```\n\nAnother example: reindex statistics after import of hits:\n\n```sh\nsudo -u www-data php '/path/to/omeka/modules/EasyAdmin/data/scripts/task.php' --task 'Statistics\\Job\\AggregateHits' --user-id 1 --server-url 'https://example.org' --base-path '/'\n```\n\nNote that for jobs created manually in the admin interface, you can run them\nwith the standard Omeka \"perform-job.php\". Of course, these job can be run one\ntime only:\n\n```sh\nphp '/path/to/omeka/application/data/scripts/perform-job.php' --job-id 1 --server-url 'https://example.org' --base-path '/'\n```\n\n\nDevelopment\n-----------\n\nTo append a new task:\n\n- Add the name and label of the task via event `form.add_elements` on `\\EasyAdmin\\Form\\JobsForm`.\n- Eventually add a fieldset with specific options.\n- Add the name of the job class and its params via event `easyadmin.job`, on\n  class `\\EasyAdmin\\Controller\\JobController`.\n\nSee an example in [Compilatio], [Reference], [Thesaurus], etc.\n\n\nTODO\n----\n\n- [ ] Output results as tsv (`/files/check/tsv_date_time.tsv`) as BulkExport or in a table (done for missing file; to do for all processors).\n- [ ] Output results as ods.\n- [ ] Check files with the wrong extension.\n- [x] Add width/height/duration as data for image/audio/video to avoid to get them each time (ready in modules [Iiif Server] and [Image Server]).\n- [x] Remove old logs.\n- [ ] A main cleaning task.\n- [ ] Add a checkbox in page assets to optimise assets in batch.\n- [ ] Add a deduplicator for assets (and replace assets used as resource thumbnails and in pages).\n- [x] Dump database: see adminer.\n- [x] Find a way to increase duration of csrf when there are very a large number of files to upload, instead of skipping csrf.\n- [ ] Add a module setting for the csrf lifetime for bulk uploads and for main resource edit page.\n\n\nWarning\n-------\n\nUse it at your own risk.\n\nIt’s always recommended to backup your files and your databases and to check\nyour archives regularly so you can roll back if needed.\n\n```sh\n# database dump example\nmysqldump -u omeka -p omeka | gzip \u003e \"omeka.$(date +%Y%m%d_%H%M%S).sql.gz\"\n```\n\n\nTroubleshooting\n---------------\n\nSee online issues on the [module issues] page on GitLab.\n\n\nLicense\n-------\n\nThis module is published under the [CeCILL v2.1] license, compatible with\n[GNU/GPL] and approved by [FSF] and [OSI].\n\nThis software is governed by the CeCILL license under French law and abiding by\nthe rules of distribution of free software. You can use, modify and/ or\nredistribute the software under the terms of the CeCILL license as circulated by\nCEA, CNRS and INRIA at the following URL \"http://www.cecill.info\".\n\nAs a counterpart to the access to the source code and rights to copy, modify and\nredistribute granted by the license, users are provided only with a limited\nwarranty and the software’s author, the holder of the economic rights, and the\nsuccessive licensors have only limited liability.\n\nIn this respect, the user’s attention is drawn to the risks associated with\nloading, using, modifying and/or developing or reproducing the software by the\nuser in light of its specific status of free software, that may mean that it is\ncomplicated to manipulate, and that also therefore means that it is reserved for\ndevelopers and experienced professionals having in-depth computer knowledge.\nUsers are therefore encouraged to load and test the software’s suitability as\nregards their requirements in conditions enabling the security of their systems\nand/or data to be ensured and, more generally, to use and operate it in the same\nconditions as regards security.\n\nThe fact that you are presently reading this means that you have had knowledge\nof the CeCILL license and that you accept its terms.\n\n\nCopyright\n---------\n\n- Copyright Daniel Berthereau, 2017-2026 (see [Daniel-KM] on GitLab)\n\nThis module is a merge and improvement of previous modules [Easy Install], [Next],\n[Maintenance], [Bulk Check] and [Generic]. The idea of [Easy Install] comes from\nthe plugin [Escher] for [Omeka Classic].\n\nThe curated selections of modules was implemented for the [digital library Manioc]\nof the [Université des Antilles et de la Guyane].\n\n\n[Easy Admin]: https://gitlab.com/Daniel-KM/Omeka-S-module-EasyAdmin\n[Omeka S]: https://omeka.org/s\n[curated selection of modules]: https://daniel-km.github.io/UpgradeToOmekaS/omeka_s_selections.html\n[Easy Install]: https://gitlab.com/Daniel-KM/Omeka-S-module-EasyInstall\n[Bulk Check]: https://gitlab.com/Daniel-KM/Omeka-S-module-BulkCheck\n[Next]: https://gitlab.com/Daniel-KM/Omeka-S-module-Next\n[Maintenance]: https://gitlab.com/Daniel-KM/Omeka-S-module-Maintenance\n[installing a module]: https://omeka.org/s/docs/user-manual/modules/\n[Compilatio]: https://gitlab.com/Daniel-KM/Omeka-S-module-Compilatio\n[Guest]: https://gitlab.com/Daniel-KM/Omeka-S-module-Guest\n[Iiif Server]: https://gitlab.com/Daniel-KM/Omeka-S-module-IiifServer\n[Lock Edit]: https://gitlab.com/Daniel-KM/Omeka-S-module-LockEdit\n[Reference]: https://gitlab.com/Daniel-KM/Omeka-S-module-Reference\n[Thesaurus]: https://gitlab.com/Daniel-KM/Omeka-S-module-Thesaurus\n[Zip]: https://gitlab.com/Daniel-KM/Omeka-S-module-Zip\n[Cron]: https://gitlab.com/Daniel-KM/Omeka-S-module-Cron\n[installing a module]: https://omeka.org/s/docs/user-manual/modules/\n[EasyAdmin.zip]: https://github.com/Daniel-KM/Omeka-S-module-EasyAdmin/releases\n[size or number of files]: https://github.com/omeka/omeka-s/issues/1785\n[Laminas help]: https://docs.laminas.dev/laminas-http/client/adapters\n[curl]: https://curl.se/libcurl/c/curl_easy_setopt.html\n[module issues]: https://gitlab.com/Daniel-KM/Omeka-S-module-EasyAdmin/issues\n[Archive Repertory]: https://gitlab.com/Daniel-KM/Omeka-S-module-ArchiveRepertory\n[Iiif Server]: https://gitlab.com/Daniel-KM/Omeka-S-module-IiifServer\n[omeka/omeka-s#1257]: https://github.com/omeka/omeka-s/pull/1257\n[Common]: https://gitlab.com/Daniel-KM/Omeka-S-module-Common\n[Generic]: https://gitlab.com/Daniel-KM/Omeka-S-module-Generic\n[Content Lock]: https://www.drupal.org/project/content_lock\n[Image Server]: https://gitlab.com/Daniel-KM/Omeka-S-module-ImageServer\n[modules]: https://daniel-km.github.io/UpgradeToOmekaS/omeka_s_modules.html\n[themes]: https://daniel-km.github.io/UpgradeToOmekaS/omeka_s_themes.html\n[CeCILL v2.1]: https://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html\n[GNU/GPL]: https://www.gnu.org/licenses/gpl-3.0.html\n[FSF]: https://www.fsf.org\n[OSI]: http://opensource.org\n[Escher]: https://github.com/AcuGIS/Escher\n[Omeka Classic]: https://omeka.org/classic\n[digital library Manioc]: http://www.manioc.org\n[Université des Antilles et de la Guyane]: http://www.univ-ag.fr\n[GitLab]: https://gitlab.com/Daniel-KM\n[Daniel-KM]: https://gitlab.com/Daniel-KM \"Daniel Berthereau\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-km%2Fomeka-s-module-easyadmin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel-km%2Fomeka-s-module-easyadmin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-km%2Fomeka-s-module-easyadmin/lists"}