@@ -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\xe4 ftsart' ) 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
408447class 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+
481588class SchemaValidator (object ):
482589 def __init__ (self ):
483590 self .json_schemas = self .load_schemas ()
0 commit comments