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: |