24
24
from senaite .core .catalog import ANALYSIS_CATALOG
25
25
from senaite .core .catalog import REPORT_CATALOG
26
26
from senaite .core .catalog import SAMPLE_CATALOG
27
+ from senaite .core .catalog import SETUP_CATALOG
27
28
from senaite .core .catalog .report_catalog import ReportCatalog
28
29
from senaite .core .config import PROJECTNAME as product
29
30
from senaite .core .setuphandlers import _run_import_step
@@ -79,6 +80,7 @@ def upgrade(tool):
79
80
fix_interface_interpretation_template (portal )
80
81
fix_unassigned_samples (portal )
81
82
move_arreports_to_report_catalog (portal )
83
+ migrate_analysis_services_fields (portal )
82
84
migrate_analyses_fields (portal )
83
85
84
86
logger .info ("{0} upgraded to version {1}" .format (product , version ))
@@ -284,8 +286,35 @@ def move_arreports_to_report_catalog(portal):
284
286
logger .info ("Move ARReports to SENAITE Report Catalog [DONE]" )
285
287
286
288
289
+ def migrate_analysis_services_fields (portal ):
290
+ """Migrate fields in AnalysisService objects
291
+ """
292
+ logger .info ("Migrate Analysis Services Fields ..." )
293
+ cat = api .get_tool (SETUP_CATALOG )
294
+ query = {"portal_type" : ["AnalysisService" ]}
295
+ brains = cat .search (query )
296
+ total = len (brains )
297
+
298
+ for num , brain in enumerate (brains ):
299
+ if num and num % 100 == 0 :
300
+ logger .info ("Migrated {0}/{1} analyses fields" .format (num , total ))
301
+
302
+ obj = api .get_object (brain )
303
+
304
+ # Migrate UDL FixedPointField -> StringField
305
+ migrate_udl_field_to_string (obj )
306
+
307
+ # Migrate LDL FixedPointField -> StringField
308
+ migrate_ldl_field_to_string (obj )
309
+
310
+ # Flush the object from memory
311
+ obj ._p_deactivate () # noqa
312
+
313
+ logger .info ("Migrate Analysis Services [DONE]" )
314
+
315
+
287
316
def migrate_analyses_fields (portal ):
288
- """return all analyses
317
+ """Migrate fields in Analysis/ReferenceAnalysis objects
289
318
"""
290
319
logger .info ("Migrate Analyses Fields ..." )
291
320
cat = api .get_tool (ANALYSIS_CATALOG )
@@ -297,35 +326,82 @@ def migrate_analyses_fields(portal):
297
326
if num and num % 100 == 0 :
298
327
logger .info ("Migrated {0}/{1} analyses fields" .format (num , total ))
299
328
300
- analysis = api .get_object (brain )
329
+ obj = api .get_object (brain )
301
330
302
331
# Migrate Uncertainty FixedPointField -> StringField
303
- migrate_uncertainty_field_to_string (analysis )
332
+ migrate_uncertainty_field_to_string (obj )
333
+
334
+ # Migrate UDL FixedPointField -> StringField
335
+ migrate_udl_field_to_string (obj )
336
+
337
+ # Migrate LDL FixedPointField -> StringField
338
+ migrate_ldl_field_to_string (obj )
304
339
305
340
# Flush the object from memory
306
- analysis ._p_deactivate () # noqa
341
+ obj ._p_deactivate () # noqa
307
342
308
343
logger .info ("Migrate Analyses Fields [DONE]" )
309
344
310
345
311
- def migrate_uncertainty_field_to_string (analysis ):
346
+ def migrate_udl_field_to_string (obj ):
347
+ """Migrate the UDL field to string
348
+ """
349
+ field = obj .getField ("UpperDetectionLimit" )
350
+ value = field .get (obj )
351
+
352
+ # Leave any other value type unchanged
353
+ if isinstance (value , tuple ):
354
+ migrated_value = fixed_point_value_to_string (value , 7 )
355
+ logger .info ("Migrating UDL field of %s: %s -> %s" % (
356
+ api .get_path (obj ), value , migrated_value ))
357
+ value = migrated_value
358
+
359
+ # set the new value
360
+ field .set (obj , value )
361
+
362
+
363
+ def migrate_ldl_field_to_string (obj ):
364
+ """Migrate the LDL field to string
365
+ """
366
+ field = obj .getField ("LowerDetectionLimit" )
367
+ value = field .get (obj )
368
+
369
+ # Leave any other value type unchanged
370
+ if isinstance (value , tuple ):
371
+ migrated_value = fixed_point_value_to_string (value , 7 )
372
+ logger .info ("Migrating LDL field of %s: %s -> %s" % (
373
+ api .get_path (obj ), value , migrated_value ))
374
+ value = migrated_value
375
+
376
+ # set the new value
377
+ field .set (obj , value )
378
+
379
+
380
+ def migrate_uncertainty_field_to_string (obj ):
312
381
"""Migrate the uncertainty field to string
313
382
"""
314
- field = analysis .getField ("Uncertainty" )
315
- value = field .get (analysis )
383
+ field = obj .getField ("Uncertainty" )
384
+ value = field .get (obj )
316
385
317
386
# Leave any other value type unchanged
318
387
if isinstance (value , tuple ):
319
- value = fixed_point_value_to_string (value )
388
+ migrated_value = fixed_point_value_to_string (value , 10 )
389
+ logger .info ("Migrating Uncertainty field of %s: %s -> %s" % (
390
+ api .get_pat (obj ), value , migrated_value ))
391
+ value = migrated_value
320
392
321
393
# set the new value
322
- field .set (analysis , value )
394
+ field .set (obj , value )
323
395
324
396
325
- def fixed_point_value_to_string (value ):
397
+ def fixed_point_value_to_string (value , precision ):
326
398
"""Code taken and modified from FixedPointField get method
399
+
400
+ IMPORTANT: The precision has to be the same as it was initially
401
+ defined in the field when the value was set!
402
+ Otherwise, values > 0, e.g. 0.0005 are converted wrong!
327
403
"""
328
- template = "%%s%%d.%%0%dd" % 10
404
+ template = "%%s%%d.%%0%dd" % precision
329
405
front , fra = value
330
406
sign = ""
331
407
# Numbers between -1 and 0 are store with a negative fraction.
0 commit comments