Skip to content

Commit b859731

Browse files
committed
Implement subdossiers
1 parent 9a79b9b commit b859731

1 file changed

Lines changed: 122 additions & 15 deletions

File tree

opengever/maintenance/scripts/cmi_to_gever/converter.py

Lines changed: 122 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ class TI2036Config(object):
100100
u"parentordner",
101101
}
102102

103+
EXPECTED_SUBDOSSIER_KEYS = {
104+
u"guid",
105+
u"titel",
106+
u"geschaeft",
107+
u"parentordner",
108+
}
109+
103110
def __init__(self, cmi_bundle_path, output_dir):
104111
self.cmi_bundle_path = cmi_bundle_path
105112
self.cmi_bundle_json_path = os.path.join(cmi_bundle_path, self.MAIN_JSON_FILE_NAME)
@@ -207,6 +214,9 @@ def write_dossiers_json(self):
207214
for item in self.data.dossiers:
208215
self.bundle_data[json_name].append(item.convert())
209216

217+
for item in self.data.subdossiers:
218+
self.bundle_data[json_name].append(item.convert())
219+
210220
self.dump_to_jsonfile(self.bundle_data[json_name],
211221
self.config.dossiers_json_file_path)
212222

@@ -262,6 +272,7 @@ def __init__(self, data, config):
262272
self.data = data
263273
self.config = config
264274
self.dossiers = []
275+
self.subdossiers = []
265276
self.documents = []
266277
self.is_data_valid = False
267278

@@ -274,7 +285,7 @@ def flatten(self):
274285

275286
def flatten_cmi_dossier(self, cmi_dossier):
276287
for folder in cmi_dossier.folders():
277-
raise NotImplemented
288+
self.subdossiers.append(folder)
278289

279290
for document in cmi_dossier.documents():
280291
self.documents.append(document)
@@ -283,6 +294,9 @@ def contents(self):
283294
for dossier in self.dossiers:
284295
yield dossier
285296

297+
for subdossier in self.subdossiers:
298+
yield subdossier
299+
286300
for document in self.documents:
287301
yield document
288302

@@ -291,6 +305,7 @@ def print_stats(self):
291305
print(u"Content stats:")
292306
print(u"--------------")
293307
print(u"Total dossiers: %s" % len(self.dossiers))
308+
print(u"Total subdossiers: %s" % len(self.subdossiers))
294309
print(u"Total documents: %s" % len(self.documents))
295310
print(u"--------------")
296311
print(u"")
@@ -347,13 +362,17 @@ def start_date(self):
347362

348363
return datetime.strptime(start_date, '%d.%m.%Y').date().isoformat()
349364

365+
@property
366+
def review_state(self):
367+
return self.config.REVIEW_STATE_MAPPING.get(self.data.get(self.REVIEW_STATE_KEY))
368+
350369
def is_valid(self):
351370
return not self.errors
352371

353372
def validate(self):
354373
self.errors = []
355374
if not self.data.get('guid'):
356-
self.errors.appned(u'"guid" is missing for item')
375+
self.errors.append(u'"guid" is missing for item')
357376

358377
if not set(self.data.keys()) == set(self.config.EXPECTED_DOSSIER_KEYS):
359378
self.errors.append(u"Expected keys changed: missing: %s, additional %s" % (
@@ -367,9 +386,6 @@ def validate(self):
367386
if self.data.get(u'gesch\xe4ftsart') not in self.config.PARENT_REFERENCE_MAPPING:
368387
self.errors.append(u"Unhandled parent reference: '%s'" % self.data.get(self.PARENT_REFERENCE_KEY))
369388

370-
if self.data.get(self.FOLDERS_KEY):
371-
self.errors.append(u"not implemented '%s'" % self.FOLDERS_KEY)
372-
373389
def print_validation_errors(self):
374390
if self.is_valid():
375391
return
@@ -383,13 +399,36 @@ def print_validation_errors(self):
383399

384400
def folders(self):
385401
# subdossiers
402+
folders_by_reference = {}
386403
for item in self.data.get(self.FOLDERS_KEY, []):
387-
raise NotImplemented
388-
yield item
404+
folder = CmiFolderData(item, self.config, self.path, None)
405+
if folder.reference in folders_by_reference:
406+
raise NotImplementedError("Duplicated reference")
407+
folders_by_reference[folder.reference] = folder
408+
409+
for folder in folders_by_reference.values():
410+
parentfolder_reference = folder.data.get('parentordner')
411+
if parentfolder_reference:
412+
folder.parent = folders_by_reference.get(parentfolder_reference)
413+
else:
414+
folder.parent = self
415+
416+
return folders_by_reference.values()
417+
418+
def lookup_folder(self, guid):
419+
if not guid:
420+
return None
421+
422+
for folder in self.folders():
423+
if folder.reference == guid:
424+
return folder
425+
426+
return None
389427

390428
def documents(self):
391429
for item in self.data.get(self.DOCUMENTS_KEY, []):
392-
yield CmiDocumentData(item, self.config, self.path, self)
430+
parent = self.lookup_folder(item.get('parentordner')) or self
431+
yield CmiDocumentData(item, self.config, self.path, parent)
393432

394433
def convert(self):
395434
return {
@@ -399,14 +438,13 @@ def convert(self):
399438
u"title": self.data.get('titel'),
400439
u"end": self.end_date,
401440
u"start": self.start_date,
402-
u"review_state": self.config.REVIEW_STATE_MAPPING.get(self.data.get(self.REVIEW_STATE_KEY)),
441+
u"review_state": self.review_state,
403442
u"parent_reference": self.config.PARENT_REFERENCE_MAPPING.get(self.data.get(self.PARENT_REFERENCE_KEY)),
404443
u"responsible": self.config.RESPONSIBLE,
405444
}
406445

407446

408447
class CmiDocumentData(object):
409-
410448
def __init__(self, data, config, parent_path, parent):
411449
self.data = data
412450
self.config = config
@@ -422,6 +460,10 @@ def path(self):
422460
def file_name(self):
423461
return self.data.get('fileContent', '')
424462

463+
@property
464+
def parent_reference(self):
465+
return self.data.get('parentordner') or self.data.get('geschaeft')
466+
425467
@property
426468
def file_extension(self):
427469
return self.file_name.split('.')[-1]
@@ -446,12 +488,12 @@ def validate(self):
446488
if not os.path.exists(self.file_path):
447489
self.errors.append(u'file does not exists: %s' % self.file_path)
448490

491+
if not self.parent_reference == self.parent.reference:
492+
self.errors.append(u'the parent folder seems to be invalid')
493+
449494
if not set(self.data.keys()) == self.config.EXPECTED_DOCUMENT_KEYS:
450495
self.errors.append(u"Expected keys changed")
451496

452-
if self.data.get('parentordner'):
453-
self.errors.append(u"not implemented 'parentordner'")
454-
455497
def print_validation_errors(self):
456498
if self.is_valid():
457499
return
@@ -468,16 +510,81 @@ def copy_file_to_bundle(self):
468510

469511
def convert(self):
470512
return {
471-
u"_creator": u"zopemaster",
513+
u"_creator": self.config.CREATOR,
472514
u"guid": self.data.get('guid'),
473515
u"description": self.data.get('bemerkung'),
474516
u"title": self.data.get('titel'),
475517
u"review_state": u"document-state-draft",
476-
u"parent_guid": self.parent.reference,
518+
u"parent_guid": self.parent_reference,
477519
u"filepath": self.bundle_file_path
478520
}
479521

480522

523+
class CmiFolderData(object):
524+
def __init__(self, data, config, parent_path, parent):
525+
self.data = data
526+
self.config = config
527+
self.parent_path = parent_path
528+
self.parent = parent
529+
self.errors = []
530+
531+
@property
532+
def path(self):
533+
return os.path.join(self.parent_path, self.data.get('guid', ''))
534+
535+
@property
536+
def reference(self):
537+
return self.data.get('guid')
538+
539+
@property
540+
def review_state(self):
541+
return self.parent.review_state
542+
543+
@property
544+
def parent_reference(self):
545+
if self.data.get('parentordner'):
546+
print("Is sub subdossier: {}".format(self.reference))
547+
return self.data.get('parentordner') or self.data.get('geschaeft')
548+
549+
def is_valid(self):
550+
return not self.errors
551+
552+
def validate(self):
553+
self.errors = []
554+
if not self.data.get('guid'):
555+
self.errors.append(u'"guid" is missing for item')
556+
557+
if not self.parent_reference == self.parent.reference:
558+
self.errors.append(u'the parent folder seems to be invalid')
559+
560+
if not set(self.data.keys()) == set(self.config.EXPECTED_SUBDOSSIER_KEYS):
561+
self.errors.append(u"Expected keys changed: missing: %s, additional %s" % (
562+
set(self.config.EXPECTED_SUBDOSSIER_KEYS) - set(self.data.keys()),
563+
set(self.data.keys()) - set(self.config.EXPECTED_SUBDOSSIER_KEYS)
564+
))
565+
566+
def print_validation_errors(self):
567+
if self.is_valid():
568+
return
569+
570+
print(u"Validation errors for folder item with guid: '%s':" % self.data.get('guid'))
571+
for error in self.errors:
572+
print(error)
573+
574+
print(u"------------------------------------------------")
575+
print(u"")
576+
577+
def convert(self):
578+
return {
579+
u"_creator": self.config.CREATOR,
580+
u"guid": self.reference,
581+
u"title": self.data.get('titel'),
582+
u"review_state": self.review_state,
583+
u"parent_guid": self.parent_reference,
584+
u"responsible": self.config.RESPONSIBLE,
585+
}
586+
587+
481588
class SchemaValidator(object):
482589
def __init__(self):
483590
self.json_schemas = self.load_schemas()

0 commit comments

Comments
 (0)