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 | 6c1de61895bea26c3c219bbd57976396721dc073 (patch) | |
| tree | dd60d5e07eeadd0d5172e81e0e762cd7f0d4f8b5 | |
| parent | f5f97fb1d89a4ccfc0219c17aa3e8bac6f7fd357 (diff) | |
| download | Ishtar-6c1de61895bea26c3c219bbd57976396721dc073.tar.bz2 Ishtar-6c1de61895bea26c3c219bbd57976396721dc073.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>  | 
