diff options
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 |
commit | 8c6bd7f82712f849fb641e71cf95d5a05a26d198 (patch) | |
tree | dd60d5e07eeadd0d5172e81e0e762cd7f0d4f8b5 | |
parent | eddd946150bcd9d4ddb05000806cc2cdfb9af60d (diff) | |
download | Ishtar-8c6bd7f82712f849fb641e71cf95d5a05a26d198.tar.bz2 Ishtar-8c6bd7f82712f849fb641e71cf95d5a05a26d198.zip |
Basket: duplicate QA
-rw-r--r-- | archaeological_finds/forms.py | 31 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 17 | ||||
-rw-r--r-- | archaeological_finds/templates/ishtar/forms/qa_findbasket_duplicate.html | 22 | ||||
-rw-r--r-- | archaeological_finds/templates/ishtar/wizard/wizard_findbasket_deletion.html | 7 | ||||
-rw-r--r-- | archaeological_finds/urls.py | 5 | ||||
-rw-r--r-- | archaeological_finds/views.py | 26 | ||||
-rw-r--r-- | ishtar_common/models.py | 9 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/forms/qa_base.html | 3 |
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> |