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

Commit 0c4751b

Browse files
committed
Merge pull request #247 from editorsnotes/restore-transcripts
Restore transcript editing, fix zotero editing bug
2 parents 0d352e2 + db2e216 commit 0c4751b

File tree

10 files changed

+70
-17
lines changed

10 files changed

+70
-17
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
v0.8.5
2+
=======
3+
* Add transcript link to Document API serializer
4+
* Add 'Add/Edit Transcript' button to Document editing view
5+
* Hide Note and Attachment fields from Zotero editing form
6+
17
v0.8.4
28
=======
39
* Allow draggable widgets to work on tablets

editorsnotes/admin/templates/admin_base.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
{% load display staticfiles %}
44

55
{% block js %}
6-
<script src="{% static "function/zotero.jquery.js" %}"></script>
76
<script src="{% static "function/admin-bootstrap-base.js" %}"></script>
87
{% if form.media %}{{ form.media.js }}{% endif %}
98
{% endblock %}

editorsnotes/admin/views/common.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,19 @@ def get_context_data(self, **kwargs):
126126
context['bootstrap'] = 'null';
127127
return context
128128

129-
class BaseAdminView(ProcessInlineFormsetsView, ProjectSpecificMixin,
130-
ModelFormMixin, BreadcrumbMixin, TemplateResponseMixin):
129+
class BaseAdminView(ProjectSpecificMixin, BreadcrumbMixin, ModelFormMixin,
130+
TemplateResponseMixin, ProcessInlineFormsetsView):
131131
def get_form_kwargs(self):
132132
kwargs = super(ModelFormMixin, self).get_form_kwargs()
133133
if hasattr(self, 'object') and self.object:
134134
kwargs.update({'instance': self.object})
135135
else:
136-
has_project_field = all([
137-
hasattr(self.model, 'project'),
138-
hasattr(self.model.project, 'field'),
139-
hasattr(self.model.project.field, 'related'),
140-
self.model.project.field.related.parent_model == Project
141-
])
136+
has_project_field = (
137+
hasattr(self.model, 'project')
138+
and hasattr(self.model.project, 'field')
139+
and hasattr(self.model.project.field, 'related')
140+
and self.model.project.field.related.parent_model == Project
141+
)
142142
if has_project_field:
143143
# Then create an instance with the project already set
144144
instance = self.model(project=self.project)

editorsnotes/admin/views/documents.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,12 @@ def save_footnote_formset_form(self, form):
8585
a = transcript.content.cssselect('a.footnote[href$="%s"]' % stamp)[0]
8686
a.attrib['href'] = footnote.get_absolute_url()
8787
transcript.save()
88+
def get_breadcrumb(self):
89+
breadcrumbs = (
90+
(self.document.project.name, self.document.project.get_absolute_url()),
91+
('Documents', reverse('all_documents_view',
92+
kwargs={'project_slug': self.project.slug})),
93+
(self.document.as_text(), self.document.get_absolute_url()),
94+
('Edit transcript', None)
95+
)
96+
return breadcrumbs
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from documents import DocumentSerializer, ScanSerializer
1+
from documents import DocumentSerializer, ScanSerializer, TranscriptSerializer
22
from topics import TopicSerializer
33
from notes import NoteSerializer

editorsnotes/api/serializers/documents.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
from lxml import etree
55
from rest_framework import serializers
6+
from rest_framework.reverse import reverse
67

7-
from editorsnotes.main.models import Document, Citation, Scan
8+
from editorsnotes.main.models import Document, Citation, Scan, Transcript
89

910
from .base import (RelatedTopicSerializerMixin, ProjectSpecificItemMixin,
1011
URLField, ProjectSlugField, HyperlinkedProjectItemField)
@@ -37,9 +38,10 @@ class Meta:
3738

3839
class DocumentSerializer(RelatedTopicSerializerMixin, ProjectSpecificItemMixin,
3940
serializers.ModelSerializer):
41+
url = URLField()
4042
project = ProjectSlugField()
43+
transcript = serializers.SerializerMethodField('get_transcript_url')
4144
zotero_data = ZoteroField(required=False)
42-
url = URLField()
4345
scans = ScanSerializer(many=True, required=False, read_only=True)
4446
def get_validation_exclusions(self):
4547
# TODO: This can be removed in future versions of django rest framework.
@@ -49,10 +51,23 @@ def get_validation_exclusions(self):
4951
exclusions = super(DocumentSerializer, self).get_validation_exclusions()
5052
exclusions.remove('zotero_data')
5153
return exclusions
54+
def get_transcript_url(self, obj):
55+
if not obj.has_transcript():
56+
return None
57+
return reverse('api:api-transcripts-detail',
58+
args=(obj.project.slug, obj.id),
59+
request=self.context.get('request', None))
5260
class Meta:
5361
model = Document
5462
fields = ('id', 'description', 'url', 'project', 'last_updated',
55-
'scans', 'related_topics', 'zotero_data',)
63+
'scans', 'transcript', 'related_topics', 'zotero_data',)
64+
65+
class TranscriptSerializer(serializers.ModelSerializer):
66+
url = URLField(lookup_arg_attrs=('document.project.slug', 'document.id'))
67+
document = HyperlinkedProjectItemField(
68+
required=True, view_name='api:api-documents-detail')
69+
class Meta:
70+
model = Transcript
5671

5772
class CitationSerializer(serializers.ModelSerializer):
5873
url = URLField('api:api-topic-citations-detail',

editorsnotes/api/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
url(r'^documents/(?P<document_id>\d+)/scans/$', views.ScanList.as_view(), name='api-scans-list'),
3131
url(r'^documents/(?P<document_id>\d+)/scans/(?P<scan_id>\d+)/$', views.ScanDetail.as_view(), name='api-scans-detail'),
3232
url(r'^documents/(?P<document_id>\d+)/scans/normalize_order/$', views.NormalizeScanOrder.as_view(), name='api-scans-normalize-order'),
33+
34+
url(r'^documents/(?P<document_id>\d+)/transcript/$', views.Transcript.as_view(), name='api-transcripts-detail'),
3335
)
3436

3537
urlpatterns = patterns('',

editorsnotes/api/views/documents.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
from rest_framework.response import Response
44
from rest_framework.views import APIView
55

6-
from editorsnotes.main.models import Document, Scan
6+
from editorsnotes.main.models import Document, Scan, Transcript
77

88
from .base import (BaseListAPIView, BaseDetailView, DeleteConfirmAPIView,
99
ElasticSearchListMixin, ProjectSpecificMixin)
1010
from ..permissions import ProjectSpecificPermissions
11-
from ..serializers import DocumentSerializer, ScanSerializer
11+
from ..serializers import (DocumentSerializer, ScanSerializer,
12+
TranscriptSerializer)
1213

1314
__all__ = ['DocumentList', 'DocumentDetail', 'DocumentConfirmDelete',
14-
'ScanList', 'ScanDetail', 'NormalizeScanOrder']
15+
'ScanList', 'ScanDetail', 'NormalizeScanOrder', 'Transcript']
1516

1617
class DocumentList(ElasticSearchListMixin, BaseListAPIView):
1718
model = Document
@@ -90,3 +91,15 @@ def get_queryset(self):
9091
document_qs = Document.objects.prefetch_related('scans__creator')
9192
document = get_object_or_404(document_qs, id=document_id)
9293
return document.scans.filter(id=scan_id)
94+
95+
class Transcript(BaseDetailView):
96+
model = Transcript
97+
serializer_class = TranscriptSerializer
98+
def get_object(self, queryset=None):
99+
transcript_qs = self.model.objects\
100+
.select_related('document__project')\
101+
.filter(
102+
document__id=self.kwargs.get('document_id'),
103+
document__project__slug=self.kwargs.get('project_slug')
104+
)
105+
return get_object_or_404(transcript_qs)

editorsnotes_app/js/templates/document.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,12 @@ <h3>Related topics</h3>
2727
</div>
2828

2929
<div class="edit-section" id="document-scans"></div>
30+
31+
<% if (!doc.isNew()) { %>
32+
<div class="edit-section">
33+
<h3>Transcript</h3>
34+
<% var transcript_url = doc.get('url').replace('/api/', '/') + 'transcript/edit/'; %>
35+
<% var transcript_action = doc.get('transcript') ? 'Edit' : 'Add'; %>
36+
<a target="_blank" class="btn" href="<%= transcript_url %>"><%= transcript_action %> transcript</a>
37+
</div>
38+
<% } %>

editorsnotes_app/js/templates/zotero_item.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<h5><%= i18n.translate(val).fetch() %></h5>
99
<input type="hidden" value="<%= val %>" />
1010
</div>
11-
<% } else if (key === 'tags') { %>
11+
<% } else if (key === 'tags' || key === 'attachments' || key === 'notes') { %>
1212
<% _(val).forEach(function (tag) { %>
1313
<div class="zotero-entry" data-zotero-key="<%= key %>[]">
1414
<input type="hidden" value="<%= tag.value %>" />

0 commit comments

Comments
 (0)