SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit e1f8cc51 authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Add linked lookups

parent 3f89c1fe
No related branches found
No related tags found
No related merge requests found
......@@ -17,6 +17,11 @@ class SelectTopicForm(forms.Form):
topic = AutoCompleteSelectField('topic_lookup')
class SelectLinkedTopicForm(forms.Form):
topic = AutoCompleteSelectField('linked_topic_lookup',
label='Lookup topic (click to see) ', help_text='')
class AddRelationAsymForm(forms.Form):
A = AutoCompleteSelectField('topic_lookup', label='', help_text='')
relation = forms.ChoiceField(choices=TOPIC_RELATIONS_ASYM, label='')
......
......@@ -12,13 +12,30 @@
<div class="row">
<div class="col-12">
<h3 class="highlight">Ontology</h3>
<p>
Welcome to SciPost's Ontology, which is a curated set of interlinked Topics
pertaining to all of the sciences.
</p>
<p>
Topics and their relations are defined by Editorial-level personnel.
</p>
<ul>
{% if perms.scipost.can_manage_ontology %}
<li><a href="{% url 'ontology:topic_create' %}">Add a Topic</a></li>
{% endif %}
<li><a href="{% url 'ontology:topics' %}">View list of Topics</a></li>
<li>
<ul class="list-inline">
<li class="list-inline-item">{{ select_linked_topic_form }}</li>
</ul>
</li>
</ul>
</div>
</div>
{% endblock content %}
{% block footer_script %}
{{ block.super }}
{{ select_linked_topic_form.media }}
{% endblock footer_script %}
......@@ -25,7 +25,9 @@
</li>
<li class="list-inline-item"><input class="btn btn-outline-secondary" type="submit" value="Filter"></li>
</ul>
</form>
</form>
</li>
<li>{{ select_linked_topic_form }}</li>
</ul>
</div>
</div>
......@@ -33,9 +35,10 @@
<div class="row">
<div class="col-12">
<ul>
<h3>Topics</h3>
<ul class="list-inline">
{% for topic in object_list %}
<li><a href="{% url 'ontology:topic_details' slug=topic.slug %}">{{ topic }}</a></li>
<li class="list-inline-item p-1"><a href="{% url 'ontology:topic_details' slug=topic.slug %}">{{ topic }}</a></li>
{% endfor %}
</ul>
......@@ -50,3 +53,8 @@
</div>
{% endblock content %}
{% block footer_script %}
{{ block.super }}
{{ select_linked_topic_form.media }}
{% endblock footer_script %}
......@@ -3,6 +3,7 @@ __license__ = "AGPL v3"
from django.core.exceptions import PermissionDenied
from django.shortcuts import render, reverse
from ajax_select import register, LookupChannel
......@@ -43,3 +44,21 @@ class TopicLookup(LookupChannel):
def check_auth(self, request):
if not request.user.has_perm('scipost.can_manage_ontology'):
raise PermissionDenied
@register('linked_topic_lookup')
class LinkedTopicLookup(LookupChannel):
model = Topic
def get_query(self, q, request):
return (self.model.objects.filter(name__icontains=q)[:10])
def format_item_display(self, item):
return
def format_match(self, item):
return "<span class='auto_lookup_display'><a href='%s'>%s</a></span>" % (
reverse('ontology:topic_details', kwargs={'slug': item.slug}), item)
def check_auth(self, request):
pass
......@@ -14,14 +14,17 @@ from django.views.generic.list import ListView
from guardian.decorators import permission_required
from .models import Tag, Topic, RelationAsym, RelationSym
from .forms import SelectTagForm, AddRelationAsymForm
from .forms import SelectTagForm, SelectLinkedTopicForm, AddRelationAsymForm
from scipost.forms import SearchTextForm
from scipost.mixins import PaginationMixin, PermissionsMixin
def ontology(request):
return render(request, 'ontology/ontology.html')
context = {
'select_linked_topic_form': SelectLinkedTopicForm(),
}
return render(request, 'ontology/ontology.html', context=context)
class TopicCreateView(PermissionsMixin, CreateView):
......@@ -69,7 +72,7 @@ def topic_remove_tag(request, slug, tag_id):
class TopicListView(PaginationMixin, ListView):
model = Topic
paginate_by = 25
paginate_by = 100
def get_queryset(self):
"""
......@@ -84,6 +87,7 @@ class TopicListView(PaginationMixin, ListView):
context = super().get_context_data(**kwargs)
context.update({
'searchform': SearchTextForm(initial={'text': self.request.GET.get('text')}),
'select_linked_topic_form': SelectLinkedTopicForm(),
})
return context
......@@ -103,10 +107,13 @@ class TopicDetailView(DetailView):
def add_relation_asym(request, slug):
form = AddRelationAsymForm(request.POST or None)
if form.is_valid():
relation = RelationAsym(A=form.cleaned_data['A'], relation=form.cleaned_data['relation'],
B=form.cleaned_data['B'])
relation.save()
messages.success(request, 'Relation successfully created')
relation, created = RelationAsym.objects.get_or_create(
A=form.cleaned_data['A'], relation=form.cleaned_data['relation'],
B=form.cleaned_data['B'])
if created:
messages.success(request, 'Relation successfully created')
else:
messages.info(request, 'This relation already exists')
else:
for error_messages in form.errors.values():
messages.warning(request, *error_messages)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment