Skip to content
This repository was archived by the owner on Jun 1, 2022. It is now read-only.

Commit 27ecb68

Browse files
committed
Fix related topic forms & reenable in topic editing view
1 parent 8b9f12f commit 27ecb68

File tree

8 files changed

+85
-32
lines changed

8 files changed

+85
-32
lines changed

editorsnotes/admin_custom/forms/common.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,37 @@
88

99
from editorsnotes.main.models.topics import Topic, TopicAssignment
1010

11-
#class TopicAssignmentWidget(forms.widgets.HiddenInput):
12-
# def render(self, name, value, attrs=None):
13-
# hidden_input = super(TopicAssignmentWidget, self).render(name, value, attrs=None)
14-
# if value:
15-
# topic = get_object_or_404(ProjectTopicContainer, id=value)
16-
# extra_content = topic.preferred_name
17-
# else:
18-
# extra_content = ''
19-
# return mark_safe(extra_content + hidden_input)
20-
#
21-
#class TopicAssignmentForm(ModelForm):
22-
# class Meta:
23-
# model = TopicNodeAssignment
24-
# widgets = {'topic': TopicNodeAssignmentWidget()}
25-
#
26-
#TopicAssignmentFormset = generic_inlineformset_factory(
27-
# TopicNodeAssignment, form=TopicNodeAssignmentForm, extra=1)
11+
class TopicAssignmentWidget(forms.widgets.HiddenInput):
12+
def render(self, name, value, attrs=None):
13+
hidden_input = super(TopicAssignmentWidget, self).render(name, value, attrs=None)
14+
if value:
15+
topic = get_object_or_404(Topic, id=value)
16+
extra_content = topic.preferred_name
17+
else:
18+
extra_content = ''
19+
return mark_safe(extra_content + hidden_input)
20+
21+
class TopicAssignmentForm(ModelForm):
22+
topic_id = forms.IntegerField(widget=TopicAssignmentWidget)
23+
class Meta:
24+
model = TopicAssignment
25+
fields = ('topic_id',)
26+
def __init__(self, *args, **kwargs):
27+
super(TopicAssignmentForm, self).__init__(*args, **kwargs)
28+
if self.instance and self.instance.id:
29+
self.fields['topic_id'].initial = self.instance.topic.id
30+
def clean_topic_id(self):
31+
data = self.cleaned_data['topic_id']
32+
if self.instance and self.instance.id:
33+
return data
34+
# If this is a new object, the "topic_id" is actually the
35+
# "topic_node_id". This is hacky and will be removed when we eventually
36+
# create interfaces for editing anything with the API
37+
topic_qs = Topic.objects.filter(topic_node_id=data)
38+
if not topic_qs.exists():
39+
raise forms.ValidationError('This topic does not exist.')
40+
self.cleaned_data['topic_qs'] = topic_qs
41+
return data
42+
43+
TopicAssignmentFormset = generic_inlineformset_factory(
44+
TopicAssignment, form=TopicAssignmentForm, extra=1)

editorsnotes/admin_custom/static/function/admin-bootstrap-base.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ $(document).ready(function () {
262262
// Replace this input with a text field
263263
$oldExtraField
264264
.prepend(ui.item.label)
265-
.find('input[name$=topic]').val(ui.item.id);
265+
.find('input[name$="topic_id"]').val(ui.item.id);
266266

267267
// Clear this input
268268
event.preventDefault();

editorsnotes/admin_custom/templates/topic_admin.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,12 @@ <h3>{% if form.instance.id %}Change {% else %}Add {% endif %}topic</h3>
4040
</fieldset>
4141
{% endwith %}
4242

43-
{% comment %}
4443
{% with formset=formsets.topicassignment %}
4544
<fieldset name="related_topics_fields" class="related-topics">
4645
<legend>Related topics</legend>
4746
{% include "includes/bootstrap_formset.html" %}
4847
</fieldset>
4948
{% endwith %}
50-
{% endcomment %}
5149

5250
<fieldset name="article_fields">
5351
<legend>Article</legend>

editorsnotes/admin_custom/tests.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010
class TopicAdminTestCase(WebTest):
1111
fixtures = ['projects.json']
12-
def create_test_topic(self):
12+
def create_test_topic(self, name=u'Emma Goldman'):
1313
project = main_models.Project.objects.get(slug='emma');
1414
node, topic = main_models.Topic.objects.create_along_with_node(
15-
u'Emma Goldman', project, project.members.get())
15+
name, project, project.members.get())
1616
return topic
1717
def test_create_topic(self):
1818
"A user should be able to create a topic with a unique name."
@@ -58,6 +58,43 @@ def test_add_citation(self):
5858
self.assertEqual(topic.summary_cites.get().document_id, document.id)
5959
self.assertEqual(topic.summary_cites.get().object_id, topic.id)
6060

61+
def test_add_related_topics(self):
62+
topic = self.create_test_topic()
63+
64+
# This is to make sure topic id counter and topic node id counter are
65+
# off. hope you can handle that
66+
main_models.TopicNode.objects.create(_preferred_name='dummy',
67+
creator_id=1, last_updater_id=1)
68+
69+
topic_2 = self.create_test_topic(name=u'Alexander Berkman')
70+
topic_3 = self.create_test_topic(name=u'Ben Reitman')
71+
72+
url = reverse('admin:main_topic_change',
73+
kwargs={'project_slug': 'emma', 'topic_node_id': topic.topic_node_id})
74+
75+
# Add one topic
76+
form = self.app.get(url, user='barry').forms[1]
77+
form['topicassignment-0-topic_id'] = topic_2.topic_node_id
78+
resp = form.submit().follow()
79+
self.assertEqual(topic.related_topics.count(), 1)
80+
self.assertEqual(topic.related_topics.get().topic_id, topic_2.id)
81+
82+
# Add another topic
83+
form = self.app.get(url, user='barry').forms[1]
84+
form['topicassignment-1-topic_id'] = topic_3.topic_node_id
85+
resp = form.submit().follow()
86+
self.assertEqual(topic.related_topics.count(), 2)
87+
self.assertEqual(sorted([topic_2.id, topic_3.id]),
88+
sorted(topic.related_topics.values_list('topic_id', flat=True)))
89+
90+
# Delete both topics
91+
form = self.app.get(url, user='barry').forms[1]
92+
form['topicassignment-0-DELETE'] = 'true'
93+
form['topicassignment-1-DELETE'] = 'true'
94+
resp = form.submit().follow()
95+
self.assertEqual(topic.related_topics.count(), 0)
96+
97+
6198
def test_create_empty_topic_error(self):
6299
"A user should not be able to create a topic with an empty name."
63100
add_url = reverse('admin:main_topic_add', kwargs={'project_slug': 'emma'})

editorsnotes/admin_custom/views/common.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.views.generic.edit import View, ModelFormMixin, TemplateResponseMixin
77
import reversion
88

9-
from editorsnotes.main.models import Project
9+
from editorsnotes.main.models import Project, Topic
1010
from editorsnotes.main.models.auth import RevisionProject
1111

1212
VIEW_ERROR_MSG = 'You do not have permission to view {}.'
@@ -159,15 +159,15 @@ def form_invalid(self, form, formsets):
159159
self.get_context_data(form=form, formsets=formsets))
160160

161161
def save_topicassignment_formset_form(self, form):
162-
if not form.cleaned_data['topic']:
162+
if not form.cleaned_data['topic_qs']:
163163
return
164164
if form.instance and form.instance.id:
165165
return
166-
if form.cleaned_data['topic'] in self.object.related_topics.all():
167-
return
168166
ta = form.save(commit=False)
167+
ta.topic = form.cleaned_data['topic_qs'].get(project__slug=self.project.slug)
168+
if ta.topic in self.object.related_topics.all():
169+
return
169170
ta.creator = self.request.user
170-
ta.topic = form.cleaned_data['topic']
171171
ta.content_object = self.object
172172
ta.save()
173173
return ta

editorsnotes/admin_custom/views/topics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class TopicAdminView(BaseAdminView):
1313
form_class = forms.TopicForm
1414
formset_classes = (
1515
forms.topics.AlternateNameFormset,
16-
# forms.TopicAssignmentFormset,
16+
forms.common.TopicAssignmentFormset,
1717
forms.topics.CitationFormset,
1818
)
1919
template_name = 'topic_admin.html'

editorsnotes/main/templates/topic.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
<header>
2020
<h2 id="topic-name">{{ topic.preferred_name }}</h2>
2121
<div class="related-topics">
22-
{% if related_topics %}
22+
{% if topic.related_topics.all %}
2323
<span class="quiet">Related topics:</span>
2424
<ul class="topic-list">
25-
{% for related_topic in related_topics %}
26-
<li>{{ related_topic|as_link }}</a>{% if not forloop.last %} | {% endif %}</li>
25+
{% for related_topic in topic.related_topics.all %}
26+
<li>{{ related_topic.topic|as_link }}</a>{% if not forloop.last %} | {% endif %}</li>
2727
{% endfor %}
2828
</ul>
2929
{% endif %}

editorsnotes/main/views/topics.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ def topic_node(request, topic_node_id):
3737
def topic(request, project_slug, topic_node_id):
3838
o = {}
3939
topic_qs = Topic.objects.select_related('topic_node', 'creator',
40-
'last_updater', 'project')
40+
'last_updater', 'project')\
41+
.prefetch_related('related_topics__topic')
4142
o['topic'] = topic = get_object_or_404(topic_qs,
4243
topic_node_id=topic_node_id,
4344
project__slug=project_slug)

0 commit comments

Comments
 (0)