Source code for ontology.forms
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django import forms
from django.db.utils import ProgrammingError
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div
from crispy_bootstrap5.bootstrap5 import FloatingField
from dal import autocomplete
from .constants import TOPIC_RELATIONS_ASYM
from .models import Branch, AcademicField, Specialty, Tag, Topic
[docs]def academic_field_slug_choices():
choices = (("All", (("all", "All"),)),)
try:
for branch in Branch.objects.all():
if branch.name != "Multidisciplinary" and branch.journals.active().exists():
subchoices = ()
for acad_field in branch.academic_fields.all():
if acad_field.journals.active().exists():
subchoices += ((acad_field.slug, acad_field.name),)
choices += ((branch.name, subchoices),)
except ProgrammingError: # when running on new, empty database
pass
return choices
[docs]class SessionAcademicFieldForm(forms.Form):
acad_field_slug = forms.ChoiceField(
label="Academic Field", choices=academic_field_slug_choices()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.disable_csrf = True
self.helper.show_errors = True
self.helper.layout = Layout(Div(FloatingField("acad_field_slug")))
[docs]def specialty_slug_choices(acad_field_slug):
specialties = (
Specialty.objects.filter(acad_field__slug=acad_field_slug)
if acad_field_slug
else Specialty.objects.none()
)
choices = (("all", "All specialties"),)
for specialty in specialties.all():
choices += ((specialty.slug, str(specialty)),)
return choices
[docs]class SessionSpecialtyForm(forms.Form):
specialty_slug = forms.ChoiceField(
label="Specialty",
)
def __init__(self, *args, **kwargs):
try:
acad_field_slug = kwargs.pop("acad_field_slug")
except KeyError:
acad_field_slug = ""
super().__init__(*args, **kwargs)
self.fields["specialty_slug"].choices = specialty_slug_choices(acad_field_slug)
self.helper = FormHelper(self)
self.helper.disable_csrf = True
self.helper.show_errors = True
self.helper.layout = Layout(Div(FloatingField("specialty_slug")))
[docs]class SelectTagsForm(forms.Form):
tags = forms.ModelMultipleChoiceField(
queryset=Tag.objects.all(),
widget=autocomplete.ModelSelect2Multiple(url="/ontology/tag-autocomplete"),
label="",
)
[docs]class SelectTopicForm(forms.Form):
topic = forms.ModelMultipleChoiceField(
queryset=Topic.objects.all(),
widget=autocomplete.ModelSelect2Multiple(url="/ontology/topic-autocomplete"),
label="",
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["topic"].widget.attrs.update(
{"placeholder": "type here to find topic"}
)
[docs]class SelectLinkedTopicForm(forms.Form):
topic = forms.ModelMultipleChoiceField(
queryset=Topic.objects.all(),
widget=autocomplete.ModelSelect2Multiple(
url="/ontology/topic-linked-autocomplete", attrs={"data-html": True}
),
label="Find a topic (click to see it)",
)
[docs]class AddRelationAsymForm(forms.Form):
A = forms.ModelChoiceField(
queryset=Topic.objects.all(),
widget=autocomplete.ModelSelect2(url="/ontology/topic-autocomplete"),
label="",
)
relation = forms.ChoiceField(choices=TOPIC_RELATIONS_ASYM, label="")
B = forms.ModelChoiceField(
queryset=Topic.objects.all(),
widget=autocomplete.ModelSelect2(url="/ontology/topic-autocomplete"),
label="",
)