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): |