summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-09-11 17:44:09 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-10-24 12:06:08 +0200
commitc3d78fb588769075d260e26086077785813e9448 (patch)
tree3a848bc6b55ac7bfaf59e9d0afdb6119839f4ece
parent3e9cfd35489f6f24e69edb5b1fdcbfe9766f7e7f (diff)
downloadIshtar-c3d78fb588769075d260e26086077785813e9448.tar.bz2
Ishtar-c3d78fb588769075d260e26086077785813e9448.zip
Generic QA form - QA find basket form
-rw-r--r--archaeological_finds/forms.py26
-rw-r--r--archaeological_finds/models_finds.py8
-rw-r--r--archaeological_finds/templates/ishtar/forms/qa_find_basket.html69
-rw-r--r--archaeological_finds/urls.py8
-rw-r--r--archaeological_finds/views.py18
-rw-r--r--ishtar_common/static/js/ishtar.js14
-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.html33
-rw-r--r--ishtar_common/views.py50
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 >
+ &nbsp;<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">
+ &nbsp;<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 ":" %}&nbsp;</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"{} &ndash; {}".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"{} &ndash; {}".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):