initial commit
This commit is contained in:
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
__pycache__
|
||||
counter
|
||||
exports
|
||||
imports
|
||||
notes.md
|
||||
output
|
||||
run.sh
|
||||
tmp
|
||||
24
README.md
Normal file
24
README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
- un dossier = une page
|
||||
- tous les fichiers d'un dossier = deviennent des pièces-jointes de la page du dossier
|
||||
- si fichier odt alors création d'une page avec le contenu de l'odt et fichier odt original en pièce-jointe
|
||||
|
||||
- installer batch import 2.3
|
||||
- puis cocher advanced et c/c: `com.xwiki.projects.ecolo:ecolo-subwiki` et choisir la 1.8
|
||||
|
||||
- l'upload du CSV se fait via https://www.xwiki2.localhost/bin/view/Doc/?sheet=BatchImport.BatchImportSheet
|
||||
- utiliser la DocClass (AppWithinMinutes ? de Ludovic et pas en faire une nouvelle)
|
||||
|
||||
# Notes d'une réunion
|
||||
|
||||
1. test paramètre sheet (et d'autres)
|
||||
2. => surcharge rendu de la page
|
||||
3. si paramètre sheet
|
||||
- effet:
|
||||
- s'il utilise une sheet -> celle donnée en param. matriciel
|
||||
|
||||
|
||||
- [X] ajouter config gitlab dans create.sh
|
||||
- [N] installation cli -> mail ludovic, sinon via gui (voir plus haut)
|
||||
- pas possible, trop long (et pas utile)
|
||||
|
||||
|
||||
25
create-import.py
Normal file
25
create-import.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
from lib.create_import import create_import
|
||||
from lib.create_odts_import import create_odts_import
|
||||
from lib.get_config import get_config
|
||||
from lib.helpers import (
|
||||
create_export_directory,
|
||||
is_import_directory_okay,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
CONFIG = get_config()
|
||||
is_import_directory_okay(CONFIG["absolute_starting_path"])
|
||||
create_export_directory(CONFIG)
|
||||
create_import(CONFIG)
|
||||
create_odts_import(CONFIG)
|
||||
except ValueError as ve:
|
||||
sys.exit(ve)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
0
lib/__init__.py
Normal file
0
lib/__init__.py
Normal file
35
lib/create_import.py
Normal file
35
lib/create_import.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from lib.helpers import (
|
||||
get_attachments_folder_path,
|
||||
get_document_space,
|
||||
get_document_space_title,
|
||||
write_csv,
|
||||
)
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
def create_import(CONFIG):
|
||||
rows = []
|
||||
for current_path, folders, files in os.walk(CONFIG["absolute_starting_path"]):
|
||||
document_space = get_document_space(CONFIG, current_path)
|
||||
document_space_title = get_document_space_title(CONFIG, current_path)
|
||||
attachements_folder_path = get_attachments_folder_path(CONFIG, current_path)
|
||||
line = {
|
||||
"documentSpace": document_space,
|
||||
"documentName": "WebHome",
|
||||
"documentTitle": document_space_title,
|
||||
"attachmentsFolderPath": attachements_folder_path,
|
||||
"documentContent": "{{children/}}",
|
||||
"pilot": CONFIG["pilot"],
|
||||
}
|
||||
rows.append(line)
|
||||
path = os.path.join(CONFIG["export_directory"], attachements_folder_path)
|
||||
os.mkdir(path)
|
||||
if files:
|
||||
for file in files:
|
||||
shutil.copy(
|
||||
os.path.join(current_path, file),
|
||||
os.path.join(CONFIG["export_directory"], attachements_folder_path),
|
||||
)
|
||||
|
||||
write_csv(f"{CONFIG['export_directory']}/export-pages.csv", CONFIG["fields"], rows)
|
||||
45
lib/create_odts_import.py
Normal file
45
lib/create_odts_import.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from lib.helpers import (
|
||||
get_attachments_folder_path,
|
||||
get_document_space,
|
||||
write_csv,
|
||||
)
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def create_odts_import(CONFIG):
|
||||
rows = []
|
||||
for current_path, folders, files in os.walk(CONFIG["absolute_starting_path"]):
|
||||
if files:
|
||||
odts = list(
|
||||
filter(
|
||||
lambda f: os.path.splitext(f)[-1].lower() == ".odt",
|
||||
files,
|
||||
),
|
||||
)
|
||||
if odts:
|
||||
document_space = get_document_space(CONFIG, current_path)
|
||||
attachements_folder_path = get_attachments_folder_path(
|
||||
CONFIG, current_path
|
||||
)
|
||||
lines = list(
|
||||
map(
|
||||
lambda odtf: {
|
||||
"documentSpace": document_space
|
||||
+ "."
|
||||
+ odtf.replace(".odt", "").replace(".", "_"),
|
||||
"documentName": "WebHome",
|
||||
"documentTitle": Path(odtf).stem.replace(".odt", ""),
|
||||
"attachmentsFolderPath": attachements_folder_path
|
||||
+ "/"
|
||||
+ odtf,
|
||||
"pilot": CONFIG["pilot"],
|
||||
},
|
||||
odts,
|
||||
)
|
||||
)
|
||||
rows.extend(lines)
|
||||
|
||||
write_csv(
|
||||
f"{CONFIG['export_directory']}/export-odts-pages.csv", CONFIG["fields"], rows
|
||||
)
|
||||
47
lib/get_args.py
Normal file
47
lib/get_args.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import argparse
|
||||
|
||||
|
||||
def get_arguments():
|
||||
parser = argparse.ArgumentParser(
|
||||
allow_abbrev="false",
|
||||
description="Build an xwiki export CSV from a given directory.",
|
||||
epilog="alpha stage",
|
||||
prog="xwiki-exporter",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--importdirectory",
|
||||
help="import root directory",
|
||||
required=True,
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--documentspace",
|
||||
help="xwiki document space",
|
||||
required=True,
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--documentspacetitle",
|
||||
help="xwiki document space title",
|
||||
required=True,
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--exportdirectory",
|
||||
help="export directory, will be created if not present",
|
||||
required=True,
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
help="output CSV filename",
|
||||
required=False,
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--pilot",
|
||||
help="XWiki pilot name",
|
||||
required=True,
|
||||
type=str,
|
||||
)
|
||||
return parser.parse_args()
|
||||
27
lib/get_config.py
Normal file
27
lib/get_config.py
Normal file
@@ -0,0 +1,27 @@
|
||||
import os
|
||||
from lib.get_args import get_arguments
|
||||
|
||||
|
||||
def get_config():
|
||||
ARGS = get_arguments()
|
||||
FIELDS = [
|
||||
"documentSpace",
|
||||
"documentName",
|
||||
"documentTitle",
|
||||
"attachmentsFolderPath",
|
||||
"documentContent",
|
||||
"pilot",
|
||||
"types",
|
||||
"thematiques",
|
||||
]
|
||||
return {
|
||||
"absolute_starting_path": os.path.abspath(
|
||||
os.path.normpath(ARGS.importdirectory)
|
||||
),
|
||||
"document_space": ARGS.documentspace,
|
||||
"document_space_title": ARGS.documentspacetitle,
|
||||
"export_directory": ARGS.exportdirectory,
|
||||
"pilot": ARGS.pilot,
|
||||
"starting_path": os.path.normpath(ARGS.importdirectory),
|
||||
"fields": FIELDS,
|
||||
}
|
||||
73
lib/helpers.py
Normal file
73
lib/helpers.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import csv
|
||||
import os
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
def get_humane_date(timestamp, date_format):
|
||||
return datetime.fromtimestamp(timestamp).strftime(date_format)
|
||||
|
||||
|
||||
def write_csv(csv_path, FIELD_NAMES, rows):
|
||||
with open(csv_path, "w", encoding="UTF8", newline="") as file:
|
||||
writer = csv.DictWriter(file, fieldnames=FIELD_NAMES)
|
||||
writer.writeheader()
|
||||
writer.writerows(rows)
|
||||
|
||||
|
||||
def package_zip(zip_path, absolute_starting_path, zip_root_path, csv_path):
|
||||
shutil.make_archive(
|
||||
zip_path.replace(".zip", ""),
|
||||
"zip",
|
||||
absolute_starting_path.replace(zip_root_path, ""),
|
||||
zip_root_path,
|
||||
)
|
||||
zip = zipfile.ZipFile(zip_path, "a")
|
||||
zip.write(csv_path, os.path.basename(csv_path))
|
||||
zip.close()
|
||||
|
||||
|
||||
def create_export_directory(CONFIG):
|
||||
if os.path.exists(CONFIG["export_directory"]) and os.path.isdir(
|
||||
CONFIG["export_directory"]
|
||||
):
|
||||
os.system("rm '%s' -r" % (CONFIG["export_directory"]))
|
||||
os.makedirs(CONFIG["export_directory"])
|
||||
|
||||
|
||||
def is_import_directory_okay(path):
|
||||
if not os.path.exists(path):
|
||||
raise ValueError("aborting: import directory path does not exist")
|
||||
if not os.path.isdir(path):
|
||||
raise ValueError("aborting: import directory path is not a directory")
|
||||
return True
|
||||
|
||||
|
||||
def get_document_space(CONFIG, current_path):
|
||||
relative_path = os.path.relpath(current_path, CONFIG["absolute_starting_path"])
|
||||
if relative_path == ".":
|
||||
document_space = CONFIG["document_space"]
|
||||
else:
|
||||
path = relative_path.replace(".", "_").replace("/", ".")
|
||||
document_space = f"{CONFIG['document_space']}.{path}"
|
||||
return document_space
|
||||
|
||||
|
||||
def get_attachments_folder_path(CONFIG, current_path):
|
||||
relative_path = os.path.relpath(current_path, CONFIG["absolute_starting_path"])
|
||||
if relative_path == ".":
|
||||
attachements_folder_path = os.path.basename(CONFIG["absolute_starting_path"])
|
||||
else:
|
||||
attachements_folder_path = relative_path.replace("/", ".")
|
||||
return attachements_folder_path
|
||||
|
||||
|
||||
def get_document_space_title(CONFIG, current_path):
|
||||
relative_path = os.path.relpath(current_path, CONFIG["absolute_starting_path"])
|
||||
if relative_path == ".":
|
||||
document_space_title = CONFIG["document_space_title"]
|
||||
else:
|
||||
document_space_title = os.path.basename(current_path)
|
||||
return document_space_title
|
||||
Reference in New Issue
Block a user