boris-behav-obs 8.27.2__tar.gz → 8.27.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/PKG-INFO +1 -1
  2. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/export_events.py +7 -0
  3. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/preferences_ui.py +2 -2
  4. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/project.py +4 -9
  5. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/project_import_export.py +26 -17
  6. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/version.py +2 -2
  7. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/PKG-INFO +1 -1
  8. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/pyproject.toml +2 -2
  9. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/LICENSE.TXT +0 -0
  10. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/MANIFEST.in +0 -0
  11. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/README.TXT +0 -0
  12. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/README.rst +0 -0
  13. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/__init__.py +0 -0
  14. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/__main__.py +0 -0
  15. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/about.py +0 -0
  16. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/add_modifier.py +0 -0
  17. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/add_modifier_ui.py +0 -0
  18. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/advanced_event_filtering.py +0 -0
  19. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/behav_coding_map_creator.py +0 -0
  20. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/behavior_binary_table.py +0 -0
  21. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/behaviors_coding_map.py +0 -0
  22. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/boris_cli.py +0 -0
  23. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/cmd_arguments.py +0 -0
  24. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/coding_pad.py +0 -0
  25. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/config.py +0 -0
  26. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/config_file.py +0 -0
  27. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/connections.py +0 -0
  28. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/converters.py +0 -0
  29. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/converters_ui.py +0 -0
  30. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/cooccurence.py +0 -0
  31. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/core.py +0 -0
  32. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/core_qrc.py +0 -0
  33. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/core_ui.py +0 -0
  34. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/db_functions.py +0 -0
  35. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/dev.py +0 -0
  36. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/dialog.py +0 -0
  37. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/duration_widget.py +0 -0
  38. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/edit_event.py +0 -0
  39. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/edit_event_ui.py +0 -0
  40. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/event_operations.py +0 -0
  41. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/events_cursor.py +0 -0
  42. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/events_snapshots.py +0 -0
  43. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/exclusion_matrix.py +0 -0
  44. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/export_observation.py +0 -0
  45. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/external_processes.py +0 -0
  46. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/geometric_measurement.py +0 -0
  47. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/gui_utilities.py +0 -0
  48. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/image_overlay.py +0 -0
  49. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/import_observations.py +0 -0
  50. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/irr.py +0 -0
  51. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/latency.py +0 -0
  52. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/map_creator.py +0 -0
  53. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/measurement_widget.py +0 -0
  54. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/media_file.py +0 -0
  55. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/menu_options.py +0 -0
  56. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/modifiers_coding_map.py +0 -0
  57. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/mpv.py +0 -0
  58. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/mpv2.py +0 -0
  59. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/observation.py +0 -0
  60. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/observation_operations.py +0 -0
  61. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/observation_ui.py +0 -0
  62. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/observations_list.py +0 -0
  63. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/otx_parser.py +0 -0
  64. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/param_panel.py +0 -0
  65. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/param_panel_ui.py +0 -0
  66. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/player_dock_widget.py +0 -0
  67. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/plot_data_module.py +0 -0
  68. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/plot_events.py +0 -0
  69. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/plot_events_rt.py +0 -0
  70. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/plot_spectrogram_rt.py +0 -0
  71. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/plot_waveform_rt.py +0 -0
  72. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/__init__.py +0 -0
  73. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/const.py +0 -0
  74. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/dict.py +0 -0
  75. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/func.py +0 -0
  76. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/interval.py +0 -0
  77. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/portion/io.py +0 -0
  78. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/preferences.py +0 -0
  79. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/project_functions.py +0 -0
  80. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/project_ui.py +0 -0
  81. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/__init__.py +0 -0
  82. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/__main__.py +0 -0
  83. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/colorsystem.py +0 -0
  84. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/dark/__init__.py +0 -0
  85. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/dark/darkstyle_rc.py +0 -0
  86. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/dark/palette.py +0 -0
  87. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/example/__init__.py +0 -0
  88. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/example/__main__.py +0 -0
  89. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/example/ui/__init__.py +0 -0
  90. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/light/__init__.py +0 -0
  91. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/light/lightstyle_rc.py +0 -0
  92. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/light/palette.py +0 -0
  93. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/palette.py +0 -0
  94. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/utils/__init__.py +0 -0
  95. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/utils/__main__.py +0 -0
  96. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/utils/images.py +0 -0
  97. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qdarkstyle/utils/scss.py +0 -0
  98. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qrc_boris.py +0 -0
  99. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/qrc_boris5.py +0 -0
  100. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/select_modifiers.py +0 -0
  101. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/select_observations.py +0 -0
  102. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/select_subj_behav.py +0 -0
  103. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/state_events.py +0 -0
  104. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/subjects_pad.py +0 -0
  105. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/synthetic_time_budget.py +0 -0
  106. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/time_budget_functions.py +0 -0
  107. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/time_budget_widget.py +0 -0
  108. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/transitions.py +0 -0
  109. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/utilities.py +0 -0
  110. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/video_equalizer.py +0 -0
  111. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/video_equalizer_ui.py +0 -0
  112. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/video_operations.py +0 -0
  113. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/vlc_local.py +0 -0
  114. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris/write_event.py +0 -0
  115. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/SOURCES.txt +0 -0
  116. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
  117. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/entry_points.txt +0 -0
  118. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/requires.txt +0 -0
  119. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/boris_behav_obs.egg-info/top_level.txt +0 -0
  120. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/setup.cfg +0 -0
  121. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_db_functions.py +0 -0
  122. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_export_observation.py +0 -0
  123. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_irr.py +0 -0
  124. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_observation_gui.py +0 -0
  125. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_otx_parser.py +0 -0
  126. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_preferences_gui.py +0 -0
  127. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_project_functions.py +0 -0
  128. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_time_budget.py +0 -0
  129. {boris_behav_obs-8.27.2 → boris_behav_obs-8.27.4}/tests/test_utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boris-behav-obs
3
- Version: 8.27.2
3
+ Version: 8.27.4
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -461,6 +461,8 @@ def export_aggregated_events(self):
461
461
  _, max_modifiers = export_observation.export_aggregated_events(self.pj, parameters, obs_id)
462
462
  tot_max_modifiers = max(tot_max_modifiers, max_modifiers)
463
463
 
464
+ logging.debug(f"tot_max_modifiers: {tot_max_modifiers}")
465
+
464
466
  data_grouped_obs = tablib.Dataset()
465
467
 
466
468
  mem_command: str = "" # remember user choice when file already exists
@@ -517,6 +519,8 @@ def export_aggregated_events(self):
517
519
  if not r:
518
520
  QMessageBox.warning(None, cfg.programName, msg, QMessageBox.Ok | QMessageBox.Default, QMessageBox.NoButton)
519
521
 
522
+ """
523
+ # disabled after introduction of the force_number_modifiers parameter in export_aggregated_events function
520
524
  if len(data_single_obs_sorted) and max_modifiers < tot_max_modifiers:
521
525
  for i in range(tot_max_modifiers - max_modifiers):
522
526
  data_single_obs_sorted.insert_col(
@@ -524,9 +528,12 @@ def export_aggregated_events(self):
524
528
  col=[""] * (len(list(data_single_obs_sorted))),
525
529
  header=f"Modif #{i}",
526
530
  )
531
+ """
532
+
527
533
  data_grouped_obs.extend(data_single_obs_sorted)
528
534
 
529
535
  data_grouped_obs_all = tablib.Dataset(headers=list(fields_type(tot_max_modifiers).keys()))
536
+
530
537
  data_grouped_obs_all.extend(data_grouped_obs)
531
538
  data_grouped_obs_all.title = "Aggregated events"
532
539
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Form implementation generated from reading ui file 'preferences.ui'
3
+ # Form implementation generated from reading ui file 'boris/preferences.ui'
4
4
  #
5
5
  # Created by: PyQt5 UI code generator 5.15.6
6
6
  #
@@ -331,7 +331,7 @@ class Ui_prefDialog(object):
331
331
  self.pb_reset_category_colors.setText(_translate("prefDialog", "Reset colors to default"))
332
332
  self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_colors), _translate("prefDialog", "Plot colors"))
333
333
  self.label_9.setText(_translate("prefDialog", "Toolbar icons size"))
334
- self.cb_darkmode.setText(_translate("prefDialog", "Dark mode"))
334
+ self.cb_darkmode.setText(_translate("prefDialog", "Dark mode (should be necessary to relaunch BORIS)"))
335
335
  self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_interface), _translate("prefDialog", "Interface"))
336
336
  self.pb_refresh.setText(_translate("prefDialog", "Refresh"))
337
337
  self.pbCancel.setText(_translate("prefDialog", "Cancel"))
@@ -578,7 +578,7 @@ class projectDialog(QDialog, Ui_dlgProject):
578
578
  # convert modifier shortcuts
579
579
  if self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).text():
580
580
  modifiers_dict = (
581
- eval(self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).text())
581
+ json.loads(self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).text())
582
582
  if self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).text()
583
583
  else {}
584
584
  )
@@ -593,7 +593,7 @@ class projectDialog(QDialog, Ui_dlgProject):
593
593
  except Exception:
594
594
  logging.warning("error during conversion of modifier short cut to lower case")
595
595
 
596
- self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).setText(str(modifiers_dict))
596
+ self.twBehaviors.item(row, cfg.behavioursFields[cfg.MODIFIERS]).setText(json.dumps(modifiers_dict))
597
597
 
598
598
  def convert_subjects_keys_to_lower_case(self):
599
599
  """
@@ -796,7 +796,7 @@ class projectDialog(QDialog, Ui_dlgProject):
796
796
  else:
797
797
  QMessageBox.information(self, cfg.programName, "Change the behavior type on first column to select a coding map")
798
798
 
799
- # check if double click on category
799
+ # check if double click on behavior type
800
800
  if column == cfg.behavioursFields["type"]:
801
801
  self.behavior_type_doubleclicked(row)
802
802
 
@@ -808,6 +808,7 @@ class projectDialog(QDialog, Ui_dlgProject):
808
808
  if column == cfg.behavioursFields[cfg.BEHAVIOR_CATEGORY]:
809
809
  self.category_doubleclicked(row)
810
810
 
811
+ # check if double click on modifiers
811
812
  if column == cfg.behavioursFields[cfg.MODIFIERS]:
812
813
  # check if behavior has coding map
813
814
  if (
@@ -1735,12 +1736,6 @@ class projectDialog(QDialog, Ui_dlgProject):
1735
1736
  QMessageBox.critical(self, cfg.programName, "Error removing leading/trailing spaces in modifiers")
1736
1737
 
1737
1738
  else:
1738
- """
1739
- if row["modifiers"]:
1740
- row["modifiers"] = eval(row["modifiers"])
1741
- else:
1742
- row["modifiers"] = {}
1743
- """
1744
1739
  row["modifiers"] = json.loads(row["modifiers"]) if row["modifiers"] else {}
1745
1740
  else:
1746
1741
  row[field] = ""
@@ -133,7 +133,7 @@ def export_ethogram(self) -> None:
133
133
  # modifiers
134
134
  if self.twBehaviors.item(r, cfg.behavioursFields[cfg.MODIFIERS]).text():
135
135
  # modifiers a string
136
- modifiers_dict = eval(self.twBehaviors.item(r, cfg.behavioursFields[cfg.MODIFIERS]).text())
136
+ modifiers_dict = json.loads(self.twBehaviors.item(r, cfg.behavioursFields[cfg.MODIFIERS]).text())
137
137
  modifiers_list = []
138
138
  for key in modifiers_dict:
139
139
  values = ",".join(modifiers_dict[key]["values"])
@@ -350,19 +350,22 @@ def import_ethogram_from_dict(self, project: dict):
350
350
  item.setBackground(QColor(230, 230, 230))
351
351
 
352
352
  else:
353
- if field == cfg.MODIFIERS and isinstance(project[cfg.ETHOGRAM][i][field], str):
354
- modif_set_dict = {}
355
- if project[cfg.ETHOGRAM][i][field]:
356
- modif_set_list = project[cfg.ETHOGRAM][i][field].split("|")
357
- for modif_set in modif_set_list:
358
- modif_set_dict[str(len(modif_set_dict))] = {
359
- "name": "",
360
- "type": cfg.SINGLE_SELECTION,
361
- "values": modif_set.split(","),
362
- }
363
- project[cfg.ETHOGRAM][i][field] = dict(modif_set_dict)
364
-
365
- item.setText(str(project[cfg.ETHOGRAM][i][field]))
353
+ if field == cfg.MODIFIERS:
354
+ if isinstance(project[cfg.ETHOGRAM][i][field], str):
355
+ modif_set_dict = {}
356
+ if project[cfg.ETHOGRAM][i][field]:
357
+ modif_set_list = project[cfg.ETHOGRAM][i][field].split("|")
358
+ for modif_set in modif_set_list:
359
+ modif_set_dict[str(len(modif_set_dict))] = {
360
+ "name": "",
361
+ "type": cfg.SINGLE_SELECTION,
362
+ "values": modif_set.split(","),
363
+ }
364
+ project[cfg.ETHOGRAM][i][field] = dict(modif_set_dict)
365
+ else:
366
+ item.setText(json.dumps(project[cfg.ETHOGRAM][i][field]))
367
+ else:
368
+ item.setText(project[cfg.ETHOGRAM][i][field])
366
369
 
367
370
  if field not in cfg.ETHOGRAM_EDITABLE_FIELDS:
368
371
  item.setFlags(Qt.ItemIsEnabled)
@@ -425,7 +428,10 @@ def load_dataframe_into_behaviors_tablewidget(self, df: pd.DataFrame) -> int:
425
428
  for _, row in df.iterrows():
426
429
  behavior = {"coding map": ""}
427
430
  for x in ethogram_header:
428
- behavior[x] = row[ethogram_header[x].upper()] if str(row[ethogram_header[x].upper()]) != "nan" else ""
431
+ if ethogram_header[x].upper() in row:
432
+ behavior[x] = row[ethogram_header[x].upper()] if str(row[ethogram_header[x].upper()]) != "nan" else ""
433
+ else:
434
+ behavior[x] = ""
429
435
 
430
436
  self.twBehaviors.setRowCount(self.twBehaviors.rowCount() + 1)
431
437
 
@@ -460,8 +466,11 @@ def load_dataframe_into_behaviors_tablewidget(self, df: pd.DataFrame) -> int:
460
466
 
461
467
 
462
468
  def import_behaviors_from_project(self):
469
+ """
470
+ import ethogram from a BORIS project file
471
+ """
463
472
  fn = QFileDialog().getOpenFileName(
464
- self, "Import behaviors from project file", "", ("Project files (*.boris *.boris.gz);;" "All files (*)")
473
+ self, "Import behaviors from BORIS project file", "", ("Project files (*.boris *.boris.gz);;" "All files (*)")
465
474
  )
466
475
  file_name = fn[0] if type(fn) is tuple else fn
467
476
 
@@ -474,7 +483,7 @@ def import_behaviors_from_project(self):
474
483
 
475
484
  def import_behaviors_from_text_file(self):
476
485
  """
477
- Import behaviors from text file (CSV or TSV)
486
+ Import ethogram from text file (CSV or TSV)
478
487
  """
479
488
 
480
489
  if self.twBehaviors.rowCount():
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "8.27.2"
24
- __version_date__ = "2024-07-03"
23
+ __version__ = "8.27.4"
24
+ __version_date__ = "2024-08-20"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boris-behav-obs
3
- Version: 8.27.2
3
+ Version: 8.27.4
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "boris-behav-obs"
3
- version = "8.27.2"
3
+ version = "8.27.4"
4
4
  description = "BORIS - Behavioral Observation Research Interactive Software"
5
5
  authors = [{ name="Olivier Friard", email="olivier.friard@unito.it" }]
6
6
  readme = "README.rst"
@@ -58,7 +58,7 @@ line-length = 140
58
58
  exclude = ["*_ui.py", "mpv*"]
59
59
 
60
60
  [tool.bumpver]
61
- current_version = "8.27.2"
61
+ current_version = "8.27.4"
62
62
  version_pattern = "MAJOR.MINOR.PATCH"
63
63
 
64
64