diff options
| -rw-r--r-- | archaeological_finds/models_finds.py | 8 | ||||
| -rw-r--r-- | archaeological_finds/templates/ishtar/sheet_treatment.html | 2 | ||||
| -rw-r--r-- | archaeological_finds/urls.py | 9 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 281 | ||||
| -rw-r--r-- | archaeological_finds/wizards.py | 2 | ||||
| -rw-r--r-- | archaeological_warehouse/models.py | 17 | ||||
| -rw-r--r-- | archaeological_warehouse/urls.py | 5 | ||||
| -rw-r--r-- | archaeological_warehouse/views.py | 13 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 54 | 
9 files changed, 248 insertions, 143 deletions
| diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 5dc8abc98..ee6253109 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -616,6 +616,12 @@ class FindBasket(Basket, MainItem):                   _(u"Manage basket"),                   "fa fa-shopping-basket", "", "", False),              ] +        can_edit_find = self.can_do(request, 'change_find') +        if can_edit_find: +            actions += [ +                (reverse('findbasket-add-treatment', args=[self.pk]), +                 _(u"Add treatment"), "fa fa-exchange", "", "", False), +            ]          duplicate = self.QUICK_ACTIONS[0]          actions += [ @@ -1237,6 +1243,8 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,                  (reverse("find-qa-basket", args=[self.pk]),                   _(u"Add to basket"),                   "fa fa-shopping-basket", "", "", True), +                (reverse('find-add-treatment', args=[self.pk]), +                 _(u"Add treatment"), "fa fa-exchange", "", "", False),              ]              if get_current_profile().warehouse:                  actions.append( diff --git a/archaeological_finds/templates/ishtar/sheet_treatment.html b/archaeological_finds/templates/ishtar/sheet_treatment.html index ced305798..78460d002 100644 --- a/archaeological_finds/templates/ishtar/sheet_treatment.html +++ b/archaeological_finds/templates/ishtar/sheet_treatment.html @@ -109,8 +109,10 @@          {% dynamic_table_document finds 'finds_for_treatment' 'upstream_treatment' item.pk 'TABLE_COLS_FOR_OPE' output %}          {% endif %} +        {% comment %}          {% trans "Related operations" as related_operations %}          {% dynamic_table_document related_operations 'operations' 'related_treatment' item.pk 'TABLE_COLS' output %} +        {% endcomment %}      </div> diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index c5a0f7aa2..cf3522d43 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -89,6 +89,15 @@ urlpatterns = [              views.QAFindbasketDuplicateFormView.as_view()),          name='findbasket-qa-duplicate'), +    url(r'^findbasket-add-treatment/(?P<pk>[0-9-]+)/$', +        check_rights(['change_find', 'change_own_find'])( +            views.findbasket_treatment_add), +        name='findbasket-add-treatment'), +    url(r'^find-add-treatment/(?P<pk>[0-9-]+)/$', +        check_rights(['change_find', 'change_own_find'])( +            views.find_treatment_add), +        name='find-add-treatment'), +      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 81b032d0b..620f33ef4 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -19,6 +19,7 @@  import json +from django.core.exceptions import PermissionDenied  from django.core.urlresolvers import reverse  from django.db.models import Q  from django.http import HttpResponseRedirect, HttpResponse, Http404 @@ -27,18 +28,24 @@ from django.utils.translation import ugettext_lazy as _  from django.views.generic import TemplateView  from django.views.generic.edit import CreateView, FormView + +from ishtar_common.models import IshtarUser, get_current_profile +from archaeological_operations.models import AdministrativeAct +from archaeological_finds import models + +from ishtar_common.forms import FinalForm  from archaeological_context_records.forms \      import RecordFormSelection as RecordFormSelectionTable  from archaeological_operations.forms import FinalAdministrativeActDeleteForm -from archaeological_operations.wizards import AdministrativeActDeletionWizard -from forms import * -from ishtar_common.forms import FinalForm -from ishtar_common.models import IshtarUser, get_current_profile +from archaeological_finds import forms +  from ishtar_common.views import get_autocomplete_generic, IshtarMixin, \      LoginRequiredMixin, QAItemEditForm, QAItemForm  from ishtar_common.views_item import display_item, get_item, show_item, \      revert_item, get_autocomplete_item, get_autocomplete_query -from wizards import * + +from archaeological_operations.wizards import AdministrativeActDeletionWizard +from archaeological_finds import wizards  get_find = get_item(models.Find, 'get_find', 'find') @@ -141,16 +148,17 @@ get_find_basket_for_write = get_item(      model_for_perms=models.Find, alt_query_own='get_write_query_owns'  ) -basket_search_wizard = FindBasketSearch.as_view( -    [('selec-find_basket_search', FindBasketFormSelection)], +basket_search_wizard = wizards.FindBasketSearch.as_view( +    [('selec-find_basket_search', forms.FindBasketFormSelection)],      label=_(u"Basket search"),      url_name='find_basket_search',  ) -basket_modify_wizard = FindBasketEditWizard.as_view( +basket_modify_wizard = wizards.FindBasketEditWizard.as_view(      [ -        ('selec-find_basket_modification', FindBasketForWriteFormSelection), -        ('basket-find_basket_modification', FindBasketForm), +        ('selec-find_basket_modification', +         forms.FindBasketForWriteFormSelection), +        ('basket-find_basket_modification', forms.FindBasketForm),          ('final-find_basket_modification', FinalForm)      ],      label=_(u"Basket modify"), @@ -161,7 +169,7 @@ basket_modify_wizard = FindBasketEditWizard.as_view(  def find_basket_modify(request, pk):      basket_modify_wizard(request)      key = 'selec-find_basket_modification' -    FindBasketEditWizard.session_set_value( +    wizards.FindBasketEditWizard.session_set_value(          request, key, 'pk', pk, reset=True)      return redirect(          reverse('find_basket_modification', @@ -169,12 +177,12 @@ def find_basket_modify(request, pk):  findbasket_deletion_steps = [ -    ('selec-find_basket_deletion', FindBasketForWriteFormSelection), +    ('selec-find_basket_deletion', forms.FindBasketForWriteFormSelection),      ('final-find_basket_deletion', FinalForm)  ] -basket_delete_wizard = FindBasketDeletionWizard.as_view( +basket_delete_wizard = wizards.FindBasketDeletionWizard.as_view(      findbasket_deletion_steps,      label=_(u"Basket deletion"),      url_name='find_basket_deletion', @@ -195,9 +203,9 @@ def check_not_warehouse_module(self):  find_creation_steps = [      ('selecrecord-find_creation', RecordFormSelectionTable), -    ('find-find_creation', FindForm), -    ('preservation-find_creation', PreservationForm), -    ('dating-find_creation', DatingFormSet), +    ('find-find_creation', forms.FindForm), +    ('preservation-find_creation', forms.PreservationForm), +    ('dating-find_creation', forms.DatingFormSet),      ('final-find_creation', FinalForm)  ] @@ -205,7 +213,7 @@ find_creation_condition_dict = {      'preservation-find_creation': check_preservation_module,  } -find_creation_wizard = FindWizard.as_view( +find_creation_wizard = wizards.FindWizard.as_view(      find_creation_steps,      label=_(u"New find"),      condition_dict=find_creation_condition_dict, @@ -216,9 +224,9 @@ find_search_condition_dict = {      'generalwarehouse-find_search': check_warehouse_module,  } -find_search_wizard = FindSearch.as_view([ -    ('general-find_search', FindFormSelection), -    ('generalwarehouse-find_search', FindFormSelectionWarehouseModule)], +find_search_wizard = wizards.FindSearch.as_view([ +    ('general-find_search', forms.FindFormSelection), +    ('generalwarehouse-find_search', forms.FindFormSelectionWarehouseModule)],      label=_(u"Find search"),      url_name='find_search',      condition_dict=find_search_condition_dict @@ -246,17 +254,17 @@ find_modification_condition_dict = {  }  find_modification_steps = [ -    ('selec-find_modification', FindFormSelection), -    ('selecw-find_modification', FindFormSelectionWarehouseModule), -    ('selecrecord-find_modification', RecordFormSelection), -    ('find-find_modification', FindForm), -    ('simplefind-find_modification', SimpleFindForm), -    ('preservation-find_modification', PreservationForm), -    ('dating-find_modification', DatingFormSet), +    ('selec-find_modification', forms.FindFormSelection), +    ('selecw-find_modification', forms.FindFormSelectionWarehouseModule), +    ('selecrecord-find_modification', forms.RecordFormSelection), +    ('find-find_modification', forms.FindForm), +    ('simplefind-find_modification', forms.SimpleFindForm), +    ('preservation-find_modification', forms.PreservationForm), +    ('dating-find_modification', forms.DatingFormSet),      ('final-find_modification', FinalForm)  ] -find_modification_wizard = FindModificationWizard.as_view( +find_modification_wizard = wizards.FindModificationWizard.as_view(      find_modification_steps,      condition_dict=find_modification_condition_dict,      label=_(u"Find modification"), @@ -269,7 +277,7 @@ def find_modify(request, pk):      key = 'selec-find_modification'      if get_current_profile().warehouse:          key = 'selecw-find_modification' -    FindModificationWizard.session_set_value( +    wizards.FindModificationWizard.session_set_value(          request, key, 'pk', pk, reset=True)      q = models.Find.objects.filter(pk=pk)      if not q.count(): @@ -287,11 +295,11 @@ find_deletion_condition_dict = {  }  find_deletion_steps = [ -    ('selec-find_deletion', FindFormSelection), -    ('selecw-find_deletion', FindFormSelectionWarehouseModule), -    ('final-find_deletion', FindDeletionForm)] +    ('selec-find_deletion', forms.FindFormSelection), +    ('selecw-find_deletion', forms.FindFormSelectionWarehouseModule), +    ('final-find_deletion', forms.FindDeletionForm)] -find_deletion_wizard = FindDeletionWizard.as_view( +find_deletion_wizard = wizards.FindDeletionWizard.as_view(      find_deletion_steps,      condition_dict=find_deletion_condition_dict,      label=_(u"Find deletion"), @@ -306,7 +314,7 @@ autocomplete_integritytype = get_autocomplete_generic(models.IntegrityType)  class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView):      template_name = 'ishtar/form.html'      model = models.FindBasket -    form_class = NewFindBasketForm +    form_class = forms.NewFindBasketForm      page_name = _(u"New basket")      def get_form_kwargs(self): @@ -335,7 +343,7 @@ class OwnBasket(object):  class SelectBasketForManagement(IshtarMixin, LoginRequiredMixin, FormView):      template_name = 'ishtar/form.html' -    form_class = SelectFindBasketForm +    form_class = forms.SelectFindBasketForm      page_name = _(u"Manage items in basket")      def get_form_kwargs(self): @@ -368,9 +376,9 @@ class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin,          )          context['basket'] = self.basket          if get_current_profile().warehouse: -            context['form'] = MultipleFindFormSelectionWarehouseModule() +            context['form'] = forms.MultipleFindFormSelectionWarehouseModule()          else: -            context['form'] = MultipleFindFormSelection() +            context['form'] = forms.MultipleFindFormSelection()          context['add_url'] = reverse('add_iteminbasket')          context['list_url'] = reverse('list_iteminbasket',                                        kwargs={'pk': self.basket.pk}) @@ -382,7 +390,7 @@ class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin,  class FindBasketAddItemView(IshtarMixin, LoginRequiredMixin, FormView):      template_name = 'ishtar/simple_form.html' -    form_class = FindBasketAddItemForm +    form_class = forms.FindBasketAddItemForm      def get_success_url(self, basket):          return reverse('list_iteminbasket', kwargs={'pk': basket.pk}) @@ -448,53 +456,53 @@ get_downstreamtreatment = get_item(      'downtreatment')  treatment_wizard_steps = [ -    ('selecfind-treatment_creation', UpstreamFindFormSelection), -    ('file-treatment_creation', TreatmentFormFileChoice), -    ('basetreatment-treatment_creation', BaseTreatmentForm), +    ('selecfind-treatment_creation', forms.UpstreamFindFormSelection), +    ('file-treatment_creation', forms.TreatmentFormFileChoice), +    ('basetreatment-treatment_creation', forms.BaseTreatmentForm),      ('final-treatment_creation', FinalForm)  ] -treatment_search_wizard = TreatmentSearch.as_view([ -    ('general-treatment_search', TreatmentFormSelection)], +treatment_search_wizard = wizards.TreatmentSearch.as_view([ +    ('general-treatment_search', forms.TreatmentFormSelection)],      label=_(u"Treatment search"),      url_name='treatment_search',) -treatment_creation_wizard = TreatmentWizard.as_view( +treatment_creation_wizard = wizards.TreatmentWizard.as_view(      treatment_wizard_steps,      label=_(u"New treatment"),      url_name='treatment_creation',)  treatment_n1_wizard_steps = [ -    ('selecfind-treatment_creation_n1', UpstreamFindFormSelection), -    ('file-treatment_creation_n1', TreatmentFormFileChoice), -    ('basetreatment-treatment_creation_n1', N1TreatmentForm), -    ('resultingfind-treatment_creation_n1', ResultingFindForm), +    ('selecfind-treatment_creation_n1', forms.UpstreamFindFormSelection), +    ('file-treatment_creation_n1', forms.TreatmentFormFileChoice), +    ('basetreatment-treatment_creation_n1', forms.N1TreatmentForm), +    ('resultingfind-treatment_creation_n1', forms.ResultingFindForm),      ('final-treatment_creation_n1', FinalForm)  ] -treatment_creation_n1_wizard = TreatmentN1Wizard.as_view( +treatment_creation_n1_wizard = wizards.TreatmentN1Wizard.as_view(      treatment_n1_wizard_steps,      label=_(u"New treatment"),      url_name='treatment_creation_n1',)  treatment_1n_wizard_steps = [ -    ('selecfind-treatment_creation_1n', SingleUpstreamFindFormSelection), -    ('file-treatment_creation_1n', TreatmentFormFileChoice), -    ('basetreatment-treatment_creation_1n', OneNTreatmentForm), -    ('resultingfinds-treatment_creation_1n', ResultingFindsForm), +    ('selecfind-treatment_creation_1n', forms.SingleUpstreamFindFormSelection), +    ('file-treatment_creation_1n', forms.TreatmentFormFileChoice), +    ('basetreatment-treatment_creation_1n', forms.OneNTreatmentForm), +    ('resultingfinds-treatment_creation_1n', forms.ResultingFindsForm),      ('final-treatment_creation_1n', FinalForm)  ] -treatment_creation_1n_wizard = Treatment1NWizard.as_view( +treatment_creation_1n_wizard = wizards.Treatment1NWizard.as_view(      treatment_1n_wizard_steps,      label=_(u"New treatment"),      url_name='treatment_creation_1n',) -treatment_modification_wizard = TreatmentModificationWizard.as_view( -    [('selec-treatment_modification', TreatmentFormSelection), -     ('file-treatment_modification', TreatmentFormFileChoice), -     ('basetreatment-treatment_modification', TreatmentModifyForm), +treatment_modification_wizard = wizards.TreatmentModificationWizard.as_view( +    [('selec-treatment_modification', forms.TreatmentFormSelection), +     ('file-treatment_modification', forms.TreatmentFormFileChoice), +     ('basetreatment-treatment_modification', forms.TreatmentModifyForm),       ('final-treatment_modification', FinalForm)],      label=_(u"Treatment modification"),      url_name='treatment_modification', @@ -503,41 +511,77 @@ treatment_modification_wizard = TreatmentModificationWizard.as_view(  def treatment_modify(request, pk):      treatment_modification_wizard(request) -    TreatmentModificationWizard.session_set_value( +    wizards.TreatmentModificationWizard.session_set_value(          request, 'selec-treatment_modification', 'pk', pk, reset=True)      return redirect(reverse(          'treatment_modification',          kwargs={'step': 'basetreatment-treatment_modification'})) -treatment_deletion_wizard = TreatmentDeletionWizard.as_view([ -    ('selec-treatment_deletion', TreatmentFormSelection), -    ('final-treatment_deletion', TreatmentDeletionForm)], +def treatment_add(request, pks): +    treatment_creation_wizard(request) +    wizards.TreatmentWizard.session_set_value( +        request, 'selecfind-treatment_creation', +        'resulting_pk', pks, reset=True) +    wizards.TreatmentWizard.session_set_value( +        request, 'file-treatment_creation', 'file', '') +    return redirect(reverse( +        'treatment_creation', +        kwargs={'step': 'basetreatment-treatment_creation'})) + + +def find_treatment_add(request, pk, current_right=None): +    if not models.Find.objects.filter(pk=pk).count(): +        raise Http404() +    return treatment_add(request, str(pk)) + + +def findbasket_treatment_add(request, pk, current_right=None): +    try: +        basket = models.FindBasket.objects.get(pk=pk) +    except models.FindBasket.DoesNotExist: +        raise Http404() +    return treatment_add( +        request, ",".join([str(f.pk) for f in basket.items.all()])) + + +def container_treatment_add(request, pk, current_right=None): +    try: +        basket = models.FindBasket.objects.get(pk=pk) +    except models.FindBasket.DoesNotExist: +        raise Http404() +    return treatment_add(request, +                         ",".join([str(f.pk) for f in basket.items.all()])) + + +treatment_deletion_wizard = wizards.TreatmentDeletionWizard.as_view([ +    ('selec-treatment_deletion', forms.TreatmentFormSelection), +    ('final-treatment_deletion', forms.TreatmentDeletionForm)],      label=_(u"Treatment deletion"),      url_name='treatment_deletion',)  treatment_administrativeact_search_wizard = \ -    SearchWizard.as_view([ +    wizards.SearchWizard.as_view([          ('selec-treatment_admacttreatment_search', -         AdministrativeActTreatmentFormSelection)], +         forms.AdministrativeActTreatmentFormSelection)],          label=_(u"Treatment: search administrative act"),          url_name='treatment_admacttreatment_search',)  treatment_administrativeact_wizard = \ -    TreatmentAdministrativeActWizard.as_view([ -        ('selec-treatment_admacttreatment', TreatmentFormSelection), +    wizards.TreatmentAdministrativeActWizard.as_view([ +        ('selec-treatment_admacttreatment', forms.TreatmentFormSelection),          ('administrativeact-treatment_admacttreatment', -         AdministrativeActTreatmentForm), +         forms.AdministrativeActTreatmentForm),          ('final-treatment_admacttreatment', FinalForm)],          label=_(u"Treatment: new administrative act"),          url_name='treatment_admacttreatment',)  treatment_administrativeact_modification_wizard = \ -    TreatmentEditAdministrativeActWizard.as_view([ +    wizards.TreatmentEditAdministrativeActWizard.as_view([          ('selec-treatment_admacttreatment_modification', -         AdministrativeActTreatmentFormSelection), +         forms.AdministrativeActTreatmentFormSelection),          ('administrativeact-treatment_admacttreatment_modification', -         AdministrativeActTreatmentModifForm), +         forms.AdministrativeActTreatmentModifForm),          ('final-treatment_admacttreatment_modification', FinalForm)],          label=_(u"Treatment: administrative act modification"),          url_name='treatment_admacttreatment_modification',) @@ -545,7 +589,7 @@ treatment_administrativeact_modification_wizard = \  treatment_admacttreatment_deletion_wizard = \      AdministrativeActDeletionWizard.as_view([          ('selec-treatment_admacttreatment_deletion', -         AdministrativeActTreatmentFormSelection), +         forms.AdministrativeActTreatmentFormSelection),          ('final-treatment_admacttreatment_deletion',           FinalAdministrativeActDeleteForm)],          label=_(u"Treatment: administrative act deletion"), @@ -554,7 +598,7 @@ treatment_admacttreatment_deletion_wizard = \  def treatment_administrativeacttreatment_modify(request, pk):      treatment_administrativeact_modification_wizard(request) -    TreatmentEditAdministrativeActWizard.session_set_value( +    wizards.TreatmentEditAdministrativeActWizard.session_set_value(          request,          'selec-treatment_admacttreatment_modification',          'pk', pk, reset=True) @@ -569,67 +613,70 @@ def treatment_administrativeacttreatment_modify(request, pk):  # treatment request -treatmentfile_search_wizard = TreatmentFileSearch.as_view([ -    ('general-treatmentfile_search', TreatmentFileFormSelection)], +treatmentfile_search_wizard = wizards.TreatmentFileSearch.as_view([ +    ('general-treatmentfile_search', forms.TreatmentFileFormSelection)],      label=_(u"Treatment request search"),      url_name='treatmentfile_search',)  treatmentfile_wizard_steps = [ -    ('treatmentfile-treatmentfile_creation', TreatmentFileForm), +    ('treatmentfile-treatmentfile_creation', forms.TreatmentFileForm),      ('final-treatmentfile_creation', FinalForm)] -treatmentfile_creation_wizard = TreatmentFileWizard.as_view( +treatmentfile_creation_wizard = wizards.TreatmentFileWizard.as_view(      treatmentfile_wizard_steps,      label=_(u"New treatment request"),      url_name='treatmentfile_creation',) -treatmentfile_modification_wizard = TreatmentFileModificationWizard.as_view( -    [('selec-treatmentfile_modification', TreatmentFileFormSelection), -     ('treatmentfile-treatmentfile_modification', TreatmentFileModifyForm), -     ('final-treatmentfile_modification', FinalForm)], -    label=_(u"Treatment request modification"), -    url_name='treatmentfile_modification', -) +treatmentfile_modification_wizard = \ +    wizards.TreatmentFileModificationWizard.as_view( +        [('selec-treatmentfile_modification', forms.TreatmentFileFormSelection), +         ('treatmentfile-treatmentfile_modification', +          forms.TreatmentFileModifyForm), +         ('final-treatmentfile_modification', FinalForm)], +        label=_(u"Treatment request modification"), +        url_name='treatmentfile_modification', +    )  def treatmentfile_modify(request, pk):      treatmentfile_modification_wizard(request) -    TreatmentFileModificationWizard.session_set_value( +    wizards.TreatmentFileModificationWizard.session_set_value(          request, 'selec-treatmentfile_modification', 'pk', pk, reset=True)      return redirect(reverse(          'treatmentfile_modification',          kwargs={'step': 'treatmentfile-treatmentfile_modification'})) -treatmentfile_deletion_wizard = TreatmentFileDeletionWizard.as_view([ -    ('selec-treatmentfile_deletion', TreatmentFileFormSelection), -    ('final-treatmentfile_deletion', TreatmentFileDeletionForm)], +treatmentfile_deletion_wizard = wizards.TreatmentFileDeletionWizard.as_view([ +    ('selec-treatmentfile_deletion', forms.TreatmentFileFormSelection), +    ('final-treatmentfile_deletion', forms.TreatmentFileDeletionForm)],      label=_(u"Treatment request deletion"),      url_name='treatmentfile_deletion',)  treatmentfile_admacttreatmentfile_search_wizard = \ -    SearchWizard.as_view([ +    wizards.SearchWizard.as_view([          ('selec-treatmentfle_admacttreatmentfle_search', -         AdministrativeActTreatmentFileFormSelection)], +         forms.AdministrativeActTreatmentFileFormSelection)],          label=_(u"Treatment request: search administrative act"),          url_name='treatmentfle_admacttreatmentfle_search',)  treatmentfile_admacttreatmentfile_wizard = \ -    TreatmentFileAdministrativeActWizard.as_view([ -        ('selec-treatmentfle_admacttreatmentfle', TreatmentFileFormSelection), +    wizards.TreatmentFileAdministrativeActWizard.as_view([ +        ('selec-treatmentfle_admacttreatmentfle', +         forms.TreatmentFileFormSelection),          ('admact-treatmentfle_admacttreatmentfle', -         AdministrativeActTreatmentFileForm), +         forms.AdministrativeActTreatmentFileForm),          ('final-treatmentfle_admacttreatmentfle', FinalForm)],          label=_(u"Treatment request: new administrative act"),          url_name='treatmentfle_admacttreatmentfle',)  treatmentfile_admacttreatmentfile_modification_wizard = \ -    TreatmentFileEditAdministrativeActWizard.as_view([ +    wizards.TreatmentFileEditAdministrativeActWizard.as_view([          ('selec-treatmentfle_admacttreatmentfle_modification', -         AdministrativeActTreatmentFileFormSelection), +         forms.AdministrativeActTreatmentFileFormSelection),          ('admact-treatmentfle_admacttreatmentfle_modification', -         AdministrativeActTreatmentFileModifForm), +         forms.AdministrativeActTreatmentFileModifForm),          ('final-treatmentfle_admacttreatmentfle_modification', FinalForm)],          label=_(u"Treatment request: administrative act modification"),          url_name='treatmentfle_admacttreatmentfle_modification',) @@ -637,7 +684,7 @@ treatmentfile_admacttreatmentfile_modification_wizard = \  treatmentfile_admacttreatmentfile_deletion_wizard = \      AdministrativeActDeletionWizard.as_view([          ('selec-treatmentfle_admacttreatmentfle_deletion', -         AdministrativeActTreatmentFileFormSelection), +         forms.AdministrativeActTreatmentFileFormSelection),          ('final-treatmentfle_admacttreatmentfle_deletion',           FinalAdministrativeActDeleteForm)],          label=_(u"Treatment request: administrative act deletion"), @@ -646,7 +693,7 @@ treatmentfile_admacttreatmentfile_deletion_wizard = \  def treatmentfile_administrativeacttreatmentfile_modify(request, pk):      treatmentfile_admacttreatmentfile_modification_wizard(request) -    TreatmentFileEditAdministrativeActWizard.session_set_value( +    wizards.TreatmentFileEditAdministrativeActWizard.session_set_value(          request,          'selec-treatmentfle_admacttreatmentfle_modification',          'pk', pk, reset=True) @@ -661,22 +708,26 @@ def treatmentfile_administrativeacttreatmentfile_modify(request, pk):  def reset_wizards(request):      for wizard_class, url_name in ( -            (FindWizard, 'find_creation'), -            (FindModificationWizard, 'find_modification'), -            (FindDeletionWizard, 'find_deletion'), -            (TreatmentWizard, 'treatement_creation'), -            (TreatmentModificationWizard, 'treatment_modification'), -            (TreatmentDeletionWizard, 'treatment_deletion'), -            (TreatmentAdministrativeActWizard, 'treatment_admacttreatment'), -            (TreatmentEditAdministrativeActWizard, +            (wizards.FindWizard, 'find_creation'), +            (wizards.FindModificationWizard, 'find_modification'), +            (wizards.FindDeletionWizard, 'find_deletion'), +            (wizards.TreatmentWizard, 'treatement_creation'), +            (wizards.TreatmentModificationWizard, 'treatment_modification'), +            (wizards.TreatmentDeletionWizard, 'treatment_deletion'), +            (wizards.TreatmentAdministrativeActWizard, +             'treatment_admacttreatment'), +            (wizards.TreatmentEditAdministrativeActWizard,               'treatment_admacttreatment_modification'), -            (TreatmentDeletionWizard, 'treatment_admacttreatment_deletion'), -            (TreatmentFileWizard, 'treatmentfile_creation'), -            (TreatmentFileModificationWizard, 'treatmentfile_modification'), -            (TreatmentFileDeletionWizard, 'treatmentfile_deletion'), -            (TreatmentFileAdministrativeActWizard, +            (wizards.TreatmentDeletionWizard, +             'treatment_admacttreatment_deletion'), +            (wizards.TreatmentFileWizard, +             'treatmentfile_creation'), +            (wizards.TreatmentFileModificationWizard, +             'treatmentfile_modification'), +            (wizards.TreatmentFileDeletionWizard, 'treatmentfile_deletion'), +            (wizards.TreatmentFileAdministrativeActWizard,               'treatmentfle_admacttreatmentfle'), -            (TreatmentFileEditAdministrativeActWizard, +            (wizards.TreatmentFileEditAdministrativeActWizard,               'treatmentfle_admacttreatmentfle_modification'),              (AdministrativeActDeletionWizard,               'treatmentfle_admacttreatmentfle_deletion'), @@ -686,13 +737,13 @@ def reset_wizards(request):  class QAFindForm(QAItemEditForm):      model = models.Find -    form_class = QAFindFormMulti +    form_class = forms.QAFindFormMulti  class QAFindBasketFormView(QAItemForm):      template_name = 'ishtar/forms/qa_find_basket.html'      model = models.Find -    form_class = QAFindBasketForm +    form_class = forms.QAFindBasketForm      page_name = _(u"Basket")      modal_size = "small" @@ -712,7 +763,7 @@ class QAFindBasketFormView(QAItemForm):  class QAFindTreatmentFormView(QAItemForm):      template_name = 'ishtar/forms/qa_find_treatment.html'      model = models.Find -    form_class = QAFindTreatmentForm +    form_class = forms.QAFindTreatmentForm      page_name = _(u"Packaging")      def get_quick_action(self): @@ -734,7 +785,7 @@ class QAFindbasketDuplicateFormView(QAItemForm):      model = models.FindBasket      page_name = _(u"Duplicate")      modal_size = "small" -    form_class = QAFindbasketDuplicateForm +    form_class = forms.QAFindbasketDuplicateForm      def get_quick_action(self):          return models.FindBasket.QUICK_ACTIONS[0] diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index 31881fe74..d523170eb 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -138,7 +138,7 @@ class TreatmentBase(Wizard):                  models.Find.objects.get(pk=int(find_id.strip()))                  for find_id in find_ids.split(u',')              ] -        except(TypeError, ValueError, ObjectDoesNotExist): +        except(TypeError, ValueError, AttributeError, ObjectDoesNotExist):              pass      def get_form_initial(self, step, data=None): diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 5565bc504..92eaf5d2f 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -21,6 +21,7 @@ import datetime  from django.conf import settings  from django.contrib.gis.db import models +from django.core.urlresolvers import reverse  from django.db.models import Q  from django.db.models.signals import post_save, post_delete  from django.template.defaultfilters import slugify @@ -311,7 +312,7 @@ post_save.connect(post_save_cache, sender=ContainerType)  post_delete.connect(post_save_cache, sender=ContainerType) -class Container(LightHistorizedItem, ImageModel): +class Container(LightHistorizedItem, ImageModel, OwnPerms):      TABLE_COLS = ['reference', 'container_type__label', 'cached_location',                    'cached_division', 'old_reference']      IMAGE_PREFIX = 'containers/' @@ -570,6 +571,20 @@ class Container(LightHistorizedItem, ImageModel):      def set_localisation_9(self, context, value):          return self.set_localisation(8, value) +    def get_extra_actions(self, request): +        """ +        extra actions for the sheet template +        """ +        # url, base_text, icon, extra_text, extra css class, is a quick action +        actions = [] +        can_edit_find = self.can_do(request, 'change_find') +        if can_edit_find: +            actions += [ +                (reverse('container-add-treatment', args=[self.pk]), +                 _(u"Add treatment"), "fa fa-exchange", "", "", False), +            ] +        return actions +      def pre_save(self):          if not self.index:              q = Container.objects.filter(responsible=self.responsible).order_by( diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py index 5dce12ffa..47058a352 100644 --- a/archaeological_warehouse/urls.py +++ b/archaeological_warehouse/urls.py @@ -68,6 +68,11 @@ urlpatterns = [      url(r'warehouse-modify/(?P<pk>.+)/$',          views.warehouse_modify, name='warehouse_modify'), +    url(r'^container-add-treatment/(?P<pk>[0-9-]+)/$', +        check_rights(['change_find', 'change_own_find'])( +            views.container_treatment_add), +        name='container-add-treatment'), +      url(r'^container_search/(?P<step>.+)?$',          check_rights(['view_container', 'view_own_container'])(              views.container_search_wizard), diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py index 0cd68dac6..83fd7f4e1 100644 --- a/archaeological_warehouse/views.py +++ b/archaeological_warehouse/views.py @@ -21,7 +21,7 @@ import json  from django.core.urlresolvers import reverse  from django.db.models import Q -from django.http import HttpResponse +from django.http import HttpResponse, Http404  from django.shortcuts import redirect  from django.utils.translation import ugettext_lazy as _ @@ -35,6 +35,8 @@ from archaeological_warehouse.forms import WarehouseForm, ContainerForm, \  from ishtar_common.forms import FinalForm  from ishtar_common.views_item import get_item, show_item, new_item +from archaeological_finds.views import treatment_add +  from archaeological_warehouse.wizards import PackagingWizard, WarehouseSearch, \      WarehouseWizard, WarehouseModificationWizard, WarehouseDeletionWizard, \      ContainerSearch, ContainerWizard, ContainerModificationWizard, \ @@ -195,6 +197,15 @@ container_deletion_wizard = ContainerDeletionWizard.as_view([      label=_(u"Container deletion"),      url_name='container_deletion',) + +def container_treatment_add(request, pk, current_right=None): +    try: +        container = models.Container.objects.get(pk=pk) +    except models.Container.DoesNotExist: +        raise Http404() +    return treatment_add( +        request, ",".join([str(f.pk) for f in container.finds.all()])) +  """  warehouse_packaging_wizard = ItemSourceWizard.as_view([           ('selec-warehouse_packaging', ItemsSelection), diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 19eb312e1..446afc71e 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -147,36 +147,40 @@ class Wizard(IshtarWizard):                  form, other_check)          return kwargs +    def check_own_permissions(self, request, step, *args, **kwargs): +        # reinit default dispatch of a wizard - not clean... +        self.request = request +        self.session = request.session +        self.prefix = self.get_prefix(request, *args, **kwargs) +        self.storage = get_storage( +            self.storage_name, self.prefix, request, +            getattr(self, 'file_storage', None)) +        self.steps = StepsHelper(self) + +        current_object = self.get_current_object() +        ishtaruser = request.user.ishtaruser \ +            if hasattr(request.user, 'ishtaruser') else None + +        # not the first step and current object is not owned +        if self.steps and self.steps.first != step and current_object: +            is_own = current_object.is_own( +                ishtaruser, alt_query_own=self.alt_is_own_method) +            if not is_own: +                messages.add_message( +                    request, messages.WARNING, +                    _(u"Permission error: you cannot do this action.") +                ) +                self.session_reset(request, self.url_name) +                return +        return True +      def dispatch(self, request, *args, **kwargs):          self.current_right = kwargs.get('current_right', None)          step = kwargs.get('step', None)          # check that the current object is really owned by the current user          if step and self.current_right and '_own_' in self.current_right: - -            # reinit default dispatch of a wizard - not clean... -            self.request = request -            self.session = request.session -            self.prefix = self.get_prefix(request, *args, **kwargs) -            self.storage = get_storage( -                self.storage_name, self.prefix, request, -                getattr(self, 'file_storage', None)) -            self.steps = StepsHelper(self) - -            current_object = self.get_current_object() -            ishtaruser = request.user.ishtaruser \ -                if hasattr(request.user, 'ishtaruser') else None - -            # not the first step and current object is not owned -            if self.steps and self.steps.first != step and current_object: -                is_own = current_object.is_own( -                    ishtaruser, alt_query_own=self.alt_is_own_method) -                if not is_own: -                    messages.add_message( -                        request, messages.WARNING, -                        _(u"Permission error: you cannot do this action.") -                    ) -                    self.session_reset(request, self.url_name) -                    return HttpResponseRedirect('/') +            if not self.check_permissions(request, step, *args, **kwargs): +                return HttpResponseRedirect('/')              # extra filter on forms              self.filter_owns_items = True          else: | 
