Commit ff4f6d502b6b2f8e79a88535f3205bce11f3ba35
1 parent
a82b248a
Add changing document type
Showing
7 changed files
with
76 additions
and
4 deletions
collector/storage/admin.py
... | ... | @@ -2,7 +2,7 @@ from django.contrib import admin |
2 | 2 | |
3 | 3 | from admin_numeric_filter.admin import RangeNumericFilter |
4 | 4 | |
5 | -from storage.models import Chunk, Document, Keyword, Metadata, Participant, Annotation | |
5 | +from storage.models import Chunk, Document, Keyword, Metadata, Participant, Annotation, DocumentType | |
6 | 6 | |
7 | 7 | |
8 | 8 | class ChunkInline(admin.StackedInline): |
... | ... | @@ -52,3 +52,4 @@ admin.site.register(Document, DocumentAdmin) |
52 | 52 | admin.site.register(Keyword) |
53 | 53 | admin.site.register(Participant) |
54 | 54 | admin.site.register(Annotation, AnnotationAdmin) |
55 | +admin.site.register(DocumentType) | |
... | ... |
collector/storage/forms.py
... | ... | @@ -388,3 +388,27 @@ class ChunkSplitForm(Form): |
388 | 388 | self.fields['text'].widget = Textarea(attrs={'class': 'formset-field', |
389 | 389 | 'placeholder': 'Tekst akapitu', |
390 | 390 | 'rows': 5}) |
391 | + | |
392 | + | |
393 | +class DocTypeForm(ModelForm): | |
394 | + | |
395 | + def __init__(self, *args, **kwargs): | |
396 | + super(DocTypeForm, self).__init__(*args, **kwargs) | |
397 | + self.fields['doc_type'].label_from_instance = self.label_from_instance | |
398 | + | |
399 | + def save(self, commit=True): | |
400 | + document = super(DocTypeForm, self).save(commit) | |
401 | + document.changed = True | |
402 | + document.save() | |
403 | + return document | |
404 | + | |
405 | + @staticmethod | |
406 | + def label_from_instance(obj): | |
407 | + return obj.name | |
408 | + | |
409 | + class Meta: | |
410 | + model = Document | |
411 | + fields = ['doc_type'] | |
412 | + labels = { | |
413 | + 'doc_type': 'Typ dokumentu' | |
414 | + } | |
... | ... |
collector/storage/models.py
... | ... | @@ -12,6 +12,14 @@ from pipeline.models import Pipeline, ProcessingStatus |
12 | 12 | User = get_user_model() |
13 | 13 | |
14 | 14 | |
15 | +class DocumentType(models.Model): | |
16 | + key = models.CharField(max_length=32, unique=True) | |
17 | + name = models.CharField(max_length=32, unique=True) | |
18 | + | |
19 | + def __str__(self): | |
20 | + return self.key | |
21 | + | |
22 | + | |
15 | 23 | class Document(models.Model): |
16 | 24 | name = models.TextField() |
17 | 25 | source_id = models.CharField(max_length=32) |
... | ... | @@ -43,6 +51,8 @@ class Document(models.Model): |
43 | 51 | unk_coverage = models.FloatField(default=0.0) |
44 | 52 | parent = models.ForeignKey("self", null=True, default=None, on_delete=models.CASCADE) |
45 | 53 | sequence = models.PositiveIntegerField(default=0) |
54 | + doc_type = models.ForeignKey(DocumentType, null=True, blank=True, on_delete=models.CASCADE) | |
55 | + | |
46 | 56 | |
47 | 57 | def delete(self, *args, **kwargs): |
48 | 58 | super().delete(*args, **kwargs) |
... | ... |
collector/storage/static/storage/js/document.js
... | ... | @@ -72,6 +72,10 @@ $(function () { |
72 | 72 | $(this).modalForm({formURL: $(this).data("id")}); |
73 | 73 | }); |
74 | 74 | |
75 | + $(".change-doc-type").each(function () { | |
76 | + $(this).modalForm({formURL: $(this).data("id")}); | |
77 | + }); | |
78 | + | |
75 | 79 | $(".add-keyword").each(function () { |
76 | 80 | $(this).modalForm({formURL: $(this).data("id")}); |
77 | 81 | }); |
... | ... |
collector/storage/templates/storage/annotation.html
... | ... | @@ -110,10 +110,19 @@ |
110 | 110 | <div class="modal-content"></div> |
111 | 111 | </div> |
112 | 112 | </div> |
113 | + | |
114 | + <div class="text-align-center"> | |
115 | + <p> | |
116 | + Typ dokumentu: <strong>{{ document.doc_type.name|default_if_none:'nieokreślony' }}</strong> | |
117 | + <button class="change-doc-type btn btn-success" type="button" style="margin-left: 10px" | |
118 | + data-id="{% url 'change_doc_type' document.pk %}">Zmień | |
119 | + </button> | |
120 | + </p> | |
121 | + </div> | |
113 | 122 | |
114 | 123 | {% if subdocuments %} |
115 | 124 | <div class="info"> |
116 | - <p>Poddokumenty:</p> | |
125 | + <p>Poddokumenty:</p> | |
117 | 126 | </div> |
118 | 127 | |
119 | 128 | <table class="data-table doc-table" id="subdoc-list-table"> |
... | ... |
collector/storage/urls.py
... | ... | @@ -12,6 +12,7 @@ urlpatterns = [ |
12 | 12 | path('document/edit-details/<int:pk>', login_required(views.DocDetailsEditView.as_view()), name='edit_doc_details'), |
13 | 13 | path('document/edit-subdoc-details/<int:pk>', login_required(views.SubDocDetailsEditView.as_view()), |
14 | 14 | name='edit_subdoc_details'), |
15 | + path('document/change-doc-type/<int:pk>', login_required(views.ChangeDocTypeView.as_view()), name='change_doc_type'), | |
15 | 16 | path('chunk/add/<str:doc_id>', login_required(views.ChunkAddBetweenView.as_view()), name='add_chunk_between'), |
16 | 17 | path('chunk/add/<str:doc_id>/<int:pk>', login_required(views.ChunkAddBetweenView.as_view()), |
17 | 18 | name='add_chunk_between'), |
... | ... |
collector/storage/views.py
... | ... | @@ -22,7 +22,7 @@ from sys import maxsize |
22 | 22 | from functools import partial, wraps |
23 | 23 | |
24 | 24 | from .forms import ChunkForm, ParticipantForm, SubchunkForm, MetadataForm, DocDetailsForm, KeywordForm, DocSplitForm, \ |
25 | - ChunkMoveForm, SubDocDetailsForm, AuthorForm, ChunkMergeForm, ChunkSplitForm | |
25 | + ChunkMoveForm, SubDocDetailsForm, AuthorForm, ChunkMergeForm, ChunkSplitForm, DocTypeForm | |
26 | 26 | from .models import Chunk, Document, Participant, Metadata, Keyword, Annotation |
27 | 27 | from projects.ppc.models import Utterance |
28 | 28 | from pipeline.models import ProcessingStatus |
... | ... | @@ -638,12 +638,14 @@ class AnnotationView(View): |
638 | 638 | chunks = doc.chunks.order_by('sequence') |
639 | 639 | keywords = doc.keywords.all() |
640 | 640 | authors = doc.participants.all() |
641 | + doc_type_form = DocTypeForm() | |
641 | 642 | context = {'document': doc, |
642 | 643 | 'subdocuments': subdocuments, |
643 | 644 | 'metadata': metadata, |
644 | 645 | 'chunks': chunks, |
645 | 646 | 'keywords': keywords, |
646 | - 'authors': authors} | |
647 | + 'authors': authors, | |
648 | + 'doc_type_form': doc_type_form} | |
647 | 649 | except Document.DoesNotExist: |
648 | 650 | pass |
649 | 651 | |
... | ... | @@ -1117,6 +1119,27 @@ class DraftListView(ListView): |
1117 | 1119 | return context |
1118 | 1120 | |
1119 | 1121 | |
1122 | +class ChangeDocTypeView(UpdateView): | |
1123 | + model = Document | |
1124 | + template_name = 'storage/edit.html' | |
1125 | + form_class = DocTypeForm | |
1126 | + | |
1127 | + def form_valid(self, form): | |
1128 | + if not self.request.is_ajax(): | |
1129 | + form.save(commit=True) | |
1130 | + return HttpResponseRedirect(self.get_success_url()) | |
1131 | + return render(self.request, self.template_name, {'form': form}) | |
1132 | + | |
1133 | + def get_context_data(self, **kwargs): | |
1134 | + context = super().get_context_data(**kwargs) | |
1135 | + context['title'] = 'Edycja typu dokumentu' | |
1136 | + context['submit_btn_text'] = 'Zmień' | |
1137 | + return context | |
1138 | + | |
1139 | + def get_success_url(self): | |
1140 | + return reverse_lazy('annotation', kwargs={'doc_id': self.object.id}) | |
1141 | + | |
1142 | + | |
1120 | 1143 | # ****************************** autocomplete ****************************** |
1121 | 1144 | |
1122 | 1145 | |
... | ... |