Skip to content

Commit

Permalink
Merge branch 'workflows' of https://github.com/shapiromatron/hawc int…
Browse files Browse the repository at this point in the history
…o workflows
  • Loading branch information
caseyhans committed Dec 5, 2023
2 parents c6993f0 + efc3643 commit 87cc57e
Show file tree
Hide file tree
Showing 30 changed files with 1,164 additions and 619 deletions.
7 changes: 6 additions & 1 deletion frontend/shared/utils/HAWCUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,12 @@ class HAWCUtils {
handleChange = () => {
const selector = `#detail-${$selectEl.val()}`,
clone = $insertItems.find(selector).clone();
$insertEl.fadeOut(() => $insertEl.html(clone).fadeIn());
$insertEl.fadeOut(() =>
$insertEl
.html(clone)
.trigger("select:change")
.fadeIn()
);
};
$selectEl.on("change", handleChange).trigger("change");
}
Expand Down
20 changes: 20 additions & 0 deletions hawc/apps/summary/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,26 @@ class VisualType(models.IntegerChoices):
PLOTLY = 7, "plotly"


VISUAL_EVIDENCE_CHOICES = {
VisualType.BIOASSAY_AGGREGATION: {StudyType.BIOASSAY},
VisualType.BIOASSAY_CROSSVIEW: {StudyType.BIOASSAY},
VisualType.ROB_HEATMAP: {StudyType.BIOASSAY, StudyType.EPI, StudyType.IN_VITRO},
VisualType.ROB_BARCHART: {StudyType.BIOASSAY, StudyType.EPI, StudyType.IN_VITRO},
VisualType.LITERATURE_TAGTREE: {StudyType.OTHER},
VisualType.EXTERNAL_SITE: {StudyType.OTHER},
VisualType.EXPLORE_HEATMAP: {StudyType.OTHER},
VisualType.PLOTLY: {StudyType.OTHER},
}


def get_default_evidence_type(visual_type: VisualType) -> StudyType:
"""Return StudyType for visual if only one option exists, otherwise raise ValueError."""
choices = VISUAL_EVIDENCE_CHOICES[visual_type]
if len(choices) > 1:
raise ValueError(f"No default evidence type for visual {visual_type}; multiple exist.")
return next(iter(choices))


class SortOrder(models.TextChoices):
SC = "short_citation", "Short Citation"
OC = "overall_confidence", "Final Study Confidence"
Expand Down
45 changes: 32 additions & 13 deletions hawc/apps/summary/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,12 @@ def get_cancel_url(self):
class VisualForm(forms.ModelForm):
class Meta:
model = models.Visual
exclude = ("assessment", "visual_type", "prefilters")
exclude = ("assessment", "visual_type", "evidence_type", "prefilters")

def __init__(self, *args, **kwargs):
assessment = kwargs.pop("parent", None)
visual_type = kwargs.pop("visual_type", None)
evidence_type = kwargs.pop("evidence_type", None)
super().__init__(*args, **kwargs)
if "settings" in self.fields:
self.fields["settings"].widget.attrs["rows"] = 2
Expand All @@ -149,6 +150,8 @@ def __init__(self, *args, **kwargs):
constants.VisualType.PLOTLY,
]:
self.fields["sort_order"].widget = forms.HiddenInput()
if self.instance.id is None:
self.instance.evidence_type = evidence_type

def setHelper(self):
for fld in list(self.fields.keys()):
Expand Down Expand Up @@ -191,6 +194,14 @@ def clean_caption(self):
validators.validate_hyperlinks(caption)
return validators.clean_html(caption)

def clean_evidence_type(self):
visual_type = self.cleaned_data["visual_type"]
evidence_type = self.cleaned_data["evidence_type"]
if evidence_type not in constants.VISUAL_EVIDENCE_CHOICES[visual_type]:
raise forms.ValidationError(
f"Invalid evidence type {evidence_type} for visual {visual_type}."
)


class VisualModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
Expand Down Expand Up @@ -239,7 +250,15 @@ def __init__(self, *args, **kwargs):

class Meta:
model = models.Visual
exclude = ("assessment", "visual_type", "settings", "prefilters", "studies", "sort_order")
exclude = (
"assessment",
"visual_type",
"evidence_type",
"settings",
"prefilters",
"studies",
"sort_order",
)


class CrossviewForm(VisualForm):
Expand All @@ -257,17 +276,17 @@ def __init__(self, *args, **kwargs):
self.fields["dose_units"].queryset = DoseUnits.objects.get_animal_units(
self.instance.assessment
)
self.prefilter_cls = prefilters.VisualTypePrefilter.from_visual_type(
constants.VisualType.BIOASSAY_CROSSVIEW
).value
self.prefilter_cls = prefilters.get_prefilter_cls(
self.instance.visual_type, self.instance.evidence_type, self.instance.assessment
)
self.fields["prefilters"] = DynamicFormField(
prefix="prefilters", form_class=self._get_prefilter_form, label=""
)
self.helper = self.setHelper()

class Meta:
model = models.Visual
exclude = ("assessment", "visual_type", "endpoints", "studies")
exclude = ("assessment", "visual_type", "evidence_type", "endpoints", "studies")


class RoBForm(VisualForm):
Expand All @@ -282,17 +301,17 @@ def _get_prefilter_form(self, data, **form_kwargs):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.prefilter_cls = prefilters.VisualTypePrefilter.from_visual_type(
constants.VisualType.ROB_BARCHART
).value
self.prefilter_cls = prefilters.get_prefilter_cls(
self.instance.visual_type, self.instance.evidence_type, self.instance.assessment
)
self.fields["prefilters"] = DynamicFormField(
prefix="prefilters", form_class=self._get_prefilter_form, label=""
)
self.helper = self.setHelper()

class Meta:
model = models.Visual
exclude = ("assessment", "visual_type", "dose_units", "endpoints")
exclude = ("assessment", "visual_type", "evidence_type", "dose_units", "endpoints")


class TagtreeForm(VisualForm):
Expand Down Expand Up @@ -703,9 +722,9 @@ def __init__(self, *args, **kwargs):
if self.instance.id is None:
self.instance.evidence_type = evidence_type

self.prefilter_cls = prefilters.StudyTypePrefilter.from_study_type(
self.instance.evidence_type, self.instance.assessment
).value
self.prefilter_cls = prefilters.get_prefilter_cls(
None, self.instance.evidence_type, self.instance.assessment
)
self.fields["prefilters"] = DynamicFormField(
prefix="prefilters", form_class=self._get_prefilter_form, label=""
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

from django.db import migrations, models

from hawc.apps.summary.prefilters import StudyTypePrefilter
from hawc.apps.summary.prefilters import EndpointPrefilter, get_prefilter_cls

logger = logging.getLogger(__name__)

mapping = {
StudyTypePrefilter.BIOASSAY: {
EndpointPrefilter.BIOASSAY.value: {
"published_only": "animal_group__experiment__study__published",
"studies": "animal_group__experiment__study__in",
"systems": "system__in",
Expand All @@ -18,30 +18,30 @@
"effect_subtypes": "effect_subtype__in",
"effect_tags": "effects__in",
},
StudyTypePrefilter.EPIV1: {
EndpointPrefilter.EPIV1.value: {
"published_only": "study_population__study__published",
"studies": "study_population__study__in",
"systems": "system__in",
"effects": "effect__in",
"effect_tags": "effects__in",
},
StudyTypePrefilter.EPIV2: {
EndpointPrefilter.EPIV2.value: {
"published_only": "design__study__published",
"studies": "design__study__in",
},
StudyTypePrefilter.EPI_META: {
EndpointPrefilter.EPI_META.value: {
"published_only": "protocol__study__published",
"studies": "protocol__study__in",
},
StudyTypePrefilter.IN_VITRO: {
EndpointPrefilter.IN_VITRO.value: {
"published_only": "experiment__study__published",
"studies": "experiment__study__in",
"categories": "category__in",
"chemicals": "chemical__name__in",
"effects": "effect__in",
"effect_tags": "effects__in",
},
StudyTypePrefilter.ECO: {
EndpointPrefilter.ECO.value: {
"published_only": "design__study__published",
"studies": "design__study__in",
},
Expand All @@ -56,7 +56,7 @@ def prefilters_dict(apps, schema_editor):
data = json.loads(obj.prefilters)
if not data:
continue
key_map = mapping[StudyTypePrefilter.from_study_type(obj.evidence_type, obj.assessment)]
key_map = mapping[get_prefilter_cls(None, obj.evidence_type, obj.assessment)]
key_map = {v: k for k, v in key_map.items()}
data = {key_map[k]: v for k, v in data.items() if v}
obj.temp = data
Expand All @@ -70,7 +70,7 @@ def reverse_prefilters_dict(apps, schema_editor):
for obj in objs:
if not obj.temp:
continue
key_map = mapping[StudyTypePrefilter.from_study_type(obj.evidence_type, obj.assessment)]
key_map = mapping[get_prefilter_cls(None, obj.evidence_type, obj.assessment)]
data = {key_map[k]: v for k, v in obj.temp.items()}
obj.prefilters = json.dumps(data)
DataPivotQuery.objects.bulk_update(objs, ["prefilters"])
Expand Down
44 changes: 10 additions & 34 deletions hawc/apps/summary/migrations/0046_visual_prefilters_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,14 @@

from django.db import migrations, models

from hawc.apps.summary.prefilters import VisualTypePrefilter

mapping = {
VisualTypePrefilter.BIOASSAY_CROSSVIEW: {
"published_only": "animal_group__experiment__study__published",
"studies": "animal_group__experiment__study__in",
"systems": "system__in",
"organs": "organ__in",
"effects": "effect__in",
"effect_subtypes": "effect_subtype__in",
"effect_tags": "effects__in",
},
VisualTypePrefilter.ROB_HEATMAP: {
"published_only": "animal_group__experiment__study__published",
"studies": "animal_group__experiment__study__in",
"systems": "system__in",
"organs": "organ__in",
"effects": "effect__in",
"effect_subtypes": "effect_subtype__in",
"effect_tags": "effects__in",
},
VisualTypePrefilter.ROB_BARCHART: {
"published_only": "animal_group__experiment__study__published",
"studies": "animal_group__experiment__study__in",
"systems": "system__in",
"organs": "organ__in",
"effects": "effect__in",
"effect_subtypes": "effect_subtype__in",
"effect_tags": "effects__in",
},
key_map = {
"published_only": "animal_group__experiment__study__published",
"studies": "animal_group__experiment__study__in",
"systems": "system__in",
"organs": "organ__in",
"effects": "effect__in",
"effect_subtypes": "effect_subtype__in",
"effect_tags": "effects__in",
}


Expand All @@ -44,9 +22,8 @@ def prefilters_dict(apps, schema_editor):
data = json.loads(obj.prefilters)
if not data:
continue
key_map = mapping[VisualTypePrefilter.from_visual_type(obj.visual_type)]
key_map = {v: k for k, v in key_map.items()}
data = {key_map[k]: v for k, v in data.items() if v}
reverse_key_map = {v: k for k, v in key_map.items()}
data = {reverse_key_map[k]: v for k, v in data.items() if v}
obj.temp = data
Visual.objects.bulk_update(objs, ["temp"])

Expand All @@ -58,7 +35,6 @@ def reverse_prefilters_dict(apps, schema_editor):
for obj in objs:
if not obj.temp:
continue
key_map = mapping[VisualTypePrefilter.from_visual_type(obj.visual_type)]
data = {key_map[k]: v for k, v in obj.temp.items()}
obj.prefilters = json.dumps(data)
Visual.objects.bulk_update(objs, ["prefilters"])
Expand Down
61 changes: 61 additions & 0 deletions hawc/apps/summary/migrations/0051_visual_evidence_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Generated by Django 4.2.3 on 2023-10-24 16:32

from django.db import migrations, models

from hawc.apps.summary.constants import get_default_evidence_type


def set_defaults(apps, schema_editor):
Visual = apps.get_model("summary", "Visual")
objs = Visual.objects.all()
updated_objs = []
for obj in objs:
# if theres a default evidence_type, use it
try:
evidence_type = get_default_evidence_type(obj.visual_type)
obj.evidence_type = evidence_type
# otherwise assume bioassay remains the default
except ValueError:
pass
if obj.evidence_type != 0:
updated_objs.append(obj)
Visual.objects.bulk_update(updated_objs, ["evidence_type"])


class Migration(migrations.Migration):
dependencies = [
("summary", "0050_heatmap_counts"),
]

operations = [
migrations.AddField(
model_name="visual",
name="evidence_type",
field=models.PositiveSmallIntegerField(
choices=[
(0, "Animal Bioassay"),
(1, "Epidemiology"),
(4, "Epidemiology meta-analysis/pooled analysis"),
(2, "In vitro"),
(5, "Ecology"),
(3, "Other"),
],
default=0,
),
),
migrations.RunPython(set_defaults, migrations.RunPython.noop),
migrations.AlterField(
model_name="visual",
name="evidence_type",
field=models.PositiveSmallIntegerField(
choices=[
(0, "Animal Bioassay"),
(1, "Epidemiology"),
(4, "Epidemiology meta-analysis/pooled analysis"),
(2, "In vitro"),
(5, "Ecology"),
(3, "Other"),
]
),
),
]
Loading

0 comments on commit 87cc57e

Please sign in to comment.