diff options
| -rw-r--r-- | archaeological_context_records/forms.py | 60 | ||||
| -rw-r--r-- | archaeological_context_records/templates/ishtar/forms/qa_operation_contextrecord.html | 28 | ||||
| -rw-r--r-- | archaeological_context_records/urls.py | 6 | ||||
| -rw-r--r-- | archaeological_context_records/views.py | 25 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 16 | ||||
| -rw-r--r-- | archaeological_operations/templates/ishtar/sheet_operation.html | 8 | 
6 files changed, 130 insertions, 13 deletions
| diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index a4577df40..8bd3db9f5 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -28,7 +28,13 @@ from django.core import validators  from django.forms.formsets import formset_factory  from django.utils.translation import ugettext_lazy as _ -import models +from ishtar_common.models import valid_id, IshtarSiteProfile, Town +from archaeological_context_records import models + +from ishtar_common.forms import FinalForm, FormSet, \ +    reverse_lazy, get_form_selection, TableSelect, ManageOldType, CustomForm, \ +    FieldType, CustomFormSearch, IshtarForm +from ishtar_common.forms_common import get_town_field  from archaeological_operations.forms import OperationSelect, ParcelField, \      RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase  from archaeological_operations.models import Period, Parcel, Operation, \ @@ -36,11 +42,6 @@ from archaeological_operations.models import Period, Parcel, Operation, \  from archaeological_operations.widgets import OAWidget  from bootstrap_datepicker.widgets import DatePicker  from ishtar_common import widgets -from ishtar_common.forms import FinalForm, FormSet, \ -    reverse_lazy, get_form_selection, TableSelect, ManageOldType, CustomForm, \ -    FieldType, CustomFormSearch -from ishtar_common.forms_common import get_town_field -from ishtar_common.models import valid_id, IshtarSiteProfile, Town  class OperationFormSelection(CustomForm, forms.Form): @@ -154,6 +155,8 @@ class RecordFormGeneral(CustomForm, ManageOldType):      )      label = forms.CharField(label=_(u"ID"),                              validators=[validators.MaxLengthValidator(200)]) +    unit = forms.ChoiceField(label=_(u"Context record type"), required=False, +                             choices=[])      description = forms.CharField(label=_(u"Description"),                                    widget=forms.Textarea, required=False)      comment = forms.CharField(label=_(u"General comment"), @@ -167,8 +170,6 @@ class RecordFormGeneral(CustomForm, ManageOldType):      depth = forms.FloatField(label=_(u"Depth (m)"), required=False)      depth_of_appearance = forms.FloatField(          label=_(u"Depth of appearance (m)"), required=False) -    unit = forms.ChoiceField(label=_(u"Context record type"), required=False, -                             choices=[])      opening_date = forms.DateField(label=_(u"Opening date"),                                     widget=DatePicker, required=False)      closing_date = forms.DateField(label=_(u"Closing date"), @@ -374,3 +375,46 @@ class RecordDeletionForm(FinalForm):      confirm_msg = " "      confirm_end_msg = _(u"Would you like to delete this context record?") + +class QAOperationCR(IshtarForm): +    town = forms.ChoiceField(label=_(u"Town"), choices=[]) +    archaeological_site = forms.ChoiceField( +        label=" ", choices=[], required=False, +        help_text=_(u"Only the items associated to the operation can be " +                    u"selected.") +    ) +    label = forms.CharField(label=_(u"ID"), +                            validators=[validators.MaxLengthValidator(200)]) +    unit = forms.ChoiceField(label=_(u"Context record type"), required=False, +                             choices=[]) + +    TYPES = [ +        FieldType('unit', models.Unit), +    ] + +    def __init__(self, *args, **kwargs): +        self.items = kwargs.pop('items') +        super(QAOperationCR, self).__init__(*args, **kwargs) +        site_label = IshtarSiteProfile.get_default_site_label() +        self.fields['archaeological_site'].label = site_label +        self.fields['archaeological_site'].choices = [('', '--')] + +        if not self.items: +            return +        operation = self.items[0] +        self.fields['town'].choices = [(t.pk, unicode(t)) +                                       for t in operation.towns.all()] +        self.fields['archaeological_site'].choices += [ +            (site.pk, unicode(site)) +            for site in operation.archaeological_sites.all() +        ] + +    def save(self, items): +        operation = items[0] +        cr = models.ContextRecord.objects.create( +            town_id=self.cleaned_data['town'], operation=operation, +            archaeological_site_id= +            self.cleaned_data['archaeological_site'] or None, +            label=self.cleaned_data['label'], +            unit_id=self.cleaned_data['unit'] or None +        ) diff --git a/archaeological_context_records/templates/ishtar/forms/qa_operation_contextrecord.html b/archaeological_context_records/templates/ishtar/forms/qa_operation_contextrecord.html new file mode 100644 index 000000000..c782832ff --- /dev/null +++ b/archaeological_context_records/templates/ishtar/forms/qa_operation_contextrecord.html @@ -0,0 +1,28 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> +    {{form.non_field_errors}} +</div> +{% endif %} + +<h4>{% trans "Quick add context record" %}</h4> + +{% for hidden in form.hidden_fields %}{{hidden}} +{% if hidden.errors %}<div class="invalid-feedback"> +    {{ hidden.errors }} +</div>{% endif %} +{% endfor %} +{% with force_large_col=True %}{% for field in form %} +<div class="form-row"> +    {% include "blocks/bs_field_snippet.html" %} +</div> +{% endfor %}{% endwith %} + +<div class="alert alert-info"> +    {% trans "To put more information to the context record use the full form on the top menu: \"Context record > Add\"." %} +</div> +{% endblock %} + diff --git a/archaeological_context_records/urls.py b/archaeological_context_records/urls.py index c05cff87e..175c87482 100644 --- a/archaeological_context_records/urls.py +++ b/archaeological_context_records/urls.py @@ -82,4 +82,10 @@ urlpatterns = [      url(r'get-contextrecordrelationdetail/(?P<type>.+)?$',          views.get_contextrecordrelationdetail,          name='get-contextrecordrelationdetail'), + +    url(r'^operation-qa-contextrecord/(?P<pks>[0-9]+)/$', +        check_rights(['add_contextrecord', 'add_own_contextrecord'])( +            views.QAOperationContextRecordView.as_view()), +        name='operation-qa-contextrecord'), +  ] diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 771a2ed71..6a01a48f0 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -26,11 +26,15 @@ from django.shortcuts import redirect  from django.utils.translation import ugettext_lazy as _  from django.views.generic import RedirectView +from ishtar_common.models import QuickAction +from archaeological_operations.models import Operation  from archaeological_context_records import models +  from archaeological_operations.views import site_extra_context  from archaeological_context_records import forms  from ishtar_common.utils import put_session_message -from ishtar_common.views import IshtarMixin, LoginRequiredMixin + +from ishtar_common.views import IshtarMixin, LoginRequiredMixin, QAItemForm  from ishtar_common.views_item import display_item, get_item, show_item, \      revert_item  from archaeological_context_records import wizards @@ -171,4 +175,21 @@ class GenerateRelationImage(IshtarMixin, LoginRequiredMixin, RedirectView):          except models.ContextRecord.DoesNotExist:              raise Http404()          self.context_record.generate_relation_image() -        return super(GenerateRelationImage, self).get(request, *args, **kwargs)
\ No newline at end of file +        return super(GenerateRelationImage, self).get(request, *args, **kwargs) + + +class QAOperationContextRecordView(QAItemForm): +    template_name = 'ishtar/forms/qa_operation_contextrecord.html' +    model = Operation +    form_class = forms.QAOperationCR +    page_name = _(u"Context record") + +    def get_quick_action(self): +        return QuickAction( +            url="operation-qa-contextrecord", icon_class="fa fa-plus", +            text=_(u"Add context record"), target="one", +            rights=['add_contextrecord', 'add_own_contextrecord']) + +    def form_valid(self, form): +        form.save(self.items) +        return HttpResponseRedirect(reverse("success")) diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index b15dbf580..a0d0ba30b 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -1064,6 +1064,22 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,              finds__base_finds__context_record__operation=self          ) +    def get_extra_actions(self, request): +        """ +        For sheet template +        """ +        # url, base_text, icon, extra_text, extra css class, is a quick action + +        can_add_cr = self.can_do(request, 'add_contextrecord') +        actions = [] +        if can_add_cr: +            actions += [ +                (reverse('operation-qa-contextrecord', args=[self.pk]), +                 _(u"Add context record"), "fa fa-plus", +                 _(u"context record"), "", True), +            ] +        return actions +      associated_file_short_label_lbl = _(u"Archaeological file")      full_code_patriarche_lbl = _(u"Code patriarche") diff --git a/archaeological_operations/templates/ishtar/sheet_operation.html b/archaeological_operations/templates/ishtar/sheet_operation.html index fb938b93f..1d699cbed 100644 --- a/archaeological_operations/templates/ishtar/sheet_operation.html +++ b/archaeological_operations/templates/ishtar/sheet_operation.html @@ -196,10 +196,12 @@  {% dynamic_table_document archaeologicalsites_label 'sites' 'operations' item.pk '' output %}  {% endif %} +{% if item.grouped_parcels %}  {% trans "Associated parcels" as parcels_label %}  {% include "ishtar/blocks/window_tables/parcels.html" %} +{% endif %} -{% if item.administrative_act %} +{% if item.administrative_act.count %}  <h3>{% trans "Administrative acts" %}</h3>  {% table_administrativact "" item.administrative_act.all %}  {% endif %} @@ -209,7 +211,7 @@  {% dynamic_table_document operation_docs 'documents' 'operations' item.pk '' output %}  {% endif %} -{% if view_own_contextrecord or view_contextrecord %} +{% if permission_view_own_contextrecord or permission_view_contextrecord %}  {% if item.context_record.count %}  {% trans "Context records" as cr_lab %}  {% dynamic_table_document cr_lab 'context_records_for_ope' 'operation_id' item.pk 'TABLE_COLS_FOR_OPE' output %} @@ -236,7 +238,7 @@  {% dynamic_table_document finds_docs 'documents' 'finds__base_finds__context_record__operation' item.pk '' output %}  {% endif %} -{% if view_own_container or view_container %} +{% if permission_view_own_container or permission_view_container %}  {% if item.containers_q.count %}  {% trans "Associated containers" as containers_lbl %}  {% dynamic_table_document containers_lbl 'containers' 'finds__base_finds__context_record__operation' item.pk '' output %} | 
