예제 #1
0
class StudyPopulationForm(forms.ModelForm):

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    confounding_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    class Meta:
        fields = ('name', 'design', 'country', 'region', 'state', 'sex',
                  'ethnicity', 'fraction_male', 'fraction_male_calculated',
                  'n', 'starting_n', 'age_mean', 'age_mean_type',
                  'age_calculated', 'age_description', 'age_sd', 'age_sd_type',
                  'age_lower', 'age_lower_type', 'age_upper', 'age_upper_type',
                  'inclusion_criteria', 'exclusion_criteria',
                  'confounding_criteria')
        model = models.StudyPopulation
        exclude = ('study', )

    def __init__(self, *args, **kwargs):
        study = kwargs.pop('parent', None)
        super(StudyPopulationForm, self).__init__(*args, **kwargs)
        self.fields['region'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.RegionLookup, allow_new=True)
        self.fields['state'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.StateLookup, allow_new=True)
        for fld in self.fields.keys():
            widget = self.fields[fld].widget
            if type(widget) != CheckboxInput:
                widget.attrs['class'] = 'span12'
        if study:
            self.instance.study = study
예제 #2
0
class MetaProtocolForm(forms.ModelForm):

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    class Meta:
        model = models.MetaProtocol
        exclude = ('study', )

    def __init__(self, *args, **kwargs):
        parent = kwargs.pop('parent', None)
        super(MetaProtocolForm, self).__init__(*args, **kwargs)
        for fld in self.fields.keys():
            if fld in ('lit_search_notes', 'notes'):
                self.fields[fld].widget.attrs['rows'] = 3
            widget = self.fields[fld].widget
            if type(widget) != CheckboxInput:
                widget.attrs['class'] = 'span12'
        if parent:
            self.instance.study = parent
        self.fields['inclusion_criteria'].widget.update_query_parameters(
            {'related': self.instance.study.assessment_id})
        self.fields['exclusion_criteria'].widget.update_query_parameters(
            {'related': self.instance.study.assessment_id})
예제 #3
0
파일: forms.py 프로젝트: umdsp/romeu
class ProductionAdminForm(ModelForm):

    theater_companies = selectable_forms.AutoCompleteSelectMultipleField(
        lookup_class=TheaterCompanyLookup,
        required=False,
        label=_(u"Theater companies"))

    def __init__(self, *args, **kwargs):
        super(ProductionAdminForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            if self.instance.venue:
                self.initial['venue'] = self.instance.venue.pk
        corporate_creator = Creator.objects.filter(creator_type='corp',
                                                   org_name__isnull=False)
        self.fields['theater_companies'].widget.update_query_parameters(
            {'theater_companies': corporate_creator})

    class Meta(object):
        model = Production
        widgets = \
           {'source_work':
            selectable_forms.AutoCompleteSelectMultipleWidget(
                lookup_class=WorkRecordLookup, attrs={'size':'100'}),
            'venue':selectable_forms.AutoCompleteSelectWidget(
                lookup_class=LocationLookup, attrs={'size':'100'}),
            'primary_publications': \
            selectable_forms.AutoCompleteSelectMultipleWidget(
                lookup_class=PublicationLookup, attrs={'size':'100'}),
            'secondary_publications': \
            selectable_forms.AutoCompleteSelectMultipleWidget(
                lookup_class=PublicationLookup, attrs={'size':'100'}),}
예제 #4
0
class MetaResultForm(forms.ModelForm):

    adjustment_factors = selectable.AutoCompleteSelectMultipleField(
        help_text="All factors which were included in final model",
        lookup_class=lookups.FactorLookup,
        required=False)

    class Meta:
        model = models.MetaResult
        exclude = ('protocol', )

    def __init__(self, *args, **kwargs):
        parent = kwargs.pop('parent', None)
        super(MetaResultForm, self).__init__(*args, **kwargs)

        self.fields['health_outcome'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.MetaResultHealthOutcomeLookup, allow_new=True)

        self.fields['exposure_name'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.MetaResultExposureNameLookup, allow_new=True)

        for fld in self.fields.keys():
            widget = self.fields[fld].widget
            if fld in ('health_outcome_notes', 'statistical_notes', 'notes',
                       'exposure_details'):
                self.fields[fld].widget.attrs['rows'] = 3
            if type(widget) != CheckboxInput:
                widget.attrs['class'] = 'span12'
        if parent:
            self.instance.protocol = parent
예제 #5
0
class FruitForm(forms.Form):
    autocomplete = forms.CharField(
        label='Type the name of a fruit (AutoCompleteWidget)',
        widget=selectable.AutoCompleteWidget(FruitLookup),
        required=False,
    )
    newautocomplete = forms.CharField(
        label='Type the name of a fruit (AutoCompleteWidget which allows new items)',
        widget=selectable.AutoCompleteWidget(FruitLookup, allow_new=True),
        required=False,
    )
    combobox = forms.CharField(
        label='Type/select the name of a fruit (AutoComboboxWidget)',
        widget=selectable.AutoComboboxWidget(FruitLookup),
        required=False,
    )
    newcombobox = forms.CharField(
        label='Type/select the name of a fruit (AutoComboboxWidget which allows new items)',
        widget=selectable.AutoComboboxWidget(FruitLookup, allow_new=True),
        required=False,
    )
    # AutoCompleteSelectField (no new items)
    autocompleteselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteField)',
        required=False,
    )
    # AutoCompleteSelectField (allows new items)
    newautocompleteselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        allow_new=True,
        label='Select a fruit (AutoCompleteField which allows new items)',
        required=False,
    )
    # AutoComboboxSelectField (no new items)
    comboboxselect = selectable.AutoComboboxSelectField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoComboboxSelectField)',
        required=False,
    )
    # AutoComboboxSelectField (allows new items)
    newcomboboxselect = selectable.AutoComboboxSelectField(
        lookup_class=FruitLookup,
        allow_new=True,
        label='Select a fruit (AutoComboboxSelectField which allows new items)',
        required=False,
    )
    # AutoCompleteSelectMultipleField
    multiautocompleteselect = selectable.AutoCompleteSelectMultipleField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteSelectMultipleField)',
        required=False,
    )
    # AutoComboboxSelectMultipleField
    multicomboboxselect = selectable.AutoComboboxSelectMultipleField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoComboboxSelectMultipleField)',
        required=False,
    )
예제 #6
0
파일: forms.py 프로젝트: ashyhanov/hawc
 def __init__(self, *args, **kwargs):
     super(EndpointAggregationForm, self).__init__(*args, **kwargs)
     self.fields["endpoints"] = selectable.AutoCompleteSelectMultipleField(
         lookup_class=EndpointByAssessmentLookup,
         label='Endpoints',
         widget=selectable.AutoCompleteSelectMultipleWidget)
     self.fields["endpoints"].widget.update_query_parameters(
         {'assessment_id': self.instance.assessment_id})
     self.helper = self.setHelper()
예제 #7
0
class AssessedOutcomeForm(forms.ModelForm):

    adjustment_factors = selectable.AutoCompleteSelectMultipleField(
        help_text="All factors which were included in final model",
        lookup_class=lookups.FactorLookup,
        required=False)

    confounders_considered = selectable.AutoCompleteSelectMultipleField(
        label="Adjustment factors considered",
        help_text=
        "All factors which were examined (including those which were included in final model)",
        lookup_class=lookups.FactorLookup,
        required=False)

    effects = selectable.AutoCompleteSelectMultipleField(
        lookup_class=EffectTagLookup,
        required=False,
        help_text="Tags used to help categorize effect description.")

    class Meta:
        model = models.AssessedOutcome
        exclude = ('assessment', 'exposure')

    def __init__(self, *args, **kwargs):
        assessment = kwargs.pop('assessment', None)
        exposure = kwargs.pop('parent', None)
        super(AssessedOutcomeForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget = selectable.AutoCompleteWidget(
            lookup_class=BaseEndpointLookup, allow_new=True)
        if assessment:
            self.instance.assessment = assessment
        if exposure:
            self.instance.exposure = exposure
        self.fields['main_finding'].queryset = \
                self.fields['main_finding'].queryset.filter(
                        exposure=self.instance.exposure)
        for fld in self.fields.keys():
            self.fields[fld].widget.attrs['class'] = 'span12'
        for fld in ('diagnostic_description', 'summary',
                    'prevalence_incidence', 'statistical_power_details',
                    'dose_response_details', 'statistical_metric_description'):
            self.fields[fld].widget.attrs['rows'] = 3
예제 #8
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.fields["endpoints"] = selectable.AutoCompleteSelectMultipleField(
         lookup_class=EndpointByAssessmentLookupHtml,
         label="Endpoints",
         widget=EndpointAggregationSelectMultipleWidget,
     )
     self.fields["endpoints"].widget.update_query_parameters(
         {"related": self.instance.assessment_id})
     self.helper = self.setHelper()
     self.helper.attrs["novalidate"] = ""
예제 #9
0
class ProjectFiltersForm(forms.Form):
    TRUNC_CHOICES = [
        ('day', 'Day'),
        ('week', 'Week'),
        ('month', 'Month'),
    ]
    DEFAULT_TRUNC = TRUNC_CHOICES[2][0]
    billable = forms.BooleanField(initial=True, required=False)
    non_billable = forms.BooleanField(label='Non-Billable',
                                      initial=True,
                                      required=False)
    paid_leave = forms.BooleanField(initial=True, required=False)
    trunc = forms.ChoiceField(label='Group Totals By:',
                              choices=TRUNC_CHOICES,
                              widget=forms.RadioSelect(),
                              required=False,
                              initial=DEFAULT_TRUNC)
    pj_select = selectable_forms.AutoCompleteSelectMultipleField(
        ProjectLookup, label='Project Name:', required=False)

    def clean_trunc(self):
        trunc = self.cleaned_data.get('trunc', '')
        if not trunc:
            trunc = self.DEFAULT_TRUNC
        return trunc

    def get_hour_type(self):
        try:
            billable = self.cleaned_data.get('billable', False)
            non_billable = self.cleaned_data.get('non_billable', False)
        except AttributeError:
            return 'total'
        if billable and non_billable:
            return 'total'
        elif billable:
            return 'billable'
        elif non_billable:
            return 'non_billable'
        return 'nothing'
예제 #10
0
class HourlyReportForm(DateForm):
    TRUNC_CHOICES = (
        ('day', 'Day'),
        ('week', 'Week'),
        ('month', 'Month'),
        ('year', 'Year'),
    )

    billable = forms.BooleanField(required=False)
    non_billable = forms.BooleanField(label='Non-billable', required=False)
    paid_leave = forms.BooleanField(required=False)
    trunc = forms.ChoiceField(label='Group Totals By',
                              choices=TRUNC_CHOICES,
                              widget=forms.RadioSelect())
    projects = selectable.AutoCompleteSelectMultipleField(ProjectLookup,
                                                          label='Project Name',
                                                          required=False)

    def __init__(self, *args, **kwargs):
        super(HourlyReportForm, self).__init__(*args, **kwargs)
        self.fields['from_date'].required = True
        self.fields['to_date'].required = True
예제 #11
0
class OutcomeFilterForm(forms.Form):

    ORDER_BY_CHOICES = (
        ('study_population__study__short_citation', 'study'),
        ('study_population__name', 'study population'),
        ('name', 'outcome name'),
        ('system', 'system'),
        ('effect', 'effect'),
        ('diagnostic', 'diagnostic'),
    )

    studies = selectable.AutoCompleteSelectMultipleField(
        label='Study reference',
        lookup_class=EpiStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False)

    name = forms.CharField(label='Outcome name',
                           widget=selectable.AutoCompleteWidget(
                               lookups.OutcomeLookup),
                           help_text="ex: blood, glucose",
                           required=False)

    study_population = forms.CharField(
        label='Study population',
        widget=selectable.AutoCompleteWidget(
            lookups.StudyPopulationByAssessmentLookup),
        help_text="ex: population near a Teflon manufacturing plant",
        required=False)

    metric = forms.CharField(label='Measurement metric',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedExposureMetricLookup),
                             help_text="ex: drinking water",
                             required=False)

    age_profile = forms.CharField(
        label='Age profile',
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedStudyPopulationAgeProfileLookup),
        help_text="ex: children",
        required=False)

    source = forms.CharField(label='Study population source',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedStudyPopulationSourceLookup),
                             help_text="ex: occupational exposure",
                             required=False)

    country = forms.CharField(label='Study population country',
                              widget=selectable.AutoCompleteWidget(
                                  lookups.RelatedCountryNameLookup),
                              help_text="ex: Japan",
                              required=False)

    design = forms.MultipleChoiceField(
        label='Study design',
        choices=models.StudyPopulation.DESIGN_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        initial=[c[0] for c in models.StudyPopulation.DESIGN_CHOICES],
        required=False)

    system = forms.CharField(label='System',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedSystemLookup),
                             help_text="ex: immune and lymphatic system",
                             required=False)

    effect = forms.CharField(label='Effect',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedEffectLookup),
                             help_text="ex: Cancer",
                             required=False)

    effect_subtype = forms.CharField(label='Effect subtype',
                                     widget=selectable.AutoCompleteWidget(
                                         lookups.RelatedEffectSubtypeLookup),
                                     help_text="ex: Melanoma",
                                     required=False)

    diagnostic = forms.MultipleChoiceField(
        choices=models.Outcome.DIAGNOSTIC_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        initial=[c[0] for c in models.Outcome.DIAGNOSTIC_CHOICES],
        required=False)

    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, )

    paginate_by = forms.IntegerField(label='Items per page',
                                     min_value=1,
                                     initial=25,
                                     max_value=10000,
                                     required=False)

    def __init__(self, *args, **kwargs):
        assessment_id = kwargs.pop('assessment_id')
        super().__init__(*args, **kwargs)
        for field in self.fields:
            if field not in ('design', 'diagnostic', 'order_by',
                             'paginate_by'):
                self.fields[field].widget.update_query_parameters(
                    {'related': assessment_id})

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [
                    forms.CheckboxInput, forms.CheckboxSelectMultiple
            ]:
                widget.attrs['class'] = 'span12'

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row('studies', 4, "span3")
        helper.add_fluid_row('age_profile', 4, "span3")
        helper.add_fluid_row('system', 4, "span3")

        helper.layout.append(
            cfb.FormActions(cfl.Submit('submit', 'Apply filters'), ))

        return helper

    def get_query(self):

        studies = self.cleaned_data.get('studies')
        name = self.cleaned_data.get('name')
        study_population = self.cleaned_data.get('study_population')
        metric = self.cleaned_data.get('metric')
        age_profile = self.cleaned_data.get('age_profile')
        source = self.cleaned_data.get('source')
        country = self.cleaned_data.get('country')
        design = self.cleaned_data.get('design')
        system = self.cleaned_data.get('system')
        effect = self.cleaned_data.get('effect')
        effect_subtype = self.cleaned_data.get('effect_subtype')
        diagnostic = self.cleaned_data.get('diagnostic')

        query = Q()
        if studies:
            query &= Q(study_population__study__in=studies)
        if name:
            query &= Q(name__icontains=name)
        if study_population:
            query &= Q(study_population__name__icontains=study_population)
        if metric:
            query &= Q(study_population__exposures__metric__icontains=metric)
        if age_profile:
            query &= Q(study_population__age_profile__icontains=age_profile)
        if source:
            query &= Q(study_population__source__icontains=source)
        if country:
            query &= Q(study_population__country__name__icontains=country)
        if design:
            query &= Q(study_population__design__in=design)
        if system:
            query &= Q(system__icontains=system)
        if effect:
            query &= Q(effect__icontains=effect)
        if effect_subtype:
            query &= Q(effect_subtype__icontains=effect_subtype)
        if diagnostic:
            query &= Q(diagnostic__in=diagnostic)
        return query

    def get_order_by(self):
        return self.cleaned_data.get('order_by', self.ORDER_BY_CHOICES[0][0])
예제 #12
0
class ResultForm(forms.ModelForm):

    HELP_TEXT_CREATE = """Describe results found for measured outcome."""
    HELP_TEXT_UPDATE = """Update results found for measured outcome."""
    ADJUSTMENT_FIELDS = ["factors_applied", "factors_considered"]

    factors_applied = selectable.AutoCompleteSelectMultipleField(
        help_text="All adjustment factors included in  final statistical model",
        lookup_class=lookups.AdjustmentFactorLookup,
        required=False)

    factors_considered = selectable.AutoCompleteSelectMultipleField(
        label="Adjustment factors considered",
        help_text=models.OPTIONAL_NOTE,
        lookup_class=lookups.AdjustmentFactorLookup,
        required=False)

    class Meta:
        model = models.Result
        exclude = ('outcome', 'adjustment_factors')

    def __init__(self, *args, **kwargs):
        outcome = kwargs.pop('parent', None)
        super().__init__(*args, **kwargs)

        self.fields['comments'] = self.fields.pop('comments')  # move to end

        self.fields[
            'resulttags'].widget = selectable.AutoCompleteSelectMultipleWidget(
                lookup_class=EffectTagLookup)

        if outcome:
            self.instance.outcome = outcome
        else:
            outcome = self.instance.outcome

        self.fields["comparison_set"].queryset = models.ComparisonSet.objects\
            .filter(
                Q(study_population=outcome.study_population) |
                Q(outcome=outcome)
            )

        for fld in self.ADJUSTMENT_FIELDS:
            self.fields[fld].widget.update_query_parameters(
                {'related': self.instance.outcome.assessment_id})
            if self.instance.id:
                self.fields[fld].initial = getattr(self.instance, fld)

        self.helper = self.setHelper()

    def save_factors(self):
        """
        Adjustment factors is a through model; requires the inclusion type.
        We save the m2m relations using the additional information from the
        field-name
        """
        self.instance.resfactors.all().delete()
        objs = []

        applied = self.cleaned_data.get("factors_applied", [])
        objs.extend([
            models.ResultAdjustmentFactor(adjustment_factor=af,
                                          result=self.instance,
                                          included_in_final_model=True)
            for af in applied
        ])

        considered = self.cleaned_data.get("factors_considered", [])
        considered = set(considered) - set(applied)
        objs.extend([
            models.ResultAdjustmentFactor(adjustment_factor=af,
                                          result=self.instance,
                                          included_in_final_model=False)
            for af in considered
        ])

        models.ResultAdjustmentFactor.objects.bulk_create(objs)

    def save(self, commit=True):
        instance = super().save(commit)
        if commit:
            self.save_factors()
        return instance

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in self.ADJUSTMENT_FIELDS or fld == "resulttags":
                    widget.attrs['class'] = 'span10'
                else:
                    widget.attrs['class'] = 'span12'
            if type(widget) == forms.Textarea:
                widget.attrs['rows'] = 3

        if self.instance.id:
            inputs = {
                "legend_text": "Update {}".format(self.instance),
                "help_text": self.HELP_TEXT_UPDATE,
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": "Create new set of results",
                "help_text": self.HELP_TEXT_CREATE,
                "cancel_url": self.instance.outcome.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None

        helper.add_fluid_row('name', 2, "span6")
        helper.add_fluid_row('metric', 3, "span4")
        helper.add_fluid_row('data_location', 2, "span6")
        helper.add_fluid_row('dose_response', 3, "span4")
        helper.add_fluid_row('statistical_power', 4, "span3")
        helper.add_fluid_row('factors_applied', 2, "span6")
        helper.add_fluid_row('estimate_type', 3, "span4")
        helper.add_fluid_row("resulttags", 1, "span6")

        url = reverse('assessment:effect_tag_create',
                      kwargs={'pk': self.instance.outcome.assessment_id})
        helper.addBtnLayout(helper.layout[8], 0, url, "Add new result tag",
                            "span6")

        url = reverse('epi:adjustmentfactor_create',
                      kwargs={'pk': self.instance.outcome.assessment_id})
        # remove magic number 9; breaks if we change number of elements in the form. This still isn't great; what if comments went away?
        btn_target_idx = helper.find_layout_idx_for_field_name('comments') - 1
        helper.addBtnLayout(helper.layout[btn_target_idx], 0, url,
                            "Add new adjustment factor", "span6")
        helper.addBtnLayout(helper.layout[btn_target_idx], 1, url,
                            "Add new adjustment factor", "span6")

        return helper
예제 #13
0
class MetaResultFilterForm(forms.Form):

    ORDER_BY_CHOICES = (
        ("protocol__study__short_citation", "study"),
        ("label", "meta result label"),
        ("protocol__name", "protocol"),
        ("health_outcome", "health outcome"),
        ("exposure", "exposure"),
    )

    studies = selectable.AutoCompleteSelectMultipleField(
        label="Study reference",
        lookup_class=EpimetaStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False,
    )

    label = forms.CharField(
        label="Meta result label",
        widget=selectable.AutoCompleteWidget(
            lookups.MetaResultByAssessmentLookup),
        help_text="ex: ALL, folic acid, any time",
        required=False,
    )

    protocol = forms.CharField(
        label="Protocol",
        widget=selectable.AutoCompleteWidget(lookups.MetaProtocolLookup),
        help_text="ex: B vitamins and risk of cancer",
        required=False,
    )

    health_outcome = forms.CharField(
        label="Health outcome",
        widget=selectable.AutoCompleteWidget(
            lookups.MetaResultHealthOutcomeLookup),
        help_text="ex: Any adenoma",
        required=False,
    )

    exposure_name = forms.CharField(
        label="Exposure name",
        widget=selectable.AutoCompleteWidget(lookups.ExposureLookup),
        help_text="ex: Folate",
        required=False,
    )

    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, )

    paginate_by = forms.IntegerField(label="Items per page",
                                     min_value=1,
                                     initial=25,
                                     max_value=10000,
                                     required=False)

    def __init__(self, *args, **kwargs):
        assessment = kwargs.pop("assessment")
        super().__init__(*args, **kwargs)
        for field in self.fields:
            if field not in ("order_by", "paginate_by"):
                self.fields[field].widget.update_query_parameters(
                    {"related": assessment.id})

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [
                    forms.CheckboxInput, forms.CheckboxSelectMultiple
            ]:
                widget.attrs["class"] = "span12"

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row("studies", 4, "span3")

        helper.layout.append(
            cfb.FormActions(cfl.Submit("submit", "Apply filters"), ))

        return helper

    def get_query(self):

        studies = self.cleaned_data.get("studies")
        label = self.cleaned_data.get("label")
        protocol = self.cleaned_data.get("protocol")
        health_outcome = self.cleaned_data.get("health_outcome")
        exposure_name = self.cleaned_data.get("exposure_name")

        query = Q()
        if studies:
            query &= Q(protocol__study__in=studies)
        if label:
            query &= Q(label__icontains=label)
        if protocol:
            query &= Q(protocol__name__icontains=protocol)
        if health_outcome:
            query &= Q(health_outcome__icontains=health_outcome)
        if exposure_name:
            query &= Q(exposure_name__icontains=exposure_name)
        return query

    def get_order_by(self):
        return self.cleaned_data.get("order_by", self.ORDER_BY_CHOICES[0][0])
예제 #14
0
class MetaResultForm(forms.ModelForm):

    CREATE_LEGEND = "Create a new meta-result"

    CREATE_HELP_TEXT = """
        Create a new meta-result for an epidemiological assessment.
        A meta-result is the aggregate result from a meta-analysis or
        pooled analysis from multiple primary literature components.
    """

    UPDATE_HELP_TEXT = "Update an existing meta-result"

    adjustment_factors = selectable.AutoCompleteSelectMultipleField(
        help_text="All factors which were included in final model",
        lookup_class=AdjustmentFactorLookup,
        required=False,
    )

    class Meta:
        model = models.MetaResult
        exclude = ("protocol", )

    def __init__(self, *args, **kwargs):
        parent = kwargs.pop("parent", None)
        assessment = kwargs.pop("assessment", None)
        super().__init__(*args, **kwargs)

        self.fields["health_outcome"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.MetaResultHealthOutcomeLookup, allow_new=True)

        self.fields["exposure_name"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.MetaResultExposureNameLookup, allow_new=True)

        if parent:
            self.instance.protocol = parent

        self.fields["adjustment_factors"].widget.update_query_parameters(
            {"related": assessment.id})
        self.fields["health_outcome"].widget.update_query_parameters(
            {"related": assessment.id})
        self.fields["exposure_name"].widget.update_query_parameters(
            {"related": assessment.id})
        self.helper = self.setHelper()

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld == "adjustment_factors":
                    widget.attrs["class"] = "span10"
                else:
                    widget.attrs["class"] = "span12"
            if type(widget) == forms.Textarea:
                widget.attrs["rows"] = 3

        if self.instance.id:
            inputs = {
                "legend_text": f"Update {self.instance}",
                "help_text": self.UPDATE_HELP_TEXT,
                "cancel_url": self.instance.get_absolute_url(),
            }
        else:
            inputs = {
                "legend_text": self.CREATE_LEGEND,
                "help_text": self.CREATE_HELP_TEXT,
                "cancel_url": self.instance.protocol.get_absolute_url(),
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row("label", 2, "span6")
        helper.add_fluid_row("health_outcome", 2, "span6")
        helper.add_fluid_row("exposure_name", 2, "span6")
        helper.add_fluid_row("number_studies", 3, "span4")
        helper.add_fluid_row("n", 3, "span4")
        helper.add_fluid_row("lower_ci", 3, "span4")
        helper.add_fluid_row("adjustment_factors", 2, "span6")

        url = reverse(
            "epi:adjustmentfactor_create",
            kwargs={"pk": self.instance.protocol.study.assessment.pk},
        )
        helper.addBtnLayout(helper.layout[8], 0, url, "Create criteria",
                            "span6")

        return helper
예제 #15
0
파일: forms.py 프로젝트: shanethacker/hawc
class EndpointFilterForm(forms.Form):

    ORDER_BY_CHOICES = (
        ('animal_group__experiment__study__short_citation', 'study'),
        ('name', 'endpoint name'),
        ('system', 'system'),
        ('organ', 'organ'),
        ('effect', 'effect'),
        ('effect_subtype', 'effect subtype'),
        ('animal_group__experiment__chemical', 'chemical'),
    )

    studies = selectable.AutoCompleteSelectMultipleField(
        label='Study reference',
        lookup_class=AnimalStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False)

    cas = forms.CharField(
        label='CAS',
        widget=selectable.AutoCompleteWidget(lookups.RelatedExperimentCASLookup),
        help_text="ex: 107-02-8",
        required=False)

    lifestage_exposed = forms.CharField(
        label='Lifestage exposed',
        widget=selectable.AutoCompleteWidget(lookups.RelatedAnimalGroupLifestageExposedLookup),
        help_text="ex: pup",
        required=False)

    lifestage_assessed = forms.CharField(
        label='Lifestage assessed',
        widget=selectable.AutoCompleteWidget(lookups.RelatedAnimalGroupLifestageAssessedLookup),
        help_text="ex: adult",
        required=False)

    species = selectable.AutoCompleteSelectField(
        label='Species',
        lookup_class=SpeciesLookup,
        help_text="ex: Mouse",
        required=False)

    strain = selectable.AutoCompleteSelectField(
        label='Strain',
        lookup_class=StrainLookup,
        help_text="ex: B6C3F1",
        required=False)

    sex = forms.MultipleChoiceField(
        choices=models.AnimalGroup.SEX_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        initial=[c[0] for c in models.AnimalGroup.SEX_CHOICES],
        required=False)

    data_extracted = forms.ChoiceField(
        choices=((True, "Yes"), (False, "No"), (None, "All data")),
        initial=None,
        required=False)

    name = forms.CharField(
        label='Endpoint name',
        widget=selectable.AutoCompleteWidget(lookups.EndpointByAssessmentTextLookup),
        help_text="ex: heart weight",
        required=False)

    system = forms.CharField(
        label='System',
        widget=selectable.AutoCompleteWidget(lookups.RelatedEndpointSystemLookup),
        help_text="ex: endocrine",
        required=False)

    organ = forms.CharField(
        label='Organ',
        widget=selectable.AutoCompleteWidget(lookups.RelatedEndpointOrganLookup),
        help_text="ex: pituitary",
        required=False)

    effect = forms.CharField(
        label='Effect',
        widget=selectable.AutoCompleteWidget(lookups.RelatedEndpointEffectLookup),
        help_text="ex: alanine aminotransferase (ALT)",
        required=False)

    effect_subtype = forms.CharField(
        label='Effect Subtype',
        widget=selectable.AutoCompleteWidget(lookups.RelatedEndpointEffectSubtypeLookup),
        help_text="ex: ",
        required=False)

    tags = forms.CharField(
        label='Tags',
        widget=selectable.AutoCompleteWidget(EffectTagLookup),
        help_text="ex: antibody response",
        required=False)

    dose_units = forms.ModelChoiceField(
       queryset=DoseUnits.objects.all(),
       required=False
    )

    order_by = forms.ChoiceField(
        choices=ORDER_BY_CHOICES,
    )

    paginate_by = forms.IntegerField(
        label='Items per page',
        min_value=1,
        initial=25,
        max_value=10000,
        required=False)

    def __init__(self, *args, **kwargs):
        assessment_id = kwargs.pop('assessment_id')
        super().__init__(*args, **kwargs)
        for field in self.fields:
            if field not in ('sex', 'data_extracted', 'dose_units', 'order_by', 'paginate_by'):
                self.fields[field].widget.update_query_parameters(
                    {'related': assessment_id})

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [forms.CheckboxInput, forms.CheckboxSelectMultiple]:
                widget.attrs['class'] = 'span12'

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row('studies', 4, "span3")
        helper.add_fluid_row('species', 4, "span3")
        helper.add_fluid_row('name', 4, "span3")
        helper.add_fluid_row('tags', 4, "span3")

        helper.layout.append(
            cfb.FormActions(
                cfl.Submit('submit', 'Apply filters'),
            )
        )

        return helper

    def get_query(self):

        studies = self.cleaned_data.get('studies')
        cas = self.cleaned_data.get('cas')
        lifestage_exposed = self.cleaned_data.get('lifestage_exposed')
        lifestage_assessed = self.cleaned_data.get('lifestage_assessed')
        species = self.cleaned_data.get('species')
        strain = self.cleaned_data.get('strain')
        sex = self.cleaned_data.get('sex')
        data_extracted = self.cleaned_data.get('data_extracted')
        name = self.cleaned_data.get('name')
        system = self.cleaned_data.get('system')
        organ = self.cleaned_data.get('organ')
        effect = self.cleaned_data.get('effect')
        effect_subtype = self.cleaned_data.get('effect_subtype')
        tags = self.cleaned_data.get('tags')
        dose_units = self.cleaned_data.get('dose_units')

        query = Q()
        if studies:
            query &= Q(animal_group__experiment__study__in=studies)
        if cas:
            query &= Q(animal_group__experiment__cas__icontains=cas)
        if lifestage_exposed:
            query &= Q(animal_group__lifestage_exposed__icontains=lifestage_exposed)
        if lifestage_assessed:
            query &= Q(animal_group__lifestage_assessed__icontains=lifestage_assessed)
        if species:
            query &= Q(animal_group__species=species)
        if strain:
            query &= Q(animal_group__strain__name__icontains=strain.name)
        if sex:
            query &= Q(animal_group__sex__in=sex)
        if data_extracted:
            query &= Q(data_extracted=data_extracted == 'True')
        if name:
            query &= Q(name__icontains=name)
        if system:
            query &= Q(system__icontains=system)
        if organ:
            query &= Q(organ__icontains=organ)
        if effect:
            query &= Q(effect__icontains=effect)
        if effect_subtype:
            query &= Q(effect_subtype__icontains=effect_subtype)
        if tags:
            query &= Q(effects__name__icontains=tags)
        if dose_units:
            query &= Q(animal_group__dosing_regime__doses__dose_units=dose_units)
        return query

    def get_order_by(self):
        return self.cleaned_data.get('order_by', self.ORDER_BY_CHOICES[0][0])

    def get_dose_units_id(self):
        if hasattr(self, "cleaned_data") and self.cleaned_data.get('dose_units'):
            return self.cleaned_data.get('dose_units').id
예제 #16
0
class MetaProtocolForm(forms.ModelForm):

    CREATE_LEGEND = "Create a new meta-protocol"

    CREATE_HELP_TEXT = """
        Create a new meta-protocol for an epidemiological
        assessment. A meta-protocol contains the methodology behind a
        meta-analysis or pooled analysis, which are frequently used
        techniques used to quantitatively summarize results from
        multiple studies or reference populations.
    """

    UPDATE_HELP_TEXT = "Update an existing meta-protocol"

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=CriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=CriteriaLookup, required=False)

    CRITERION_FIELDS = [
        "inclusion_criteria",
        "exclusion_criteria",
    ]

    class Meta:
        model = models.MetaProtocol
        exclude = ("study", )

    def __init__(self, *args, **kwargs):
        parent = kwargs.pop("parent", None)
        super().__init__(*args, **kwargs)
        if parent:
            self.instance.study = parent
        self.fields["inclusion_criteria"].widget.update_query_parameters(
            {"related": self.instance.study.assessment_id})
        self.fields["exclusion_criteria"].widget.update_query_parameters(
            {"related": self.instance.study.assessment_id})
        self.helper = self.setHelper()

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in self.CRITERION_FIELDS:
                    widget.attrs["class"] = "span10"
                else:
                    widget.attrs["class"] = "span12"
            if type(widget) == forms.Textarea:
                widget.attrs["rows"] = 3

        if self.instance.id:
            inputs = {
                "legend_text": f"Update {self.instance}",
                "help_text": self.UPDATE_HELP_TEXT,
                "cancel_url": self.instance.get_absolute_url(),
            }
        else:
            inputs = {
                "legend_text": self.CREATE_LEGEND,
                "help_text": self.CREATE_HELP_TEXT,
                "cancel_url": self.instance.study.get_absolute_url(),
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row("name", 2, "span6")
        helper.add_fluid_row("lit_search_strategy", 2, "span6")
        helper.add_fluid_row("lit_search_start_date", 3, "span4")
        helper.add_fluid_row("inclusion_criteria", 2, "span6")

        url = reverse("epi:studycriteria_create",
                      kwargs={"pk": self.instance.study.assessment.pk})
        helper.addBtnLayout(helper.layout[5], 0, url, "Create criteria",
                            "span6")
        helper.addBtnLayout(helper.layout[5], 1, url, "Create criteria",
                            "span6")

        return helper
예제 #17
0
class StudyPopulationForm(forms.ModelForm):

    CREATE_LEGEND = "Create new study-population"

    CREATE_HELP_TEXT = ""

    UPDATE_HELP_TEXT = "Update an existing study-population."

    CRITERION_FIELDS = [
        "inclusion_criteria",
        "exclusion_criteria",
        "confounding_criteria",
    ]

    CRITERION_TYPE_CW = {
        "inclusion_criteria": "I",
        "exclusion_criteria": "E",
        "confounding_criteria": "C",
    }

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False
    )

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False
    )

    confounding_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False
    )

    class Meta:
        model = models.StudyPopulation
        exclude = ("study", "criteria")
        labels = {"comments": "Recruitment description"}

    def __init__(self, *args, **kwargs):
        study = kwargs.pop("parent", None)
        super().__init__(*args, **kwargs)
        self.fields["comments"] = self.fields.pop("comments")  # move to end
        self.fields["region"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.RegionLookup, allow_new=True
        )
        self.fields["state"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.StateLookup, allow_new=True
        )
        if study:
            self.instance.study = study

        for fld in self.CRITERION_FIELDS:
            self.fields[fld].widget.update_query_parameters(
                {"related": self.instance.study.assessment_id}
            )
            if self.instance.id:
                self.fields[fld].initial = getattr(self.instance, fld)

            # set the help text here for the correct criteria field
            self.fields[fld].help_text = self.instance.CRITERIA_HELP_TEXTS.get(fld, "")

        self.helper = self.setHelper()

    def save_criteria(self):
        """
        StudyPopulationCriteria is a through model; requires the criteria type.
        We save the m2m relations using the additional information from the
        field-name
        """
        self.instance.spcriteria.all().delete()
        objs = []
        for field in self.CRITERION_FIELDS:
            for criteria in self.cleaned_data.get(field, []):
                objs.append(
                    models.StudyPopulationCriteria(
                        criteria=criteria,
                        study_population=self.instance,
                        criteria_type=self.CRITERION_TYPE_CW[field],
                    )
                )
        models.StudyPopulationCriteria.objects.bulk_create(objs)

    def save(self, commit=True):
        instance = super().save(commit)
        if commit:
            self.save_criteria()
        return instance

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in self.CRITERION_FIELDS:
                    widget.attrs["class"] = "span10"
                else:
                    widget.attrs["class"] = "span12"
            if type(widget) == forms.Textarea:
                widget.attrs["rows"] = 3

        if self.instance.id:
            inputs = {
                "legend_text": f"Update {self.instance}",
                "help_text": self.UPDATE_HELP_TEXT,
                "cancel_url": self.instance.get_absolute_url(),
            }
        else:
            inputs = {
                "legend_text": self.CREATE_LEGEND,
                "help_text": self.CREATE_HELP_TEXT,
                "cancel_url": self.instance.study.get_absolute_url(),
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row("name", 2, "span6")
        helper.add_fluid_row("age_profile", 2, "span6")
        helper.add_fluid_row("countries", 3, "span4")
        helper.add_fluid_row("eligible_n", 3, "span4")
        helper.add_fluid_row("inclusion_criteria", 3, "span4")

        url = reverse("epi:studycriteria_create", kwargs={"pk": self.instance.study.assessment.pk})

        btn_target_idx = helper.find_layout_idx_for_field_name("comments") - 1
        helper.addBtnLayout(helper.layout[btn_target_idx], 0, url, "Create criteria", "span4")
        helper.addBtnLayout(helper.layout[btn_target_idx], 1, url, "Create criteria", "span4")
        helper.addBtnLayout(helper.layout[btn_target_idx], 2, url, "Create criteria", "span4")

        return helper

    def clean(self):
        cleaned_data = super().clean()
        countries = cleaned_data.get("countries")
        if not countries:
            self.add_error("countries", "At least one country must be selected")
        return cleaned_data
예제 #18
0
class StudyPopulationForm(forms.ModelForm):

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    confounding_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.StudyCriteriaLookup, required=False)

    class Meta:
        fields = ('name', 'design', 'country', 'region', 'state', 'sex',
                  'ethnicity', 'fraction_male', 'fraction_male_calculated',
                  'n', 'starting_n', 'age_mean', 'age_mean_type',
                  'age_calculated', 'age_description', 'age_sd', 'age_sd_type',
                  'age_lower', 'age_lower_type', 'age_upper', 'age_upper_type',
                  'inclusion_criteria', 'exclusion_criteria',
                  'confounding_criteria')
        model = models.StudyPopulation
        exclude = ('study', )

    def __init__(self, *args, **kwargs):
        study = kwargs.pop('parent', None)
        super(StudyPopulationForm, self).__init__(*args, **kwargs)
        self.fields['region'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.RegionLookup, allow_new=True)
        self.fields['state'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.StateLookup, allow_new=True)
        if study:
            self.instance.study = study
        self.helper = self.setHelper()

    def setHelper(self):
        for fld in [
                "inclusion_criteria", "exclusion_criteria",
                "confounding_criteria"
        ]:
            self.fields[fld].widget.update_query_parameters(
                {'related': self.instance.study.assessment_id})
        for fld in self.fields.keys():
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in [
                        'inclusion_criteria', 'exclusion_criteria',
                        'confounding_criteria'
                ]:
                    widget.attrs['class'] = 'span11'
                else:
                    widget.attrs['class'] = 'span12'

        if self.instance.id:
            inputs = {
                "legend_text": u"Update {}".format(self.instance),
                "help_text": u"Update an existing study-population.",
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": u"Create new study-population",
                "help_text": u"""
                    Create a new study population. Each study-population is a
                    associated with an epidemiology study. There may be
                    multiple study populations with a single study,
                    though this is typically unlikely.""",
                "cancel_url": self.instance.study.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row('name', 2, "span6")
        helper.add_fluid_row('country', 3, "span4")
        helper.add_fluid_row('sex', 4, "span3")
        helper.add_fluid_row('n', 2, "span6")
        helper.add_fluid_row('age_mean', 3, "span4")
        helper.add_fluid_row('age_description', 3, "span4")
        helper.add_fluid_row('age_lower', 4, "span3")

        url = '{% url "epi:studycriteria_create" assessment.pk %}'
        helper.add_adder("addIncCriteria", "Add new criteria", url)
        helper.add_adder("addExcCriteria", "Add new criteria", url)
        helper.add_adder("addConCriteria", "Add new criteria", url)

        return helper
예제 #19
0
class EndpointForm(ModelForm):

    effects = selectable.AutoCompleteSelectMultipleField(
        lookup_class=EffectTagLookup,
        required=False,
        help_text="For now, use the endpoint specific overall study "
        "evaluation rating of \"high\", \"medium\", \"low\" or "
        "\"uninformative\"",
        label="Additional tags")

    class Meta:
        model = models.Endpoint
        fields = ('name', 'system', 'organ', 'effect', 'effect_subtype',
                  'effects', 'diagnostic', 'observation_time',
                  'observation_time_units', 'observation_time_text',
                  'data_reported', 'data_extracted', 'values_estimated',
                  'data_type', 'variance_type', 'confidence_interval',
                  'response_units', 'data_location',
                  'expected_adversity_direction', 'NOEL', 'LOEL', 'FEL',
                  'monotonicity', 'statistical_test', 'trend_result',
                  'trend_value', 'power_notes', 'results_notes',
                  'endpoint_notes', 'litter_effects', 'litter_effect_notes')

    def __init__(self, *args, **kwargs):
        animal_group = kwargs.pop('parent', None)
        assessment = kwargs.pop('assessment', None)
        super().__init__(*args, **kwargs)

        self.fields['NOEL'].widget = forms.Select()
        self.fields['LOEL'].widget = forms.Select()
        self.fields['FEL'].widget = forms.Select()

        self.fields['system'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointSystemLookup, allow_new=True)

        self.fields['organ'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointOrganLookup, allow_new=True)

        self.fields['effect'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectLookup, allow_new=True)

        self.fields['effect_subtype'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectSubtypeLookup, allow_new=True)

        self.fields['statistical_test'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointStatisticalTestLookup, allow_new=True)

        if animal_group:
            self.instance.animal_group = animal_group
            self.instance.assessment = assessment

        self.fields["name"].help_text = """
            Short-text used to describe the endpoint/adverse 
            outcome. As a first pass during extraction, use 
            the endpoint name as presented in the study. Do 
            not add units — units are summarized in a separate 
            extraction field. Once extraction is complete for 
            an assessment, endpoint/adverse outcomes names may 
            be adjusted to use terms that best work across 
            studies or assessments using the data clean-up tool 
            (the original name as presented in the study will 
            be retained in the "Endpoint Name in Study" field). If the 
            endpoint is a repeated measure, then indicate the 
            time in parentheses, e.g., running wheel activity 
            (6 wk), using the abbreviated format: seconds = sec, 
            minutes = min, hours = h, days = d, weeks = wk, 
            months = mon, years = y.
            """

        self.helper = self.setHelper()

    def setHelper(self):
        if self.instance.id:
            inputs = {
                "legend_text": "Update {}".format(self.instance),
                "help_text": "Update an existing endpoint.",
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": "Create new endpoint",
                "help_text": """
                    Create a new endpoint. An endpoint should describe 
                    one measure-of-effect which was measured in the study. 
                    It may or may not contain quantitative data. For 
                    endpoint terminology, use the reference document 
                    "<a href="https://hawcprd.epa.gov/assessment/100000039/">Recommended 
                    Terminology for Outcomes/Endpoints</a>."
                    """,
                "cancel_url": self.instance.animal_group.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.form_id = "endpoint"

        self.fields['diagnostic'].widget.attrs['rows'] = 2
        for fld in ('results_notes', 'endpoint_notes', 'power_notes'):
            self.fields[fld].widget.attrs['rows'] = 3

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in ["effects"]:
                    widget.attrs['class'] = 'span10'
                else:
                    widget.attrs['class'] = 'span12'

        helper.add_fluid_row('system', 4, "span3")
        helper.add_fluid_row('effects', 2, "span6")
        helper.add_fluid_row('observation_time', 3, "span4")
        helper.add_fluid_row('data_reported', 3, "span4")
        helper.add_fluid_row('data_type', 3, "span4")
        helper.add_fluid_row('response_units', 3, "span4")
        helper.add_fluid_row('NOEL', 4, "span3")
        helper.add_fluid_row('statistical_test', 3,
                             ["span6", "span3", "span3"])
        helper.add_fluid_row('litter_effects', 2, "span6")

        url = reverse('assessment:effect_tag_create',
                      kwargs={'pk': self.instance.assessment.pk})
        helper.addBtnLayout(helper.layout[4], 0, url, "Add new effect tag",
                            "span6")

        return helper

    LIT_EFF_REQ = "Litter effects required if a reproductive/developmental study"
    LIT_EFF_NOT_REQ = "Litter effects must be NA if non-reproductive/developmental study"
    LIT_EFF_NOTES_REQ = 'Notes are required if litter effects are "Other"'
    LIT_EFF_NOTES_NOT_REQ = "Litter effect notes should be blank if effects are not-applicable"

    def clean(self):
        cleaned_data = super().clean()
        obs_time = cleaned_data.get("observation_time")
        observation_time_units = cleaned_data.get("observation_time_units")
        litter_effects = cleaned_data.get("litter_effects")
        litter_effect_notes = cleaned_data.get("litter_effect_notes")

        if obs_time is not None and observation_time_units == 0:
            err = "If reporting an endpoint-observation time, time-units must be specified."
            self.add_error('observation_time_units', err)

        if obs_time is None and observation_time_units > 0:
            err = "An observation-time must be reported if time-units are specified"
            self.add_error('observation_time', err)

        experiment_type = self.instance.animal_group.experiment.type

        if experiment_type in ["Rp", "Dv"]:
            if litter_effects == "NA":
                self.add_error('litter_effects', self.LIT_EFF_REQ)
        elif experiment_type != "Ot" and litter_effects != "NA":
            self.add_error('litter_effects', self.LIT_EFF_NOT_REQ)

        if litter_effects == "O" and litter_effect_notes == "":
            self.add_error('litter_effect_notes', self.LIT_EFF_NOTES_REQ)

        if litter_effects == "NA" and litter_effect_notes != "":
            self.add_error('litter_effect_notes', self.LIT_EFF_NOTES_NOT_REQ)

        return cleaned_data

    def clean_confidence_interval(self):
        confidence_interval = self.cleaned_data['confidence_interval']
        data_type = self.cleaned_data.get("data_type")
        if data_type == "P" and confidence_interval is None:
            raise forms.ValidationError("Confidence-interval is required for"
                                        "percent-difference data")
        return confidence_interval

    def clean_variance_type(self):
        data_type = self.cleaned_data.get("data_type")
        variance_type = self.cleaned_data.get("variance_type")
        return variance_type

    def clean_response_units(self):
        response_units = self.cleaned_data.get("response_units")
        data_extracted = self.cleaned_data.get("data_extracted")
        if data_extracted and response_units == "":
            raise forms.ValidationError(
                "If data is extracted (see checkbox), response-units are required"
            )
        return response_units
예제 #20
0
class EndpointForm(ModelForm):

    effects = selectable.AutoCompleteSelectMultipleField(
        lookup_class=EffectTagLookup,
        required=False,
        help_text=get_flavored_text("ani__endpoint_form__effects"),
        label="Additional tags",
    )

    class Meta:
        model = models.Endpoint
        fields = (
            "name",
            "system",
            "organ",
            "effect",
            "effect_subtype",
            "effects",
            "diagnostic",
            "observation_time",
            "observation_time_units",
            "observation_time_text",
            "data_reported",
            "data_extracted",
            "values_estimated",
            "data_type",
            "variance_type",
            "confidence_interval",
            "response_units",
            "data_location",
            "expected_adversity_direction",
            "NOEL",
            "LOEL",
            "FEL",
            "monotonicity",
            "statistical_test",
            "trend_result",
            "trend_value",
            "power_notes",
            "results_notes",
            "endpoint_notes",
            "litter_effects",
            "litter_effect_notes",
        )

    def __init__(self, *args, **kwargs):
        animal_group = kwargs.pop("parent", None)
        assessment = kwargs.pop("assessment", None)
        super().__init__(*args, **kwargs)

        self.fields["NOEL"].widget = forms.Select()
        self.fields["LOEL"].widget = forms.Select()
        self.fields["FEL"].widget = forms.Select()

        noel_names = assessment.get_noel_names(
        ) if assessment else self.instance.get_noel_names()
        self.fields["NOEL"].label = noel_names.noel
        self.fields["NOEL"].help_text = noel_names.noel_help_text
        self.fields["LOEL"].label = noel_names.loel
        self.fields["LOEL"].help_text = noel_names.loel_help_text

        self.fields["system"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointSystemLookup, allow_new=True)

        self.fields["organ"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointOrganLookup, allow_new=True)

        self.fields["effect"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectLookup, allow_new=True)

        self.fields["effect_subtype"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectSubtypeLookup, allow_new=True)

        self.fields["statistical_test"].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointStatisticalTestLookup, allow_new=True)

        if animal_group:
            self.instance.animal_group = animal_group
            self.instance.assessment = assessment

        self.fields["name"].help_text = get_flavored_text(
            "ani__endpoint_form__name")

        self.helper = self.setHelper()

        self.noel_names = json.dumps(self.instance.get_noel_names()._asdict())

    def setHelper(self):
        if self.instance.id:
            inputs = {
                "legend_text": f"Update {self.instance}",
                "help_text": "Update an existing endpoint.",
                "cancel_url": self.instance.get_absolute_url(),
            }
        else:
            inputs = {
                "legend_text": "Create new endpoint",
                "help_text": get_flavored_text("ani__endpoint_form__create"),
                "cancel_url": self.instance.animal_group.get_absolute_url(),
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.form_id = "endpoint"

        self.fields["diagnostic"].widget.attrs["rows"] = 2
        for fld in ("results_notes", "endpoint_notes", "power_notes"):
            self.fields[fld].widget.attrs["rows"] = 3

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in ["effects"]:
                    widget.attrs["class"] = "span10"
                else:
                    widget.attrs["class"] = "span12"

        helper.add_fluid_row("system", 4, "span3")
        helper.add_fluid_row("effects", 2, "span6")
        helper.add_fluid_row("observation_time", 3, "span4")
        helper.add_fluid_row("data_reported", 3, "span4")
        helper.add_fluid_row("data_type", 3, "span4")
        helper.add_fluid_row("response_units", 3, "span4")
        helper.add_fluid_row("NOEL", 4, "span3")
        helper.add_fluid_row("statistical_test", 3,
                             ["span6", "span3", "span3"])
        helper.add_fluid_row("litter_effects", 2, "span6")

        url = reverse("assessment:effect_tag_create",
                      kwargs={"pk": self.instance.assessment.pk})
        helper.addBtnLayout(helper.layout[4], 0, url, "Add new effect tag",
                            "span6")

        return helper

    LIT_EFF_REQ = "Litter effects required if a reproductive/developmental study"
    LIT_EFF_NOT_REQ = "Litter effects must be NA if non-reproductive/developmental study"
    LIT_EFF_NOTES_REQ = 'Notes are required if litter effects are "Other"'
    LIT_EFF_NOTES_NOT_REQ = "Litter effect notes should be blank if effects are not-applicable"

    def clean(self):
        cleaned_data = super().clean()
        obs_time = cleaned_data.get("observation_time")
        observation_time_units = cleaned_data.get("observation_time_units")
        litter_effects = cleaned_data.get("litter_effects")
        litter_effect_notes = cleaned_data.get("litter_effect_notes")

        if obs_time is not None and observation_time_units == 0:
            err = "If reporting an endpoint-observation time, time-units must be specified."
            self.add_error("observation_time_units", err)

        if obs_time is None and observation_time_units > 0:
            err = "An observation-time must be reported if time-units are specified"
            self.add_error("observation_time", err)

        if self.instance.litter_effect_required():
            if litter_effects == "NA":
                self.add_error("litter_effects", self.LIT_EFF_REQ)
        elif not self.instance.litter_effect_optional(
        ) and litter_effects != "NA":
            self.add_error("litter_effects", self.LIT_EFF_NOT_REQ)

        if litter_effects == "O" and litter_effect_notes == "":
            self.add_error("litter_effect_notes", self.LIT_EFF_NOTES_REQ)

        if litter_effects == "NA" and litter_effect_notes != "":
            self.add_error("litter_effect_notes", self.LIT_EFF_NOTES_NOT_REQ)

        return cleaned_data

    def clean_confidence_interval(self):
        confidence_interval = self.cleaned_data["confidence_interval"]
        data_type = self.cleaned_data.get("data_type")
        if data_type == "P" and confidence_interval is None:
            raise forms.ValidationError("Confidence-interval is required for"
                                        "percent-difference data")
        return confidence_interval

    def clean_variance_type(self):
        data_type = self.cleaned_data.get("data_type")
        variance_type = self.cleaned_data.get("variance_type")
        if data_type == "C" and variance_type == 0:
            raise forms.ValidationError(
                "If entering continuous data, the variance type must be SD"
                "(standard-deviation) or SE (standard error)")
        return variance_type

    def clean_response_units(self):
        response_units = self.cleaned_data.get("response_units")
        data_extracted = self.cleaned_data.get("data_extracted")
        if data_extracted and response_units == "":
            raise forms.ValidationError(
                "If data is extracted (see checkbox), response-units are required"
            )
        return response_units
예제 #21
0
class StudyPopulationForm(forms.ModelForm):

    CREATE_LEGEND = "Create new study-population"

    CREATE_HELP_TEXT = """
        Create a new study population. Each study-population is a
        associated with an epidemiology study. There may be
        multiple study populations with a single study,
        though this is typically unlikely."""

    UPDATE_HELP_TEXT = "Update an existing study-population."

    CRITERION_FIELDS = [
        "inclusion_criteria", "exclusion_criteria", "confounding_criteria"
    ]

    CRITERION_TYPE_CW = {
        "inclusion_criteria": "I",
        "exclusion_criteria": "E",
        "confounding_criteria": "C",
    }

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    confounding_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    class Meta:
        model = models.StudyPopulation
        exclude = ('study', 'criteria')

    def __init__(self, *args, **kwargs):
        study = kwargs.pop('parent', None)
        super().__init__(*args, **kwargs)
        self.fields['comments'] = self.fields.pop('comments')  # move to end
        self.fields['region'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.RegionLookup, allow_new=True)
        self.fields['state'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.StateLookup, allow_new=True)
        if study:
            self.instance.study = study

        for fld in self.CRITERION_FIELDS:
            self.fields[fld].widget.update_query_parameters(
                {'related': self.instance.study.assessment_id})
            if self.instance.id:
                self.fields[fld].initial = getattr(self.instance, fld)

        self.helper = self.setHelper()

    def save_criteria(self):
        """
        StudyPopulationCriteria is a through model; requires the criteria type.
        We save the m2m relations using the additional information from the
        field-name
        """
        self.instance.spcriteria.all().delete()
        objs = []
        for field in self.CRITERION_FIELDS:
            for criteria in self.cleaned_data.get(field, []):
                objs.append(
                    models.StudyPopulationCriteria(
                        criteria=criteria,
                        study_population=self.instance,
                        criteria_type=self.CRITERION_TYPE_CW[field]))
        models.StudyPopulationCriteria.objects.bulk_create(objs)

    def save(self, commit=True):
        instance = super().save(commit)
        if commit:
            self.save_criteria()
        return instance

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in self.CRITERION_FIELDS:
                    widget.attrs['class'] = 'span10'
                else:
                    widget.attrs['class'] = 'span12'
            if type(widget) == forms.Textarea:
                widget.attrs['rows'] = 3

        if self.instance.id:
            inputs = {
                "legend_text": "Update {}".format(self.instance),
                "help_text": self.UPDATE_HELP_TEXT,
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": self.CREATE_LEGEND,
                "help_text": self.CREATE_HELP_TEXT,
                "cancel_url": self.instance.study.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row('name', 2, "span6")
        helper.add_fluid_row('age_profile', 2, "span6")
        helper.add_fluid_row('country', 3, "span4")
        helper.add_fluid_row('eligible_n', 3, "span4")
        helper.add_fluid_row('inclusion_criteria', 3, "span4")

        url = reverse('epi:studycriteria_create',
                      kwargs={'pk': self.instance.study.assessment.pk})
        helper.addBtnLayout(helper.layout[6], 0, url, "Create criteria",
                            "span4")
        helper.addBtnLayout(helper.layout[6], 1, url, "Create criteria",
                            "span4")
        helper.addBtnLayout(helper.layout[6], 2, url, "Create criteria",
                            "span4")

        return helper
예제 #22
0
class EndpointFilterForm(forms.Form):

    ORDER_BY_CHOICES = [
        ("animal_group__experiment__study__short_citation", "study"),
        ("animal_group__experiment__name", "experiment name"),
        ("animal_group__name", "animal group"),
        ("name", "endpoint name"),
        ("animal_group__dosing_regime__doses__dose_units_id", "dose units"),
        ("system", "system"),
        ("organ", "organ"),
        ("effect", "effect"),
        ["-NOEL", "<NOEL-NAME>"],
        ["-LOEL", "<LOEL-NAME>"],
        # BMD/BMDL is stored in output which is a JsonField on the bmd Model object. We want to sort on a sub-field of that.
        # when/if HAWC upgrades to Django 2.1 (see yekta's comment on https://stackoverflow.com/questions/36641759/django-1-9-jsonfield-order-by)
        # could possibly do something like this instead.
        # for now we use a custom sort string and handle it in EndpointList class
        # ('bmd_model__model__output__-BMD', 'BMD'),
        # ('bmd_model__model__output__-BMDL', 'BMDLS'),
        ("customBMD", "BMD"),
        ("customBMDLS", "BMDLS"),
        ("effect_subtype", "effect subtype"),
        ("animal_group__experiment__chemical", "chemical"),
    ]

    studies = selectable.AutoCompleteSelectMultipleField(
        label="Study reference",
        lookup_class=AnimalStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False,
    )

    chemical = forms.CharField(
        label="Chemical name",
        widget=selectable.AutoCompleteWidget(lookups.ExpChemicalLookup),
        help_text="ex: sodium",
        required=False,
    )

    cas = forms.CharField(
        label="CAS",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedExperimentCASLookup),
        help_text="ex: 107-02-8",
        required=False,
    )

    lifestage_exposed = forms.CharField(
        label="Lifestage exposed",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedAnimalGroupLifestageExposedLookup),
        help_text="ex: pup",
        required=False,
    )

    lifestage_assessed = forms.CharField(
        label="Lifestage assessed",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedAnimalGroupLifestageAssessedLookup),
        help_text="ex: adult",
        required=False,
    )

    species = selectable.AutoCompleteSelectField(
        label="Species",
        lookup_class=SpeciesLookup,
        help_text="ex: Mouse",
        required=False,
    )

    strain = selectable.AutoCompleteSelectField(
        label="Strain",
        lookup_class=StrainLookup,
        help_text="ex: B6C3F1",
        required=False,
    )

    sex = forms.MultipleChoiceField(
        choices=models.AnimalGroup.SEX_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        initial=[c[0] for c in models.AnimalGroup.SEX_CHOICES],
        required=False,
    )

    data_extracted = forms.ChoiceField(
        choices=((True, "Yes"), (False, "No"), (None, "All data")),
        initial=None,
        required=False,
    )

    name = forms.CharField(
        label="Endpoint name",
        widget=selectable.AutoCompleteWidget(
            lookups.EndpointByAssessmentTextLookup),
        help_text="ex: heart weight",
        required=False,
    )

    system = forms.CharField(
        label="System",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedEndpointSystemLookup),
        help_text="ex: endocrine",
        required=False,
    )

    organ = forms.CharField(
        label="Organ",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedEndpointOrganLookup),
        help_text="ex: pituitary",
        required=False,
    )

    effect = forms.CharField(
        label="Effect",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedEndpointEffectLookup),
        help_text="ex: alanine aminotransferase (ALT)",
        required=False,
    )

    effect_subtype = forms.CharField(
        label="Effect Subtype",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedEndpointEffectSubtypeLookup),
        help_text="ex: ",
        required=False,
    )

    tags = forms.CharField(
        label="Tags",
        widget=selectable.AutoCompleteWidget(EffectTagLookup),
        help_text="ex: antibody response",
        required=False,
    )

    dose_units = forms.ModelChoiceField(queryset=DoseUnits.objects.all(),
                                        required=False)

    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, )

    paginate_by = forms.IntegerField(label="Items per page",
                                     min_value=1,
                                     initial=25,
                                     max_value=10000,
                                     required=False)

    def __init__(self, *args, **kwargs):
        assessment = kwargs.pop("assessment")
        super().__init__(*args, **kwargs)
        noel_names = assessment.get_noel_names()

        for field in self.fields:
            if field not in (
                    "sex",
                    "data_extracted",
                    "dose_units",
                    "order_by",
                    "paginate_by",
            ):
                self.fields[field].widget.update_query_parameters(
                    {"related": assessment.id})

        for i, (k, v) in enumerate(self.fields["order_by"].choices):
            if v == "<NOEL-NAME>":
                self.fields["order_by"].choices[i][1] = noel_names.noel
                self.fields["order_by"].widget.choices[i][1] = noel_names.noel
            elif v == "<LOEL-NAME>":
                self.fields["order_by"].choices[i][1] = noel_names.loel
                self.fields["order_by"].widget.choices[i][1] = noel_names.loel

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [
                    forms.CheckboxInput, forms.CheckboxSelectMultiple
            ]:
                widget.attrs["class"] = "span12"

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row("studies", 4, "span3")
        helper.add_fluid_row("species", 4, "span3")
        helper.add_fluid_row("name", 4, "span3")
        helper.add_fluid_row("tags", 4, "span3")

        helper.layout.append(
            cfb.FormActions(cfl.Submit("submit", "Apply filters"), ))

        return helper

    def get_query(self):

        studies = self.cleaned_data.get("studies")
        chemical = self.cleaned_data.get("chemical")
        cas = self.cleaned_data.get("cas")
        lifestage_exposed = self.cleaned_data.get("lifestage_exposed")
        lifestage_assessed = self.cleaned_data.get("lifestage_assessed")
        species = self.cleaned_data.get("species")
        strain = self.cleaned_data.get("strain")
        sex = self.cleaned_data.get("sex")
        data_extracted = self.cleaned_data.get("data_extracted")
        name = self.cleaned_data.get("name")
        system = self.cleaned_data.get("system")
        organ = self.cleaned_data.get("organ")
        effect = self.cleaned_data.get("effect")
        effect_subtype = self.cleaned_data.get("effect_subtype")
        NOEL = self.cleaned_data.get("NOEL")
        LOEL = self.cleaned_data.get("LOEL")
        tags = self.cleaned_data.get("tags")
        dose_units = self.cleaned_data.get("dose_units")

        query = Q()
        if studies:
            query &= Q(animal_group__experiment__study__in=studies)
        if chemical:
            query &= Q(animal_group__experiment__chemical__icontains=chemical)
        if cas:
            query &= Q(animal_group__experiment__cas__icontains=cas)
        if lifestage_exposed:
            query &= Q(
                animal_group__lifestage_exposed__icontains=lifestage_exposed)
        if lifestage_assessed:
            query &= Q(
                animal_group__lifestage_assessed__icontains=lifestage_assessed)
        if species:
            query &= Q(animal_group__species=species)
        if strain:
            query &= Q(animal_group__strain__name__icontains=strain.name)
        if sex:
            query &= Q(animal_group__sex__in=sex)
        if data_extracted:
            query &= Q(data_extracted=data_extracted == "True")
        if name:
            query &= Q(name__icontains=name)
        if system:
            query &= Q(system__icontains=system)
        if organ:
            query &= Q(organ__icontains=organ)
        if effect:
            query &= Q(effect__icontains=effect)
        if effect_subtype:
            query &= Q(effect_subtype__icontains=effect_subtype)
        if NOEL:
            query &= Q(NOEL__icontains=NOEL)
        if LOEL:
            query &= Q(LOEL__icontains=LOEL)
        if tags:
            query &= Q(effects__name__icontains=tags)
        if dose_units:
            query &= Q(
                animal_group__dosing_regime__doses__dose_units=dose_units)
        return query

    def get_order_by(self):
        return self.cleaned_data.get("order_by", self.ORDER_BY_CHOICES[0][0])

    def get_dose_units_id(self):
        if hasattr(self,
                   "cleaned_data") and self.cleaned_data.get("dose_units"):
            return self.cleaned_data.get("dose_units").id
예제 #23
0
class AssessedOutcomeForm(forms.ModelForm):

    HELP_TEXT_CREATE = """Create a new assessed outcome. An assessed
        outcome is an response measured in an epidemiological study,
        associated with an exposure-metric. The overall assessed outcome is
        described, and then quantitative differences in response based on
        different exposure-metric groups is detailed below.
    """
    HELP_TEXT_UPDATE = """Create a new assessed outcome. An assessed
        outcome is an response measured in an epidemiological study,
        associated with an exposure-metric. The overall assessed outcome is
        described, and then quantitative differences in response based on
        different exposure-metric groups is detailed below.
    """

    adjustment_factors = selectable.AutoCompleteSelectMultipleField(
        help_text="All factors which were included in final model",
        lookup_class=lookups.FactorLookup,
        required=False)

    confounders_considered = selectable.AutoCompleteSelectMultipleField(
        label="Adjustment factors considered",
        help_text=
        "All factors which were examined (including those which were included in final model)",
        lookup_class=lookups.FactorLookup,
        required=False)

    class Meta:
        model = models.AssessedOutcome
        exclude = ('assessment', 'exposure')

    def __init__(self, *args, **kwargs):
        assessment = kwargs.pop('assessment', None)
        exposure = kwargs.pop('parent', None)
        super(AssessedOutcomeForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget = selectable.AutoCompleteWidget(
            lookup_class=BaseEndpointLookup, allow_new=True)
        self.fields[
            'effects'].widget = selectable.AutoCompleteSelectMultipleWidget(
                lookup_class=EffectTagLookup)
        self.fields[
            'effects'].help_text = 'Tags used to help categorize effect description.'
        if assessment:
            self.instance.assessment = assessment
        if exposure:
            self.instance.exposure = exposure

        self.fields['adjustment_factors'].widget.update_query_parameters(
            {'related': self.instance.assessment.id})
        self.fields['confounders_considered'].widget.update_query_parameters(
            {'related': self.instance.assessment.id})

        self.fields['main_finding'].queryset = self.fields['main_finding']\
            .queryset.filter(exposure=self.instance.exposure)

        self.helper = self.setHelper()

    def setHelper(self):
        for fld in ('diagnostic_description', 'summary',
                    'prevalence_incidence', 'statistical_power_details',
                    'dose_response_details', 'statistical_metric_description'):
            self.fields[fld].widget.attrs['rows'] = 3

        for fld in self.fields.keys():
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in [
                        "adjustment_factors", "confounders_considered",
                        "effects"
                ]:
                    widget.attrs['class'] = 'span11'
                else:
                    widget.attrs['class'] = 'span12'

        if self.instance.id:
            inputs = {
                "legend_text": u"Update {}".format(self.instance),
                "help_text": self.HELP_TEXT_UPDATE,
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": u"Create new exposure",
                "help_text": self.HELP_TEXT_CREATE,
                "cancel_url": self.instance.exposure.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row('effects', 2, "span6")
        helper.add_fluid_row('diagnostic', 2, "span6")
        helper.add_fluid_row('summary', 2, "span6")
        helper.add_fluid_row('adjustment_factors', 2, "span6")
        helper.add_fluid_row('dose_response', 2, "span6")
        helper.add_fluid_row('statistical_power', 2, "span6")
        helper.add_fluid_row('main_finding', 2, "span6")
        helper.add_fluid_row('statistical_metric', 2, "span6")

        url = "{% url 'assessment:effect_tag_create' assessment.pk %}"
        helper.add_adder("addEffectTags", "Add new effect tag", url)

        url = "{% url 'epi:factor_create' assessment.pk %}"
        helper.add_adder("addAdj", "Add new adjustment factor", url)
        helper.add_adder("addAdjCons", "Add new adjustment factor", url)

        return helper
예제 #24
0
class StudyPopulationForm(forms.ModelForm):

    CREATE_LEGEND = "Create new study-population"

    UPDATE_HELP_TEXT = "Update an existing study-population."

    CRITERION_FIELDS = [
        "inclusion_criteria", "exclusion_criteria", "confounding_criteria"
    ]

    CRITERION_TYPE_CW = {
        "inclusion_criteria": "I",
        "exclusion_criteria": "E",
        "confounding_criteria": "C",
    }

    inclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    exclusion_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    confounding_criteria = selectable.AutoCompleteSelectMultipleField(
        lookup_class=lookups.CriteriaLookup, required=False)

    class Meta:
        model = models.StudyPopulation
        exclude = ('study', 'criteria')
        labels = {
            'comments':
            'Recruitment description'  # could also change field name in models.py from comments to recruitment_description, but this seems less disruptive!
        }

    def __init__(self, *args, **kwargs):
        study = kwargs.pop('parent', None)
        super().__init__(*args, **kwargs)
        self.fields['comments'] = self.fields.pop('comments')  # move to end
        self.fields['region'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.RegionLookup, allow_new=True)
        self.fields['state'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.StateLookup, allow_new=True)
        if study:
            self.instance.study = study

        for fld in self.CRITERION_FIELDS:
            self.fields[fld].widget.update_query_parameters(
                {'related': self.instance.study.assessment_id})
            if self.instance.id:
                self.fields[fld].initial = getattr(self.instance, fld)

            # set the help text here for the correct criteria field
            self.fields[fld].help_text = self.instance.CRITERIA_HELP_TEXTS.get(
                fld, "")

        self.helper = self.setHelper()

    def save_criteria(self):
        """
        StudyPopulationCriteria is a through model; requires the criteria type.
        We save the m2m relations using the additional information from the
        field-name
        """
        self.instance.spcriteria.all().delete()
        objs = []
        for field in self.CRITERION_FIELDS:
            for criteria in self.cleaned_data.get(field, []):
                objs.append(
                    models.StudyPopulationCriteria(
                        criteria=criteria,
                        study_population=self.instance,
                        criteria_type=self.CRITERION_TYPE_CW[field]))
        models.StudyPopulationCriteria.objects.bulk_create(objs)

    def save(self, commit=True):
        instance = super().save(commit)
        if commit:
            self.save_criteria()
        return instance

    def setHelper(self):
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in self.CRITERION_FIELDS:
                    widget.attrs['class'] = 'span10'
                else:
                    widget.attrs['class'] = 'span12'
            if type(widget) == forms.Textarea:
                widget.attrs['rows'] = 3

        if self.instance.id:
            inputs = {
                "legend_text": "Update {}".format(self.instance),
                "help_text": self.UPDATE_HELP_TEXT,
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": self.CREATE_LEGEND,
                "cancel_url": self.instance.study.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.add_fluid_row('name', 2, "span6")
        helper.add_fluid_row('age_profile', 2, "span6")
        helper.add_fluid_row('country', 3, "span4")
        helper.add_fluid_row('eligible_n', 3, "span4")
        helper.add_fluid_row('inclusion_criteria', 3, "span4")

        url = reverse('epi:studycriteria_create',
                      kwargs={'pk': self.instance.study.assessment.pk})

        # remove magic number 6; breaks if we change number of elements in the form. This still isn't great; what if comments went away?
        btn_target_idx = helper.find_layout_idx_for_field_name('comments') - 1
        helper.addBtnLayout(helper.layout[btn_target_idx], 0, url,
                            "Create criteria", "span4")
        helper.addBtnLayout(helper.layout[btn_target_idx], 1, url,
                            "Create criteria", "span4")
        helper.addBtnLayout(helper.layout[btn_target_idx], 2, url,
                            "Create criteria", "span4")

        return helper
예제 #25
0
파일: forms.py 프로젝트: shanethacker/hawc
class EndpointForm(ModelForm):

    effects = selectable.AutoCompleteSelectMultipleField(
        lookup_class=EffectTagLookup,
        required=False,
        help_text="Any additional descriptive-tags used to categorize the outcome",
        label="Additional tags"
    )

    class Meta:
        model = models.Endpoint
        fields = ('name',
                  'system', 'organ', 'effect', 'effect_subtype',
                  'effects', 'diagnostic',
                  'observation_time', 'observation_time_units', 'observation_time_text',
                  'data_reported', 'data_extracted', 'values_estimated',
                  'data_type', 'variance_type', 'confidence_interval',
                  'response_units', 'data_location', 'expected_adversity_direction',
                  'NOEL', 'LOEL', 'FEL', 'monotonicity',
                  'statistical_test', 'trend_result', 'trend_value',
                  'power_notes', 'results_notes', 'endpoint_notes')

    def __init__(self, *args, **kwargs):
        animal_group = kwargs.pop('parent', None)
        assessment = kwargs.pop('assessment', None)
        super().__init__(*args, **kwargs)

        self.fields['NOEL'].widget = forms.Select()
        self.fields['LOEL'].widget = forms.Select()
        self.fields['FEL'].widget = forms.Select()

        self.fields['system'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointSystemLookup,
            allow_new=True)

        self.fields['organ'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointOrganLookup,
            allow_new=True)

        self.fields['effect'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectLookup,
            allow_new=True)

        self.fields['effect_subtype'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointEffectSubtypeLookup,
            allow_new=True)

        self.fields['statistical_test'].widget = selectable.AutoCompleteWidget(
            lookup_class=lookups.EndpointStatisticalTestLookup,
            allow_new=True)

        if animal_group:
            self.instance.animal_group = animal_group
            self.instance.assessment = assessment

        self.fields["name"].help_text = """
            Short-text used to describe the endpoint.
            Should include observation-time,
            if multiple endpoints have the same observation time."""

        self.helper = self.setHelper()

    def setHelper(self):
        if self.instance.id:
            inputs = {
                "legend_text": "Update {}".format(self.instance),
                "help_text":   "Update an existing endpoint.",
                "cancel_url": self.instance.get_absolute_url()
            }
        else:
            inputs = {
                "legend_text": "Create new endpoint",
                "help_text":   """
                    Create a new endpoint. An endpoint may should describe one
                    measure-of-effect which was measured in the study. It may
                    or may not contain quantitative data.""",
                "cancel_url": self.instance.animal_group.get_absolute_url()
            }

        helper = BaseFormHelper(self, **inputs)
        helper.form_class = None
        helper.form_id = "endpoint"

        self.fields['diagnostic'].widget.attrs['rows'] = 2
        for fld in ('results_notes', 'endpoint_notes', 'power_notes'):
            self.fields[fld].widget.attrs['rows'] = 3

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) != forms.CheckboxInput:
                if fld in ["effects"]:
                    widget.attrs['class'] = 'span10'
                else:
                    widget.attrs['class'] = 'span12'

        helper.add_fluid_row('system', 4, "span3")
        helper.add_fluid_row('effects', 2, "span6")
        helper.add_fluid_row('observation_time', 3, "span4")
        helper.add_fluid_row('data_reported', 3, "span4")
        helper.add_fluid_row('data_type', 3, "span4")
        helper.add_fluid_row('response_units', 3, "span4")
        helper.add_fluid_row('NOEL', 4, "span3")
        helper.add_fluid_row('statistical_test', 3, ["span6", "span3", "span3"])

        url = reverse('assessment:effect_tag_create', kwargs={'pk': self.instance.assessment.pk})
        helper.addBtnLayout(helper.layout[4], 0, url, "Add new effect tag", "span6")

        return helper

    def clean(self):
        cleaned_data = super().clean()
        obs_time = cleaned_data.get("observation_time")
        observation_time_units = cleaned_data.get("observation_time_units")

        if obs_time is not None and observation_time_units == 0:
            err = "If reporting an endpoint-observation time, time-units must be specified."
            self.add_error('observation_time_units', err)

        if obs_time is None and observation_time_units > 0:
            err = "An observation-time must be reported if time-units are specified"
            self.add_error('observation_time', err)

    def clean_confidence_interval(self):
        confidence_interval = self.cleaned_data['confidence_interval']
        data_type = self.cleaned_data.get("data_type")
        if data_type == "P" and confidence_interval is None:
            raise forms.ValidationError("Confidence-interval is required for"
                                        "percent-difference data")
        return confidence_interval

    def clean_variance_type(self):
        data_type = self.cleaned_data.get("data_type")
        variance_type = self.cleaned_data.get("variance_type")
        if data_type == "C" and variance_type == 0:
            raise forms.ValidationError(
                "If entering continuous data, the variance type must be SD"
                "(standard-deviation) or SE (standard error)")
        return variance_type

    def clean_response_units(self):
        response_units = self.cleaned_data.get("response_units")
        data_extracted = self.cleaned_data.get("data_extracted")
        if data_extracted and response_units == "":
            raise forms.ValidationError("If data is extracted (see checkbox), response-units are required")
        return response_units
예제 #26
0
class ArtistForm(ModelForm):
    class Meta:
        model = Artist
        fields = ('name', 'real_name', 'aliases', 'type', 'country',
                  'biography', 'main_image', 'd_tags')

    def __init__(self, *args, **kwargs):

        self.user = kwargs['initial']['user']
        self.instance = kwargs['instance']

        print self.instance

        print self.user.has_perm("alibrary.edit_release")
        print self.user.has_perm("alibrary.admin_release", self.instance)

        self.label = kwargs.pop('label', None)

        super(ArtistForm, self).__init__(*args, **kwargs)
        """
        Prototype function, set some fields to readonly depending on permissions
        """
        """
        if not self.user.has_perm("alibrary.admin_release", self.instance):
            self.fields['catalognumber'].widget.attrs['readonly'] = 'readonly'
        """

        self.helper = FormHelper()
        self.helper.form_id = "id_feedback_form_%s" % 'asd'
        self.helper.form_class = 'form-horizontal'
        self.helper.form_method = 'post'
        self.helper.form_action = ''
        self.helper.form_tag = False

        base_layout = Fieldset(
            _('General'),
            LookupField('name', css_class='input-xlarge'),
            LookupField('real_name', css_class='input-xlarge'),
            LookupField('type', css_class='input-xlarge'),
            LookupField('country', css_class='input-xlarge'),
        )

        alias_layout = Fieldset(
            _('Alias(es)'),
            Field('aliases', css_class='input-xlarge'),
            Field('members', css_class='input-xlarge'),
        )

        catalog_layout = Fieldset(
            _('Label/Catalog'),
            LookupField('label', css_class='input-xlarge'),
            LookupField('catalognumber', css_class='input-xlarge'),
            LookupField('release_country', css_class='input-xlarge'),
            # LookupField('releasedate', css_class='input-xlarge'),
            LookupField('releasedate_approx', css_class='input-xlarge'),
        )

        meta_layout = Fieldset(
            'Meta',
            LookupField('biography', css_class='input-xxlarge'),
            'main_image',
        )

        tagging_layout = Fieldset(
            'Tags',
            'd_tags',
        )

        layout = Layout(
            base_layout,
            # artist_layout,
            meta_layout,
            alias_layout,
            tagging_layout,
        )

        self.helper.add_layout(layout)

    main_image = forms.Field(widget=FileInput(), required=False)
    #releasedate = forms.DateField(required=False,widget=forms.DateInput(format = '%Y-%m-%d'), input_formats=('%Y-%m-%d',))
    #releasedate_approx = ApproximateDateFormField(label="Releasedate", required=False)
    d_tags = TagField(widget=TagAutocompleteTagIt(max_tags=9),
                      required=False,
                      label=_('Tags'))
    #name = forms.CharField(widget=selectable.AutoCompleteWidget(ReleaseNameLookup), required=True)
    #label = selectable.AutoCompleteSelectField(ReleaseLabelLookup, allow_new=True, required=False)
    biography = forms.CharField(widget=PagedownWidget(),
                                required=False,
                                help_text="Markdown enabled text")

    aliases = selectable.AutoCompleteSelectMultipleField(ArtistLookup,
                                                         required=False)
    # aliases  = make_ajax_field(Artist,'aliases','aliases',help_text=None)

    members = selectable.AutoCompleteSelectMultipleField(ArtistLookup,
                                                         required=False)

    def clean(self, *args, **kwargs):

        cd = super(ArtistForm, self).clean()

        print "*************************************"
        print cd
        print "*************************************"

        if 'main_image' in cd and cd['main_image'] != None:
            try:
                ui = cd['main_image']
                dj_file = DjangoFile(open(ui.temporary_file_path()),
                                     name='cover.jpg')
                cd['main_image'], created = Image.objects.get_or_create(
                    original_filename='cover_%s.jpg' % self.instance.pk,
                    file=dj_file,
                    folder=self.instance.folder,
                    is_public=True)
            except Exception, e:
                print e
                pass

        else:
예제 #27
0
class IVEndpointFilterForm(forms.Form):

    ORDER_BY_CHOICES = (
        ('experiment__study__short_citation', 'study'),
        ('name', 'endpoint name'),
        ('assay_type', 'assay type'),
        ('effect', 'effect'),
        ('chemical__name', 'chemical'),
        ('category__name', 'category'),
        ('observation_time', 'observation time'),
    )

    studies = selectable.AutoCompleteSelectMultipleField(
        label='Study reference',
        lookup_class=InvitroStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False)

    name = forms.CharField(label='Endpoint name',
                           widget=selectable.AutoCompleteWidget(
                               lookups.IVEndpointByAssessmentTextLookup),
                           help_text="ex: B cells",
                           required=False)

    chemical = forms.CharField(label='Chemical name',
                               widget=selectable.AutoCompleteWidget(
                                   lookups.RelatedIVChemicalNameLookup),
                               help_text="ex: PFOA",
                               required=False)

    cas = forms.CharField(label='CAS',
                          widget=selectable.AutoCompleteWidget(
                              lookups.RelatedIVChemicalCASLookup),
                          help_text="ex: 107-02-8",
                          required=False)

    cell_type = forms.CharField(label='Cell type',
                                widget=selectable.AutoCompleteWidget(
                                    lookups.RelatedIVCellTypeNameLookup),
                                help_text='ex: HeLa',
                                required=False)

    tissue = forms.CharField(label='Tissue',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedIVCellTypeTissueLookup),
                             help_text='ex: adipocytes',
                             required=False)

    effect = forms.CharField(label='Effect',
                             widget=selectable.AutoCompleteWidget(
                                 lookups.RelatedIVEndpointEffectLookup),
                             help_text="ex: gene expression",
                             required=False)

    response_units = forms.CharField(
        label='Response units',
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVEndpointResponseUnitsLookup),
        help_text="ex: counts",
        required=False)

    dose_units = forms.ModelChoiceField(queryset=DoseUnits.objects.all(),
                                        required=False)

    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, )

    paginate_by = forms.IntegerField(label='Items per page',
                                     min_value=1,
                                     initial=25,
                                     max_value=10000,
                                     required=False)

    def __init__(self, *args, **kwargs):
        assessment_id = kwargs.pop('assessment_id')
        super().__init__(*args, **kwargs)
        for field in self.fields:
            if field not in ('dose_units', 'order_by', 'paginate_by'):
                self.fields[field].widget.update_query_parameters(
                    {'related': assessment_id})

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [
                    forms.CheckboxInput, forms.CheckboxSelectMultiple
            ]:
                widget.attrs['class'] = 'span12'

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row('studies', 4, "span3")
        helper.add_fluid_row('cell_type', 4, "span3")
        helper.add_fluid_row('dose_units', 4, "span3")

        helper.layout.append(
            cfb.FormActions(cfl.Submit('submit', 'Apply filters'), ))

        return helper

    def get_query(self):

        studies = self.cleaned_data.get('studies')
        name = self.cleaned_data.get('name')
        chemical = self.cleaned_data.get('chemical')
        cas = self.cleaned_data.get('cas')
        cell_type = self.cleaned_data.get('cell_type')
        tissue = self.cleaned_data.get('tissue')
        effect = self.cleaned_data.get('effect')
        response_units = self.cleaned_data.get('response_units')
        dose_units = self.cleaned_data.get('dose_units')

        query = Q()
        if studies:
            query &= Q(experiment__study__in=studies)
        if name:
            query &= Q(name__icontains=name)
        if chemical:
            query &= Q(chemical__name__icontains=chemical)
        if cas:
            query &= Q(chemical__cas__icontains=cas)
        if cell_type:
            query &= Q(experiment__cell_type__cell_type__icontains=cell_type)
        if tissue:
            query &= Q(experiment__cell_type__tissue__icontains=tissue)
        if effect:
            query &= Q(effect__icontains=effect)
        if response_units:
            query &= Q(response_units__icontains=response_units)
        if dose_units:
            query &= Q(experiment__dose_units=dose_units)
        return query

    def get_order_by(self):
        return self.cleaned_data.get('order_by', self.ORDER_BY_CHOICES[0][0])

    def get_dose_units_id(self):
        if hasattr(self,
                   "cleaned_data") and self.cleaned_data.get('dose_units'):
            return self.cleaned_data.get('dose_units').id
예제 #28
0
class FruitForm(forms.Form):
    autocomplete = forms.CharField(
        label='Type the name of a fruit (AutoCompleteWidget)',
        widget=selectable.AutoCompleteWidget(FruitLookup),
        required=False,
    )
    newautocomplete = forms.CharField(
        label='Type the name of a fruit (AutoCompleteWidget which allows new items)',
        widget=selectable.AutoCompleteWidget(FruitLookup, allow_new=True),
        required=False,
    )
    combobox = forms.CharField(
        label='Type/select the name of a fruit (AutoComboboxWidget)',
        widget=selectable.AutoComboboxWidget(FruitLookup),
        required=False,
    )
    newcombobox = forms.CharField(
        label='Type/select the name of a fruit (AutoComboboxWidget which allows new items)',
        widget=selectable.AutoComboboxWidget(FruitLookup, allow_new=True),
        required=False,
    )
    # AutoCompleteSelectField (no new items)
    autocompleteselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteField)',
        required=False,
    )
    # AutoCompleteSelectField (allows new items)
    newautocompleteselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        allow_new=True,
        label='Select a fruit (AutoCompleteField which allows new items)',
        required=False,
    )
    # AutoCompleteSelectField (no new items)
    comboboxselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteSelectField with combobox)',
        required=False,
        widget=selectable.AutoComboboxSelectWidget
    )
    # AutoComboboxSelect (allows new items)
    newcomboboxselect = selectable.AutoCompleteSelectField(
        lookup_class=FruitLookup,
        allow_new=True,
        label='Select a fruit (AutoCompleteSelectField with combobox which allows new items)',
        required=False,
        widget=selectable.AutoComboboxSelectWidget
    )
    # AutoCompleteSelectMultipleField
    multiautocompleteselect = selectable.AutoCompleteSelectMultipleField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteSelectMultipleField)',
        required=False,
    )
    # AutoComboboxSelectMultipleField
    multicomboboxselect = selectable.AutoCompleteSelectMultipleField(
        lookup_class=FruitLookup,
        label='Select a fruit (AutoCompleteSelectMultipleField with combobox)',
        required=False,
        widget=selectable.AutoComboboxSelectMultipleWidget
    )
    # AutoComboboxSelectMultipleField with disabled attribute
    disabledmulticomboboxselect = selectable.AutoCompleteSelectMultipleField(
        lookup_class=FruitLookup,
        label='Disabled Selectable field',
        required=False,
        widget=selectable.AutoComboboxSelectMultipleWidget,
        initial={'1', '2'},
    )

    def __init__(self, *args, **kwargs):
        super(FruitForm, self).__init__(*args, **kwargs)
        self.fields['disabledmulticomboboxselect'].widget.attrs['disabled'] = 'disabled'
예제 #29
0
class IVEndpointFilterForm(forms.Form):

    ORDER_BY_CHOICES = (
        ("experiment__study__short_citation", "study"),
        ("experiment__name", "experiment name"),
        ("name", "endpoint name"),
        ("assay_type", "assay type"),
        ("effect", "effect"),
        ("chemical__name", "chemical"),
        ("category__name", "category"),
        ("observation_time", "observation time"),
        ("experiment__dose_units_id", "dose units"),
        ("response_units", "response units"),
    )

    studies = selectable.AutoCompleteSelectMultipleField(
        label="Study reference",
        lookup_class=InvitroStudyLookup,
        help_text="ex: Smith et al. 2010",
        required=False,
    )

    name = forms.CharField(
        label="Endpoint name",
        widget=selectable.AutoCompleteWidget(
            lookups.IVEndpointByAssessmentTextLookup),
        help_text="ex: B cells",
        required=False,
    )

    chemical = forms.CharField(
        label="Chemical name",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVChemicalNameLookup),
        help_text="ex: PFOA",
        required=False,
    )

    cas = forms.CharField(
        label="CAS",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVChemicalCASLookup),
        help_text="ex: 107-02-8",
        required=False,
    )

    cell_type = forms.CharField(
        label="Cell type",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVCellTypeNameLookup),
        help_text="ex: HeLa",
        required=False,
    )

    tissue = forms.CharField(
        label="Tissue",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVCellTypeTissueLookup),
        help_text="ex: adipocytes",
        required=False,
    )

    effect = forms.CharField(
        label="Effect",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVEndpointEffectLookup),
        help_text="ex: gene expression",
        required=False,
    )

    response_units = forms.CharField(
        label="Response units",
        widget=selectable.AutoCompleteWidget(
            lookups.RelatedIVEndpointResponseUnitsLookup),
        help_text="ex: counts",
        required=False,
    )

    dose_units = forms.ModelChoiceField(queryset=DoseUnits.objects.all(),
                                        required=False)

    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, )

    paginate_by = forms.IntegerField(label="Items per page",
                                     min_value=1,
                                     initial=25,
                                     max_value=10000,
                                     required=False)

    def __init__(self, *args, **kwargs):
        assessment = kwargs.pop("assessment")
        super().__init__(*args, **kwargs)
        for field in self.fields:
            if field not in ("dose_units", "order_by", "paginate_by"):
                self.fields[field].widget.update_query_parameters(
                    {"related": assessment.id})

        self.helper = self.setHelper()

    def setHelper(self):

        # by default take-up the whole row-fluid
        for fld in list(self.fields.keys()):
            widget = self.fields[fld].widget
            if type(widget) not in [
                    forms.CheckboxInput, forms.CheckboxSelectMultiple
            ]:
                widget.attrs["class"] = "span12"

        helper = BaseFormHelper(self)

        helper.form_method = "GET"
        helper.form_class = None

        helper.add_fluid_row("studies", 4, "span3")
        helper.add_fluid_row("cell_type", 4, "span3")
        helper.add_fluid_row("dose_units", 4, "span3")

        helper.layout.append(
            cfb.FormActions(cfl.Submit("submit", "Apply filters"), ))

        return helper

    def get_query(self):

        studies = self.cleaned_data.get("studies")
        name = self.cleaned_data.get("name")
        chemical = self.cleaned_data.get("chemical")
        cas = self.cleaned_data.get("cas")
        cell_type = self.cleaned_data.get("cell_type")
        tissue = self.cleaned_data.get("tissue")
        effect = self.cleaned_data.get("effect")
        response_units = self.cleaned_data.get("response_units")
        dose_units = self.cleaned_data.get("dose_units")

        query = Q()
        if studies:
            query &= Q(experiment__study__in=studies)
        if name:
            query &= Q(name__icontains=name)
        if chemical:
            query &= Q(chemical__name__icontains=chemical)
        if cas:
            query &= Q(chemical__cas__icontains=cas)
        if cell_type:
            query &= Q(experiment__cell_type__cell_type__icontains=cell_type)
        if tissue:
            query &= Q(experiment__cell_type__tissue__icontains=tissue)
        if effect:
            query &= Q(effect__icontains=effect)
        if response_units:
            query &= Q(response_units__icontains=response_units)
        if dose_units:
            query &= Q(experiment__dose_units=dose_units)
        return query

    def get_order_by(self):
        return self.cleaned_data.get("order_by", self.ORDER_BY_CHOICES[0][0])

    def get_dose_units_id(self):
        if hasattr(self,
                   "cleaned_data") and self.cleaned_data.get("dose_units"):
            return self.cleaned_data.get("dose_units").id