From f0d8f47a685aada23c7076685a0585f6742af58b Mon Sep 17 00:00:00 2001 From: k1o0 Date: Mon, 15 Apr 2024 17:06:00 +0300 Subject: [PATCH] Dev (#848) * Permit later versions of ONE in requirements * remove to internal method in serialiser * Include reference_weight_pct and zscore_weight_pct in water restriction serializers * Min weight plot threshold a constant in lab settings * Don't commit all changed files in Gihub actions! --------- Co-authored-by: github-actions Co-authored-by: Mayo Faulkner Co-authored-by: k1o0 --- .github/workflows/main.yml | 3 ++- alyx/actions/views.py | 5 ++++- alyx/actions/water_control.py | 5 ++++- alyx/alyx/__init__.py | 2 +- alyx/alyx/settings_lab_template.py | 2 +- alyx/experiments/serializers.py | 9 --------- alyx/experiments/tests_rest.py | 3 +++ alyx/subjects/serializers.py | 10 ++++++++++ requirements.txt | 2 +- scripts/sync_ucl/prune_cortexlab.py | 3 +-- 10 files changed, 27 insertions(+), 17 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 59ed80d5..6795d534 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -86,7 +86,8 @@ jobs: run: | git config user.name github-actions git config user.email github-actions@github.com - git commit -m "GitHub Actions generated requirements_frozen.txt" -a + git add requirements_frozen.txt + git commit -m "GitHub Actions generated requirements_frozen.txt" git push # Docker steps only run when master branch pushed to directly OR when a PR is merged diff --git a/alyx/actions/views.py b/alyx/actions/views.py index bec3461f..2ecd7287 100644 --- a/alyx/actions/views.py +++ b/alyx/actions/views.py @@ -457,7 +457,10 @@ def get(self, request, format=None, nickname=None): end_date = request.query_params.get('end_date', None) subject = Subject.objects.get(nickname=nickname) records = subject.water_control.to_jsonable(start_date=start_date, end_date=end_date) - data = {'subject': nickname, 'implant_weight': subject.implant_weight, 'records': records} + data = {'subject': nickname, 'implant_weight': subject.implant_weight, + 'reference_weight_pct': subject.water_control.reference_weight_pct, + 'zscore_weight_pct': subject.water_control.zscore_weight_pct, + 'records': records} return Response(data) diff --git a/alyx/actions/water_control.py b/alyx/actions/water_control.py index b27cc2fd..ef6ad685 100644 --- a/alyx/actions/water_control.py +++ b/alyx/actions/water_control.py @@ -8,6 +8,7 @@ from operator import attrgetter, itemgetter import os.path as op +from django.conf import settings from django.urls import reverse from django.utils.html import format_html from django.http import HttpResponse @@ -563,7 +564,9 @@ def water_control(subject): implant_weight=subject.implant_weight ) wc.add_threshold(percentage=rw_pct + zw_pct, bgcolor=PALETTE['orange'], fgcolor='#FFC28E') - wc.add_threshold(percentage=.7, bgcolor=PALETTE['red'], fgcolor='#F08699', line_style='--') + if absolute_min := settings.WEIGHT_THRESHOLD: + wc.add_threshold( + percentage=absolute_min, bgcolor=PALETTE['red'], fgcolor='#F08699', line_style='--') # Water restrictions. wrs = sorted(list(subject.actions_waterrestrictions.all()), key=attrgetter('start_time')) # Reference weight. diff --git a/alyx/alyx/__init__.py b/alyx/alyx/__init__.py index 04af162b..f4ba5b3e 100644 --- a/alyx/alyx/__init__.py +++ b/alyx/alyx/__init__.py @@ -1 +1 @@ -VERSION = __version__ = '2.0.0' +VERSION = __version__ = '2.1.0' diff --git a/alyx/alyx/settings_lab_template.py b/alyx/alyx/settings_lab_template.py index 4f8ac7a8..29c2e836 100644 --- a/alyx/alyx/settings_lab_template.py +++ b/alyx/alyx/settings_lab_template.py @@ -10,7 +10,7 @@ DEFAULT_PROTOCOL = '1' SUPERUSERS = ('root',) STOCK_MANAGERS = ('root',) -WEIGHT_THRESHOLD = 0.75 +WEIGHT_THRESHOLD = 0.8 # Absolute minimum weight threshold (red line in plots) DEFAULT_LAB_NAME = 'defaultlab' WATER_RESTRICTIONS_EDITABLE = False # if set to True, all users can edit water restrictions DEFAULT_LAB_PK = '4027da48-7be3-43ec-a222-f75dffe36872' diff --git a/alyx/experiments/serializers.py b/alyx/experiments/serializers.py index 92ad06a8..9e72f688 100644 --- a/alyx/experiments/serializers.py +++ b/alyx/experiments/serializers.py @@ -46,15 +46,6 @@ class TrajectoryEstimateSerializer(serializers.ModelSerializer): queryset=CoordinateSystem.objects.all(), ) - def to_internal_value(self, data): - if data.get('chronic_insertion', None) is None: - data['chronic_insertion'] = None - - if data.get('probe_insertion', None) is None: - data['probe_insertion'] = None - - return super(TrajectoryEstimateSerializer, self).to_internal_value(data) - class Meta: model = TrajectoryEstimate fields = '__all__' diff --git a/alyx/experiments/tests_rest.py b/alyx/experiments/tests_rest.py index c2138d1e..412a4a6b 100644 --- a/alyx/experiments/tests_rest.py +++ b/alyx/experiments/tests_rest.py @@ -185,6 +185,7 @@ def test_create_list_delete_trajectory(self): # create a trajectory url = reverse('trajectoryestimate-list') tdict = {'probe_insertion': alyx_insertion['id'], + 'chronic_insertion': None, 'x': -4521.2, 'y': 2415.0, 'z': 0, @@ -216,6 +217,7 @@ def test_create_list_delete_channels(self): # create the probe insertion pi = self.ar(self.post(reverse('probeinsertion-list'), self.dict_insertion), 201) tdict = {'probe_insertion': pi['id'], + 'chronic_insertion': None, 'x': -4521.2, 'y': 2415.0, 'z': 0, @@ -273,6 +275,7 @@ def test_chronic_insertion(self): # create a trajectory and attach it to the chronic insertion traj_dict = {'chronic_insertion': ci['id'], + 'probe_insertion': None, 'x': -4521.2, 'y': 2415.0, 'z': 0, diff --git a/alyx/subjects/serializers.py b/alyx/subjects/serializers.py index b6a2877d..e9f954bf 100644 --- a/alyx/subjects/serializers.py +++ b/alyx/subjects/serializers.py @@ -28,10 +28,18 @@ def get_reference_weight(self, obj): def get_last_water_restriction(self, obj): return obj.water_control.water_restriction_at() + def get_reference_weight_pct(self, obj): + return obj.water_control.reference_weight_pct + + def get_zscore_weight_pct(self, obj): + return obj.water_control.zscore_weight_pct + expected_water = serializers.SerializerMethodField() remaining_water = serializers.SerializerMethodField() reference_weight = serializers.SerializerMethodField() last_water_restriction = serializers.SerializerMethodField() + reference_weight_pct = serializers.SerializerMethodField() + zscore_weight_pct = serializers.SerializerMethodField() class WaterRestrictedSubjectListSerializer(_WaterRestrictionBaseSerializer): @@ -42,6 +50,8 @@ class Meta: 'remaining_water', 'reference_weight', 'last_water_restriction', + 'reference_weight_pct', + 'zscore_weight_pct' ) lookup_field = 'nickname' diff --git a/requirements.txt b/requirements.txt index cdf85406..bfa1e696 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,4 +28,4 @@ python-magic pytz structlog>=21.5.0 webdavclient3 -ONE-api~=2.7rc0 +ONE-api>=2.7 diff --git a/scripts/sync_ucl/prune_cortexlab.py b/scripts/sync_ucl/prune_cortexlab.py index 1e04db2e..3f24ee2e 100755 --- a/scripts/sync_ucl/prune_cortexlab.py +++ b/scripts/sync_ucl/prune_cortexlab.py @@ -45,8 +45,7 @@ # the sessions should also have the cortexlab lab field properly labeled before import if Lab.objects.using('cortexlab').filter(name='cortexlab').count() == 0: - lab_dict = {'pk': CORTEX_LAB_PK, - 'name': 'cortexlab'} + lab_dict = {'pk': CORTEX_LAB_PK, 'name': 'cortexlab'} lab = Lab.objects.using('cortexlab').create(**lab_dict) lab.save() else: