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

Commit 24b59dc

Browse files
committed
Merge pull request #205 from editorsnotes/fix-editing-bugs
Fix editing bugs
2 parents 5b290bc + 4acf95e commit 24b59dc

26 files changed

+879
-265
lines changed

editorsnotes/admin_custom/forms/topics.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Media:
1616
)
1717
class Meta:
1818
model = Topic
19-
fields = ('preferred_name', 'topic_type', 'topic_node',)
19+
fields = ('preferred_name', 'topic_type',)
2020
widgets = {
2121
'topic': forms.HiddenInput()
2222
}
@@ -25,19 +25,6 @@ def __init__(self, *args, **kwargs):
2525
instance = kwargs.get('instance', None)
2626
if instance is not None:
2727
self.fields['topic_type'].initial = instance.topic.type
28-
self.fields['topic'] = instance.topic_node_id
29-
def clean_topic_node(self):
30-
data = self.cleaned_data['topic_node']
31-
if getattr(self, 'instance', None):
32-
if self.instance.topic_node_id != int(data):
33-
raise ValidationError(
34-
'Topic node input can not be changed from this form. '
35-
'To change the topic node, use the merge function.')
36-
elif data:
37-
if not TopicNode.objects.filter(id=data).exists():
38-
msg = 'TopicNode with id {} does not exist.'.format(data)
39-
raise ValidationError(msg)
40-
return data
4128

4229
AlternateNameFormset = models.inlineformset_factory(
4330
Topic, AlternateName, fields=('name',), extra=1)

editorsnotes/admin_custom/templates/project_roles.html

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,6 @@
114114

115115
{% block content %}
116116

117-
<ul class="breadcrumb-top">
118-
<li>
119-
<a href="{% url "project_view" project_slug=project.slug %}">{{ project }}</a>
120-
<span class="divider">&gt;</span>
121-
</li>
122-
<li>
123-
<a href="{% url "admin:main_project_roster_change" project_slug=project.slug %}">Roster</a>
124-
<span class="divider">&gt;</span>
125-
</li>
126-
<li class="active">Roles</li>
127-
</ul>
128-
129117
<h1>Change project roles</h1>
130118
{% include "includes/bootstrap_errors.html" with errors=formset.errors %}
131119
<form method="post">

editorsnotes/admin_custom/templates/project_roster.html

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,6 @@
4646

4747
{% block content %}
4848

49-
<ul class="breadcrumb-top">
50-
<li>
51-
<a href="{% url "project_view" project_slug=project.slug %}">{{ project }}</a>
52-
<span class="divider">&gt;</span>
53-
</li>
54-
<li class="active">Roster</li>
55-
</ul>
56-
5749
{% if roster_formset %}
5850
<form method="post">
5951
<div style="display: none;">

editorsnotes/admin_custom/views/common.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ def dispatch(self, *args, **kwargs):
7979
def get_context_data(self, **kwargs):
8080
context = super(BaseAdminView, self).get_context_data(**kwargs)
8181
context['project'] = self.project
82+
context['breadcrumb'] = self.get_breadcrumb()
8283
return context
84+
def get_breadcrumb(self):
85+
"Override this method with (label, url) pairs to generate page breadcrumb."
86+
return ()
8387
def get(self, request, *args, **kwargs):
8488
self.object = self.get_object(**kwargs)
8589
self.check_perms()

editorsnotes/admin_custom/views/documents.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22

3+
from django.core.urlresolvers import reverse
34
from django.http import HttpResponse, HttpResponseForbidden
45
from django.shortcuts import get_object_or_404
56
import reversion
@@ -27,6 +28,23 @@ def get_object(self, document_id=None):
2728
return document_id and get_object_or_404(
2829
Document, id=document_id, project_id=self.project.id)
2930

31+
def get_breadcrumb(self):
32+
breadcrumbs = (
33+
(self.project.name, self.project.get_absolute_url()),
34+
('Documents', reverse('all_documents_view',
35+
kwargs={'project_slug': self.project.slug})),
36+
)
37+
if self.object is None:
38+
breadcrumbs += (
39+
('Add', None),
40+
)
41+
else:
42+
breadcrumbs += (
43+
(self.object.as_text(), self.object.get_absolute_url()),
44+
('Edit', None)
45+
)
46+
return breadcrumbs
47+
3048
def save_object(self, form, formsets):
3149
obj, action = super(DocumentAdminView, self).save_object(form, formsets)
3250
form.save_zotero_data()

editorsnotes/admin_custom/views/notes.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from django.contrib import messages
44
from django.core.exceptions import PermissionDenied
5+
from django.core.urlresolvers import reverse
56
from django.http import HttpResponseRedirect
67
from django.shortcuts import get_object_or_404, render_to_response
78
from django.template import RequestContext
@@ -20,16 +21,32 @@ class NoteAdminView(BaseAdminView):
2021
# forms.TopicAssignmentFormset,
2122
)
2223
template_name = 'note_admin.html'
24+
def get_object(self, note_id=None):
25+
return note_id and get_object_or_404(
26+
Note, id=note_id, project_id=self.project.id)
27+
def get_breadcrumb(self):
28+
breadcrumbs = (
29+
(self.project.name, self.project.get_absolute_url()),
30+
('Notes', reverse('all_notes_view',
31+
kwargs={'project_slug': self.project.slug})),
32+
)
33+
if self.object is None:
34+
breadcrumbs += (
35+
('Add', None),
36+
)
37+
else:
38+
breadcrumbs += (
39+
(self.object.as_text(), self.object.get_absolute_url()),
40+
('Edit', None)
41+
)
42+
return breadcrumbs
2343
def set_additional_object_properties(self, obj, form):
2444
obj.project = self.project
2545
return obj
2646
def get_form(self, form_class):
2747
form = form_class(**self.get_form_kwargs())
2848
form.fields['assigned_users'].queryset = self.project.members.all()
2949
return form
30-
def get_object(self, note_id=None):
31-
return note_id and get_object_or_404(
32-
Note, id=note_id, project_id=self.project.id)
3350
def save_formset_form(self, form):
3451
obj = form.save(commit=False)
3552
obj.note = self.object

editorsnotes/admin_custom/views/projects.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.contrib import messages
44
from django.contrib.auth.decorators import login_required
55
from django.contrib.contenttypes.models import ContentType
6+
from django.core.urlresolvers import reverse
67
from django.http import (
78
HttpResponseForbidden, HttpResponseRedirect, HttpResponseBadRequest)
89
from django.shortcuts import get_object_or_404, render_to_response
@@ -27,6 +28,11 @@ def project_roster(request, project_slug):
2728
'roles__group__users')
2829
project = get_object_or_404(project_qs, slug=project_slug)
2930

31+
o['breadcrumb'] = (
32+
(project.name, project.get_absolute_url()),
33+
('Roster', None)
34+
)
35+
3036
can_view = user.has_project_perm(project, 'main.view_project_roster')
3137
if not can_view:
3238
return HttpResponseForbidden(VIEW_ERROR_MSG.format(project))
@@ -148,6 +154,13 @@ def change_project_roles(request, project_slug):
148154

149155
o['project'] = project = get_object_or_404(Project, slug=project_slug)
150156

157+
o['breadcrumb'] = (
158+
(project.name, project.get_absolute_url()),
159+
('Roster', reverse('admin:main_project_roster_change',
160+
kwargs={'project_slug': project.slug})),
161+
('Roles', None),
162+
)
163+
151164
can_view = request.user.has_project_perm(project, 'main.change_project_roster')
152165
if not can_view:
153166
return HttpResponseForbidden(VIEW_ERROR_MSG.format(project))

editorsnotes/admin_custom/views/topics.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
from django.core.urlresolvers import reverse
34
from django.shortcuts import get_object_or_404
45

56
from editorsnotes.main.models import Topic, TopicNode
@@ -20,17 +21,35 @@ class TopicAdminView(BaseAdminView):
2021
def get_object(self, topic_node_id=None):
2122
return topic_node_id and get_object_or_404(
2223
Topic, topic_node_id=topic_node_id, project__slug=self.project.slug)
24+
def get_breadcrumb(self):
25+
breadcrumbs = (
26+
(self.project.name, self.project.get_absolute_url()),
27+
('Topics', reverse('all_topics_view',
28+
kwargs={'project_slug': self.project.slug})),
29+
)
30+
if self.object is None:
31+
breadcrumbs += (
32+
('Add', None),
33+
)
34+
else:
35+
breadcrumbs += (
36+
(self.object.as_text(), self.object.get_absolute_url()),
37+
('Edit', None)
38+
)
39+
return breadcrumbs
2340
def set_additional_object_properties(self, obj, form):
2441
if not obj.id:
25-
if form.cleaned_data['topic_node']:
26-
topic_node = TopicNode.objects.get(
27-
id=form.cleaned_data['topic_node'])
42+
existing_node_id = self.request.GET.get('topic_node')
43+
if existing_node_id:
44+
topic_node = get_object_or_404(TopicNode, id=existing_node_id)
2845
else:
2946
topic_node = TopicNode.objects.create(
3047
_preferred_name=obj.preferred_name,
31-
type=form.cleaned_data['topic_type'])
48+
type=form.cleaned_data['topic_type'],
49+
creator=self.request.user,
50+
last_updater=self.request.user)
3251
obj.topic_node_id = topic_node.id
33-
obj.project = self.project
52+
obj.project_id = self.project.id
3453
return obj
3554
def save_citation_formset_form(self, form):
3655
obj = form.save(commit=False)

0 commit comments

Comments
 (0)