diff options
| -rw-r--r-- | archaeological_finds/forms.py | 26 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 8 | ||||
| -rw-r--r-- | archaeological_finds/templates/ishtar/forms/qa_find_basket.html | 69 | ||||
| -rw-r--r-- | archaeological_finds/urls.py | 8 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 18 | ||||
| -rw-r--r-- | ishtar_common/static/js/ishtar.js | 14 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/forms/qa_base.html (renamed from ishtar_common/templates/ishtar/qa_form.html) | 23 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/forms/qa_form.html | 33 | ||||
| -rw-r--r-- | ishtar_common/views.py | 50 | 
9 files changed, 218 insertions, 31 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index e50172f1c..eb27c22cc 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -79,7 +79,7 @@ __all__ = [      'check_treatment', 'ResultFindForm', 'ResultFindFormSet',      'FindDeletionForm', 'UpstreamFindFormSelection', 'NewFindBasketForm',      'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm', -    'QAFindFormSingle', 'QAFindFormMulti' +    'QAFindFormSingle', 'QAFindFormMulti', 'QAFindBasketForm'  ]  logger = logging.getLogger(__name__) @@ -442,6 +442,30 @@ class QAFindFormSingle(QAFindFormMulti):              self.fields.pop('qa_seal_number') +class QAFindBasketForm(IshtarForm): +    create_or_update = forms.ChoiceField( +        choices=(('create', _(u"Create")), +                 ('update', _(u"Update"))), initial='create') +    label = forms.CharField(label="", max_length=None, required=False) +    basket = forms.ChoiceField(label=_(u"Basket"), required=True, choices=[]) + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.items = kwargs.pop('items') + +        super(QAFindBasketForm, self).__init__(*args, **kwargs) +        if not self.user: +            return +        self.fields['basket'].choices = [('', '--')] + [ +            (b.pk, unicode(b)) +            for b in models.FindBasket.objects.filter(user=self.user) +        ] + +  class PreservationForm(CustomForm, ManageOldType):      form_label = _("Preservation")      form_admin_name = _(u"Find - 030 - Preservation") diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 0911317f2..3c44e0be4 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -886,14 +886,14 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,      QUICK_ACTIONS = [          QA_EDIT,          QuickAction( +            url="find-qa-basket", icon_class="fa fa-shopping-basket", +            text=_(u"Basket"), target="many", +            rights=['change_find', 'change_own_find']), +        QuickAction(              url="find-qa-packaging", icon_class="fa fa-gift",              text=_(u"Packaging"), target="many", rights=['change_warehouse'],              module='warehouse'          ), -        QuickAction( -            url="find-qa-basket", icon_class="fa fa-shopping-basket", -            text=_(u"Basket"), target="many", -            rights=['change_find', 'change_own_find']),      ]      # fields diff --git a/archaeological_finds/templates/ishtar/forms/qa_find_basket.html b/archaeological_finds/templates/ishtar/forms/qa_find_basket.html new file mode 100644 index 000000000..77fc2abcd --- /dev/null +++ b/archaeological_finds/templates/ishtar/forms/qa_find_basket.html @@ -0,0 +1,69 @@ +{% 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 %} + +    {% for hidden in form.hidden_fields %} +    {{hidden}} +    {% if hidden.errors %}<div class="invalid-feedback"> +        {{ hidden.errors }} +    </div>{% endif %} +    {% endfor %} + +    {% if form.basket %} +    <div class="form-row"> +        <input type="radio" name="create_or_update" value="create" +               id="create-choice" checked > +         <label for="create-choice">{% trans "New" %}</label> +    </div> +    {% else %} +    <input type="hidden" name="create_or_update" value="create"> +    {% endif %} +    <div id="new-basket"> +        <div class="form-row"> +            {% with form.label as field %} +            {% include "blocks/bs_field_snippet.html" %} +            {% endwith %} +        </div> +    </div> +    {% if form.basket %} +    <div class="form-row"> +        <input type="radio" name="create_or_update" value="update" +               id="update-choice"> +         <label for="update-choice">{% trans "Add" %}</label> +    </div> +    <div id="update-basket"> +        <div class="form-row"> +            {% with form.basket as field %} +            {% include "blocks/bs_field_snippet.html" %} +            {% endwith %} +        </div> +    </div> +    {% endif %} +{% endblock %} + +{% block js %} +var update_form_display = function(){ +    if ($("#update-choice:checked").length){ +        $("#new-basket").hide(); +        $("#update-basket").show(); +    } else { +        $("#update-basket").hide(); +        $("#new-basket").show(); +    } +} + +$(document).ready(function(){ +    $("#create-choice").click(update_form_display); +    $("#update-choice").click(update_form_display); +    update_form_display(); +}); + +{% endblock %} + + diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index 3cbc99f17..85a395db2 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -79,15 +79,15 @@ urlpatterns = [          check_rights(['change_find', 'change_own_find'])(              views.QAFindForm.as_view()),          name='find-qa-bulk-update-confirm', kwargs={"confirm": True}), +    url(r'^find-qa-basket/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_find', 'change_own_find'])( +            views.QAFindBasketForm.as_view()), +        name='find-qa-basket'),      url(r'^find-qa-packaging/(?P<pks>[0-9-]+)?/$',          check_rights(['change_warehouse'])(              views.FindBasketAddItemView.as_view()),          name='find-qa-packaging'), -    url(r'^find-qa-basket/(?P<pks>[0-9-]+)?/$', -        check_rights(['change_find', 'change_own_find'])( -            views.FindBasketAddItemView.as_view()), -        name='find-qa-basket'),      url(r'^treatment_creation/(?P<step>.+)?$', diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 850890894..94439fa82 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -35,7 +35,7 @@ from forms import *  from ishtar_common.forms import FinalForm  from ishtar_common.models import IshtarUser, get_current_profile  from ishtar_common.views import get_autocomplete_generic, IshtarMixin, \ -    LoginRequiredMixin, QAItemEditForm +    LoginRequiredMixin, QAItemEditForm, QAItemForm  from ishtar_common.views_item import display_item, get_item, show_item, \      revert_item, get_autocomplete_item  from wizards import * @@ -599,3 +599,19 @@ def reset_wizards(request):  class QAFindForm(QAItemEditForm):      model = models.Find      form_class = QAFindFormMulti + + +class QAFindBasketForm(QAItemForm): +    template_name = 'ishtar/forms/qa_find_basket.html' +    model = models.Find +    form_class = QAFindBasketForm +    page_name = _(u"Basket") +    modal_size = "small" + +    def get_quick_action(self): +        return models.Find.QUICK_ACTIONS[1] + +    def get_form_kwargs(self): +        kwargs = super(QAFindBasketForm, self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 2750efcc2..9eae1b04d 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -833,3 +833,17 @@ var ajax_post = function(url, data, target, callback){      });  }; + +var qa_action_register = function(url) { +    $('#qa-action').on('submit', function(event){ +        event.preventDefault(); +        $('#modal-dynamic-form').modal("hide"); +        short_wait(); +        ajax_post( +            url, $(this).serialize(), "#modal-dynamic-form", +            function(){ +                $('#modal-dynamic-form').modal("show"); +            } +        ); +    }); +}; diff --git a/ishtar_common/templates/ishtar/qa_form.html b/ishtar_common/templates/ishtar/forms/qa_base.html index fe373ed57..ee4c242b7 100644 --- a/ishtar_common/templates/ishtar/qa_form.html +++ b/ishtar_common/templates/ishtar/forms/qa_base.html @@ -1,6 +1,7 @@  {% load i18n inline_formset table_form %} -<div class="modal-dialog modal-lg modal-dialog-centered"> +<div +        class="modal-dialog {% if modal_size == 'large' %}modal-lg {% elif modal_size == 'small'%}modal-sm {% endif%}modal-dialog-centered">      <div class="modal-content">          <div class="modal-header">              <h2>{{page_name|safe}}</h2> @@ -12,6 +13,8 @@              id="qa-action">{% csrf_token %}              <div class="modal-body body-scroll">                  <div class='form'> +                    {% block main_form %} +                      {% for error in form.non_field_errors %}                      <p>{{ error }}</p>                      {% endfor %} @@ -40,9 +43,12 @@                          {% endfor %}                      </table>                      {% endif %} + +                    {% endblock %}                  </div>              </div>              <div class="modal-footer"> +                {% block footer %}                  <button type="submit" id="submit_form" name='validate'                          value="validate" class="btn btn-success">                      {% if confirm %} @@ -55,21 +61,16 @@                          aria-label="Close" class="btn btn-secondary">                      {% trans "Cancel" %}                  </button> +                {% endblock %}              </div>          </form>      </div>  </div>  <script type="text/javascript"> -    $('#qa-action').on('submit', function(event){ -        event.preventDefault(); -        $('#modal-dynamic-form').modal("hide"); -        short_wait(); -        ajax_post( -            "{{url}}", $(this).serialize(), "#modal-dynamic-form", -            function(){ -                $('#modal-dynamic-form').modal("show"); -            } -        ); +    {% block js %} +    {% endblock %} +    $(document).ready(function(){ +        qa_action_register("{{url}}");      });  </script> diff --git a/ishtar_common/templates/ishtar/forms/qa_form.html b/ishtar_common/templates/ishtar/forms/qa_form.html new file mode 100644 index 000000000..c843dbd2d --- /dev/null +++ b/ishtar_common/templates/ishtar/forms/qa_form.html @@ -0,0 +1,33 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +    {% for error in form.non_field_errors %} +    <p>{{ error }}</p> +    {% endfor %} +    {% bs_form form %} + +    {% if confirm %} +    <input type="hidden" name="confirm" value="1"/> +    <h4>{% trans "Modified items" %}</h4> +    <ul>{% for item in items %} +        <li>{{item}}</li>{% endfor %} +    </ul> +    <h4>{% trans "Modification" %}</h4> +    <table> +        {% for field in form %} +        {% if field.value %} +        <tr> +            <th>{{field.label}}{% trans ":" %} </th> +            <td>{% if field.field.rendered_value %} +                {{ field.field.rendered_value }} +                {% else %} +                {{ field.value }} +                {% endif %} +            </td> +        </tr> +        {% endif %} +        {% endfor %} +    </table> +    {% endif %} +{% endblock %} diff --git a/ishtar_common/views.py b/ishtar_common/views.py index aed24093f..9946a9dee 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1797,11 +1797,16 @@ class AlertList(JSONResponseMixin, LoginRequiredMixin,          return {'alerts': alerts} -class QAItemEditForm(IshtarMixin, LoginRequiredMixin, FormView): -    template_name = 'ishtar/qa_form.html' +class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView): +    template_name = 'ishtar/forms/qa_form.html'      model = None      form_class = None -    form_class_multi = None +    page_name = u"" +    success_url = "/success/" +    modal_size = None  # large, small or None (medium) + +    def get_quick_action(self): +        raise NotImplementedError()      def dispatch(self, request, *args, **kwargs):          assert self.model @@ -1811,16 +1816,44 @@ class QAItemEditForm(IshtarMixin, LoginRequiredMixin, FormView):              raise Http404()          # check availability -        if not self.model.QA_EDIT.is_available( +        quick_action = self.get_quick_action() +        if not quick_action.is_available(                  user=request.user, session=request.session):              for item in self.items: -                if not self.model.QA_EDIT.is_available( +                if not quick_action.is_available(                          user=request.user, session=request.session, obj=item):                      raise Http404() -        self.confirm = kwargs.get('confirm', False) and True          self.url = request.get_full_path() -        return super(QAItemEditForm, self).dispatch(request, *args, **kwargs) +        return super(QAItemForm, self).dispatch(request, *args, **kwargs) + +    def get_form_kwargs(self): +        kwargs = super(QAItemForm, self).get_form_kwargs() +        kwargs['items'] = self.items +        return kwargs + +    def get_context_data(self, **kwargs): +        data = super(QAItemForm, self).get_context_data(**kwargs) +        data['url'] = self.url +        data['items'] = self.items +        data['modal_size'] = self.modal_size +        data['page_name'] = u"{} – {}".format( +            self.model._meta.verbose_name, self.page_name) +        return data + + +class QAItemEditForm(QAItemForm): +    form_class_multi = None +    modal_size = "large" + +    def get_quick_action(self): +        return self.model.QA_EDIT + +    def dispatch(self, request, *args, **kwargs): +        self.confirm = kwargs.get('confirm', False) and True +        returned = super(QAItemEditForm, self).dispatch(request, *args, +                                                        **kwargs) +        return returned      def get_form_class(self):          if len(self.items) > 1 and self.form_class_multi: @@ -1829,7 +1862,6 @@ class QAItemEditForm(IshtarMixin, LoginRequiredMixin, FormView):      def get_form_kwargs(self):          kwargs = super(QAItemEditForm, self).get_form_kwargs() -        kwargs['items'] = self.items          kwargs['confirm'] = self.confirm          return kwargs @@ -1837,12 +1869,10 @@ class QAItemEditForm(IshtarMixin, LoginRequiredMixin, FormView):          data = super(QAItemEditForm, self).get_context_data(**kwargs)          data['page_name'] = u"{} – {}".format(              self.model._meta.verbose_name, self.model.QA_EDIT.text) -        data['url'] = self.url          if self.confirm:              if 'confirm' not in self.url:                  data['url'] = self.url.split('?')[0] + "confirm/"              data['confirm'] = True -            data['items'] = self.items          return data      def form_valid(self, form):  | 
