summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-11-30 19:59:16 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-11-30 19:59:37 +0100
commit8c6bd7f82712f849fb641e71cf95d5a05a26d198 (patch)
treedd60d5e07eeadd0d5172e81e0e762cd7f0d4f8b5
parenteddd946150bcd9d4ddb05000806cc2cdfb9af60d (diff)
downloadIshtar-8c6bd7f82712f849fb641e71cf95d5a05a26d198.tar.bz2
Ishtar-8c6bd7f82712f849fb641e71cf95d5a05a26d198.zip
Basket: duplicate QA
-rw-r--r--archaeological_finds/forms.py31
-rw-r--r--archaeological_finds/models_finds.py17
-rw-r--r--archaeological_finds/templates/ishtar/forms/qa_findbasket_duplicate.html22
-rw-r--r--archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html7
-rw-r--r--archaeological_finds/urls.py5
-rw-r--r--archaeological_finds/views.py26
-rw-r--r--ishtar_common/models.py9
-rw-r--r--ishtar_common/templates/ishtar/forms/qa_base.html3
8 files changed, 113 insertions, 7 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index f78b4a5f3..e896b310d 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -84,7 +84,7 @@ __all__ = [
'FindDeletionForm', 'UpstreamFindFormSelection', 'NewFindBasketForm',
'SelectFindBasketForm', 'FindBasketAddItemForm',
'QAFindFormSingle', 'QAFindFormMulti', 'QAFindBasketForm',
- 'QAFindTreatmentForm',
+ 'QAFindTreatmentForm', 'QAFindbasketDuplicateForm',
'N1TreatmentForm', 'OneNTreatmentForm', 'ResultingFindForm',
'ResultingFindsForm', 'SingleUpstreamFindFormSelection'
]
@@ -695,6 +695,35 @@ class QAFindBasketForm(IshtarForm):
basket.items.add(item)
+class QAFindbasketDuplicateForm(IshtarForm):
+ label = forms.CharField(label="", max_length=None, required=True)
+
+ 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.basket = kwargs.pop('items')[0]
+ super(QAFindbasketDuplicateForm, self).__init__(*args, **kwargs)
+ self.fields['label'].initial = self.basket.label + unicode(
+ _(u" - duplicate"))
+
+ def clean(self):
+ label = self.cleaned_data['label'].strip()
+ if not label:
+ raise forms.ValidationError(_(u"A label is required."))
+ if models.FindBasket.objects.filter(user=self.user,
+ label=label).count():
+ raise forms.ValidationError(_(u"A basket with this label already "
+ u"exists."))
+ return self.cleaned_data
+
+ def save(self):
+ self.basket.duplicate(label=self.cleaned_data['label'],
+ ishtaruser=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 75ea69ac1..b1dfdba29 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -580,11 +580,19 @@ WEIGHT_UNIT = (('g', _(u"g")),
('kg', _(u"kg")),)
-class FindBasket(Basket):
+class FindBasket(Basket, MainItem):
SHOW_URL = 'show-findbasket'
items = models.ManyToManyField('Find', blank=True, related_name='basket')
+ QUICK_ACTIONS = [
+ QuickAction(
+ url="findbasket-qa-duplicate", icon_class="fa fa-clone",
+ text=_(u"Duplicate"), target="one",
+ rights=['view_find', 'view_own_find']),
+ ]
+
class Meta:
+ verbose_name = _(u"Basket")
permissions = (
("view_find", u"Can view all Finds"),
("view_own_find", u"Can view own Find"),
@@ -608,6 +616,13 @@ class FindBasket(Basket):
_(u"Manage basket"),
"fa fa-shopping-basket", "", "", False),
]
+
+ duplicate = self.QUICK_ACTIONS[0]
+ actions += [
+ (reverse(duplicate.url, args=[self.pk]),
+ duplicate.text, duplicate.icon_class,
+ "", "", True),
+ ]
return actions
diff --git a/archaeological_finds/templates/ishtar/forms/qa_findbasket_duplicate.html b/archaeological_finds/templates/ishtar/forms/qa_findbasket_duplicate.html
new file mode 100644
index 000000000..b9ec50f22
--- /dev/null
+++ b/archaeological_finds/templates/ishtar/forms/qa_findbasket_duplicate.html
@@ -0,0 +1,22 @@
+{% extends "ishtar/forms/qa_base.html" %}
+{% load i18n inline_formset table_form %}
+
+{% block main_form %}
+<div class="alert alert-info">
+ {% trans "Items of the basket will be attached to the new basket but not the shares." %}
+</div>
+{% if form.non_field_errors %}
+<div class="alert alert-danger" role="alert">
+ {{form.non_field_errors}}
+</div>
+{% endif %}
+<div class="form-row">
+ <div class="form-group col-lg-6 required">
+ <label>{% trans "Label" %}</label>
+ </div>
+ {% with form.label as field %}
+ {% include "blocks/bs_field_snippet.html" %}
+ {% endwith %}
+</div>
+{% endblock %}
+
diff --git a/archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html b/archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html
index 02f7253d7..ffd5f0398 100644
--- a/archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html
+++ b/archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html
@@ -13,6 +13,13 @@
</div>
{% endif %}
<div class="alert alert-info">
+ {% trans "Items inside the basket (these items will not be deleted):" %}
+</div>
+<ul>{% for item in current_object.items.all %}
+ <li>{{item}} {{item|link_to_window}}</li>
+{% endfor %}</ul>
+
+<div class="alert alert-info">
{% trans "Basket informations:" %}
</div>
{% endblock %}
diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py
index 9f8776e62..c5a0f7aa2 100644
--- a/archaeological_finds/urls.py
+++ b/archaeological_finds/urls.py
@@ -84,6 +84,11 @@ urlpatterns = [
check_rights(['view_find', 'view_own_find'])(
views.basket_delete_wizard),
name='find_basket_deletion'),
+ url(r'^findbasket-qa-duplicate/(?P<pks>[0-9-]+)?/$',
+ check_rights(['view_find', 'view_own_find'])(
+ views.QAFindbasketDuplicateFormView.as_view()),
+ name='findbasket-qa-duplicate'),
+
url(r'^find-qa-bulk-update/(?P<pks>[0-9-]+)?/$',
check_rights(['change_find', 'change_own_find'])(
views.QAFindForm.as_view()),
diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py
index 28c9495a3..81b032d0b 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -727,3 +727,29 @@ class QAFindTreatmentFormView(QAItemForm):
def form_valid(self, form):
form.save(self.items, self.request.user)
return HttpResponseRedirect(reverse("success"))
+
+
+class QAFindbasketDuplicateFormView(QAItemForm):
+ template_name = 'ishtar/forms/qa_findbasket_duplicate.html'
+ model = models.FindBasket
+ page_name = _(u"Duplicate")
+ modal_size = "small"
+ form_class = QAFindbasketDuplicateForm
+
+ def get_quick_action(self):
+ return models.FindBasket.QUICK_ACTIONS[0]
+
+ def get_form_kwargs(self):
+ kwargs = super(QAFindbasketDuplicateFormView, self).get_form_kwargs()
+ kwargs['user'] = self.request.user
+ return kwargs
+
+ def form_valid(self, form):
+ form.save()
+ return HttpResponseRedirect(reverse("success"))
+
+ def get_context_data(self, **kwargs):
+ data = super(QAFindbasketDuplicateFormView, self).get_context_data(
+ **kwargs)
+ data['action_name'] = _(u"Duplicate")
+ return data
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 219b6b266..b6c8fbb3d 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -3495,9 +3495,10 @@ class Basket(FullSearch, OwnPerms):
def get_write_query_owns(cls, ishtaruser):
return Q(user=ishtaruser)
- def duplicate(self, ishtaruser=None):
+ def duplicate(self, label=None, ishtaruser=None):
"""
Duplicate the basket. Items in basket are copied but not shared users
+ :param label: if provided use the name
:param ishtaruser: if provided an alternate user is used
:return: the new basket
"""
@@ -3506,13 +3507,15 @@ class Basket(FullSearch, OwnPerms):
new_item.pk = None
if ishtaruser:
new_item.user = ishtaruser
- label = new_item.label
+ if not label:
+ label = new_item.label
while self.__class__.objects.filter(
label=label, user=new_item.user).count():
label += unicode(_(u" - duplicate"))
+ new_item.label = label
new_item.save()
for item in items:
- new_item.add(item)
+ new_item.items.add(item)
return new_item
diff --git a/ishtar_common/templates/ishtar/forms/qa_base.html b/ishtar_common/templates/ishtar/forms/qa_base.html
index 70fe70e65..367acfcd8 100644
--- a/ishtar_common/templates/ishtar/forms/qa_base.html
+++ b/ishtar_common/templates/ishtar/forms/qa_base.html
@@ -1,7 +1,6 @@
{% load i18n inline_formset table_form %}
-<div
- class="modal-dialog {% if modal_size == 'large' %}modal-lg {% elif modal_size == 'small'%}modal-sm {% endif%}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>