diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-06 11:41:54 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-03-06 11:44:44 +0100 | 
| commit | 3808df22596ff03e8b24c9b97506f68c86197c60 (patch) | |
| tree | 87dc15b6b07b78eb8aed52a707c9adab5ae89a9f /archaeological_operations/views.py | |
| parent | 2ebb25f9a93d9b840162ca035c243354a3169a87 (diff) | |
| download | Ishtar-3808df22596ff03e8b24c9b97506f68c86197c60.tar.bz2 Ishtar-3808df22596ff03e8b24c9b97506f68c86197c60.zip | |
Sheet actions: add duplicate for site, operation, document and context record
Diffstat (limited to 'archaeological_operations/views.py')
| -rw-r--r-- | archaeological_operations/views.py | 287 | 
1 files changed, 161 insertions, 126 deletions
| diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 38280ccbf..657ee7b1e 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -28,33 +28,15 @@ from django.shortcuts import render, redirect  from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy  from archaeological_operations import models -from archaeological_operations.forms import ArchaeologicalSiteForm, \ -    OperationFormSelection, OperationFormFileChoice, OperationFormGeneral, \ -    OperationFormModifGeneral, FinalOperationClosingForm, \ -    CollaboratorForm, ArchaeologicalSiteFormSet, OperationFormPreventive, \ -    OperationFormPreventiveDiag, TownFormset, SelectedTownFormset, \ -    SelectedParcelGeneralFormSet, SelectedParcelFormSet, RemainForm, \ -    PeriodForm, RecordRelationsFormSet, OperationFormAbstract, \ -    OperationDeletionForm, SiteFormSelection, \ -    AdministrativeActOpeFormSelection, AdministrativeActOpeForm, \ -    AdministrativeActOpeModifForm, FinalAdministrativeActDeleteForm, \ -    AdministrativeActRegisterFormSelection, DocumentGenerationAdminActForm, \ -    SiteForm, SiteTownFormset, SiteUnderwaterForm, check_underwater_module, \ -    CourtOrderedSeizureForm, SiteSelect, OperationSelect, \ -    QAOperationFormMulti, OperationFormMultiSelection, SiteFormMultiSelection -from archaeological_operations.wizards import has_associated_file, \ -    is_preventive, is_judiciary, OperationWizard, OperationModificationWizard, \ -    OperationClosingWizard, OperationDeletionWizard, SiteSearch, \ -    OperationAdministrativeActWizard, OperationEditAdministrativeActWizard, \ -    AdministrativeActDeletionWizard, SiteWizard, SiteModificationWizard, \ -    SiteDeletionWizard, OperationSearch +from archaeological_operations import forms +from archaeological_operations import wizards  from ishtar_common.forms import ClosingDateFormSelection, FinalForm, \      FinalDeleteForm  from ishtar_common.models import get_current_profile, IshtarSiteProfile, \      DocumentTemplate  from ishtar_common.utils import put_session_message, check_rights_condition  from ishtar_common.views import gen_generate_doc, QAItemEditForm, \ -    QABaseLockView, wizard_is_available +    QABaseLockView, wizard_is_available, QAItemForm  from ishtar_common.views_item import get_item, show_item, revert_item, \      new_qa_item  from ishtar_common.wizards import SearchWizard @@ -108,7 +90,7 @@ def autocomplete_archaeologicalsite(request):  new_archaeologicalsite = new_qa_item(models.ArchaeologicalSite, -                                     ArchaeologicalSiteForm, many=True) +                                     forms.ArchaeologicalSiteForm, many=True)  def autocomplete_operation(request): @@ -159,7 +141,7 @@ def get_available_operation_code(request, year=None):  get_operation = get_item(models.Operation, 'get_operation', 'operation', -                         search_form=OperationSelect) +                         search_form=forms.OperationSelect)  show_operation = show_item(models.Operation, 'operation')  revert_operation = revert_item(models.Operation) @@ -183,28 +165,28 @@ def dashboard_operation(request, *args, **kwargs):      return render(request, 'ishtar/dashboards/dashboard_operation.html', dct) -operation_search_wizard = OperationSearch.as_view( -    [('general-operation_search', OperationFormSelection)], +operation_search_wizard = wizards.OperationSearch.as_view( +    [('general-operation_search', forms.OperationFormSelection)],      label=_(u"Operation search"),      url_name='operation_search',)  wizard_steps = [ -    ('filechoice-operation_creation', OperationFormFileChoice), -    ('general-operation_creation', OperationFormGeneral), -    ('judiciary-operation_creation', CourtOrderedSeizureForm), -    ('collaborators-operation_creation', CollaboratorForm), -    ('archaeologicalsite-operation_creation', ArchaeologicalSiteFormSet), -    ('preventive-operation_creation', OperationFormPreventive), -    ('preventivediag-operation_creation', OperationFormPreventiveDiag), -    ('townsgeneral-operation_creation', TownFormset), -    ('towns-operation_creation', SelectedTownFormset), -    ('parcelsgeneral-operation_creation', SelectedParcelGeneralFormSet), -    ('parcels-operation_creation', SelectedParcelFormSet), -    ('remains-operation_creation', RemainForm), -    ('periods-operation_creation', PeriodForm), -    ('relations-operation_creation', RecordRelationsFormSet), -    ('abstract-operation_creation', OperationFormAbstract), +    ('filechoice-operation_creation', forms.OperationFormFileChoice), +    ('general-operation_creation', forms.OperationFormGeneral), +    ('judiciary-operation_creation', forms.CourtOrderedSeizureForm), +    ('collaborators-operation_creation', forms.CollaboratorForm), +    ('archaeologicalsite-operation_creation', forms.ArchaeologicalSiteFormSet), +    ('preventive-operation_creation', forms.OperationFormPreventive), +    ('preventivediag-operation_creation', forms.OperationFormPreventiveDiag), +    ('townsgeneral-operation_creation', forms.TownFormset), +    ('towns-operation_creation', forms.SelectedTownFormset), +    ('parcelsgeneral-operation_creation', forms.SelectedParcelGeneralFormSet), +    ('parcels-operation_creation', forms.SelectedParcelFormSet), +    ('remains-operation_creation', forms.RemainForm), +    ('periods-operation_creation', forms.PeriodForm), +    ('relations-operation_creation', forms.RecordRelationsFormSet), +    ('abstract-operation_creation', forms.OperationFormAbstract),      ('final-operation_creation', FinalForm)] @@ -224,49 +206,51 @@ check_files_for_operation = get_check_files_for_operation()  ope_crea_condition_dict = {      'filechoice-operation_creation': check_files_for_operation, -    'judiciary-operation_creation': is_judiciary( +    'judiciary-operation_creation': wizards.is_judiciary(          'general-operation_creation', models.OperationType, 'operation_type',      ),      'preventive-operation_creation':      get_check_files_for_operation( -        is_preventive('general-operation_creation', models.OperationType, -                      'operation_type', 'prev_excavation')), +        wizards.is_preventive('general-operation_creation', +                              models.OperationType, 'operation_type', +                              'prev_excavation')),      'preventivediag-operation_creation':      get_check_files_for_operation( -        is_preventive('general-operation_creation', models.OperationType, -                      'operation_type', 'arch_diagnostic')), -    'townsgeneral-operation_creation': has_associated_file( +        wizards.is_preventive('general-operation_creation', +                              models.OperationType, 'operation_type', +                              'arch_diagnostic')), +    'townsgeneral-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation', negate=True), -    'towns-operation_creation': has_associated_file( +    'towns-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation'), -    'parcelsgeneral-operation_creation': has_associated_file( +    'parcelsgeneral-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation', negate=True), -    'parcels-operation_creation': has_associated_file( +    'parcels-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation'),  } -operation_creation_wizard = OperationWizard.as_view( +operation_creation_wizard = wizards.OperationWizard.as_view(      wizard_steps,      label=_(u"New operation"),      condition_dict=ope_crea_condition_dict,      url_name='operation_creation',)  operation_modif_wizard_steps = [ -    ('selec-operation_modification', OperationFormSelection), -    ('general-operation_modification', OperationFormModifGeneral), -    ('judiciary-operation_modification', CourtOrderedSeizureForm), -    ('collaborators-operation_modification', CollaboratorForm), -    ('archaeologicalsite-operation_modification', ArchaeologicalSiteFormSet), -    ('preventive-operation_modification', OperationFormPreventive), -    ('preventivediag-operation_modification', OperationFormPreventiveDiag), -    ('towns-operation_modification', SelectedTownFormset), -    ('townsgeneral-operation_modification', TownFormset), -    ('parcels-operation_modification', SelectedParcelFormSet), -    ('parcelsgeneral-operation_modification', SelectedParcelGeneralFormSet), -    ('remains-operation_modification', RemainForm), -    ('periods-operation_modification', PeriodForm), -    ('relations-operation_modification', RecordRelationsFormSet), -    ('abstract-operation_modification', OperationFormAbstract), +    ('selec-operation_modification', forms.OperationFormSelection), +    ('general-operation_modification', forms.OperationFormModifGeneral), +    ('judiciary-operation_modification', forms.CourtOrderedSeizureForm), +    ('collaborators-operation_modification', forms.CollaboratorForm), +    ('archaeologicalsite-operation_modification', forms.ArchaeologicalSiteFormSet), +    ('preventive-operation_modification', forms.OperationFormPreventive), +    ('preventivediag-operation_modification', forms.OperationFormPreventiveDiag), +    ('towns-operation_modification', forms.SelectedTownFormset), +    ('townsgeneral-operation_modification', forms.TownFormset), +    ('parcels-operation_modification', forms.SelectedParcelFormSet), +    ('parcelsgeneral-operation_modification', forms.SelectedParcelGeneralFormSet), +    ('remains-operation_modification', forms.RemainForm), +    ('periods-operation_modification', forms.PeriodForm), +    ('relations-operation_modification', forms.RecordRelationsFormSet), +    ('abstract-operation_modification', forms.OperationFormAbstract),      ('final-operation_modification', FinalForm)  ] @@ -274,27 +258,29 @@ operation_modif_wizard_steps = [  ope_modif_condition_dict = {      'preventive-operation_modification':      get_check_files_for_operation( -        is_preventive('general-operation_modification', models.OperationType, -                      'operation_type', 'prev_excavation')), +        wizards.is_preventive('general-operation_modification', +                              models.OperationType, 'operation_type', +                              'prev_excavation')),      'preventivediag-operation_modification':      get_check_files_for_operation( -        is_preventive('general-operation_modification', models.OperationType, -                      'operation_type', 'arch_diagnostic')), -    'judiciary-operation_modification': is_judiciary( +        wizards.is_preventive('general-operation_modification', +                              models.OperationType, 'operation_type', +                              'arch_diagnostic')), +    'judiciary-operation_modification': wizards.is_judiciary(          'general-operation_modification', models.OperationType, 'operation_type',      ), -    'townsgeneral-operation_modification': has_associated_file( +    'townsgeneral-operation_modification': wizards.has_associated_file(          'general-operation_modification', negate=True), -    'towns-operation_modification': has_associated_file( +    'towns-operation_modification': wizards.has_associated_file(          'general-operation_modification'), -    'parcelsgeneral-operation_modification': has_associated_file( +    'parcelsgeneral-operation_modification': wizards.has_associated_file(          'general-operation_modification', negate=True), -    'parcels-operation_modification': has_associated_file( +    'parcels-operation_modification': wizards.has_associated_file(          'general-operation_modification'),  } -operation_modification_wizard = OperationModificationWizard.as_view( +operation_modification_wizard = wizards.OperationModificationWizard.as_view(      operation_modif_wizard_steps,      label=_(u"Operation modification"),      condition_dict=ope_modif_condition_dict, @@ -307,7 +293,7 @@ def operation_modify(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_modification' -    OperationModificationWizard.session_set_value( +    wizards.OperationModificationWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'general-' + wizard_url})) @@ -315,29 +301,29 @@ def operation_modify(request, pk):  def operation_add(request, file_id):      operation_creation_wizard(request) -    OperationWizard.session_set_value( +    wizards.OperationWizard.session_set_value(          request, 'filechoice-operation_creation', 'associated_file',          file_id, reset=True)      return redirect(reverse('operation_creation',                              kwargs={'step': 'general-operation_creation'}))  operation_closing_steps = [ -    ('selec-operation_closing', OperationFormSelection), +    ('selec-operation_closing', forms.OperationFormSelection),      ('date-operation_closing', ClosingDateFormSelection), -    ('final-operation_closing', FinalOperationClosingForm)] +    ('final-operation_closing', forms.FinalOperationClosingForm)] -operation_closing_wizard = OperationClosingWizard.as_view( +operation_closing_wizard = wizards.OperationClosingWizard.as_view(      operation_closing_steps,      label=_(u"Operation closing"),      url_name='operation_closing',)  operation_deletion_steps = [ -    ('selec-operation_deletion', OperationFormMultiSelection), -    ('final-operation_deletion', OperationDeletionForm) +    ('selec-operation_deletion', forms.OperationFormMultiSelection), +    ('final-operation_deletion', forms.OperationDeletionForm)  ] -operation_deletion_wizard = OperationDeletionWizard.as_view( +operation_deletion_wizard = wizards.OperationDeletionWizard.as_view(      operation_deletion_steps,      label=_(u"Operation deletion"),      url_name='operation_deletion',) @@ -349,7 +335,7 @@ def operation_delete(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_deletion' -    OperationDeletionWizard.session_set_value( +    wizards.OperationDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'final-' + wizard_url})) @@ -362,43 +348,44 @@ def site_extra_context(request, item):  get_site = get_item(models.ArchaeologicalSite, 'get_site', 'site', -                    search_form=SiteSelect) +                    search_form=forms.SiteSelect)  show_site = show_item(      models.ArchaeologicalSite, 'site',      extra_dct=site_extra_context  )  revert_site = revert_item(models.ArchaeologicalSite) -site_search_wizard = SiteSearch.as_view( -    [('general-site_search', SiteFormSelection)], +site_search_wizard = wizards.SiteSearch.as_view( +    [('general-site_search', forms.SiteFormSelection)],      url_name='site_search',  )  site_creation_steps = [ -    ('general-site_creation', SiteForm), -    ('towns-site_creation', SiteTownFormset), -    ('underwater-site_creation', SiteUnderwaterForm), +    ('general-site_creation', forms.SiteForm), +    ('towns-site_creation', forms.SiteTownFormset), +    ('underwater-site_creation', forms.SiteUnderwaterForm),      ('final-site_creation', FinalForm)  ] -site_creation_wizard = SiteWizard.as_view( +site_creation_wizard = wizards.SiteWizard.as_view(      site_creation_steps, -    condition_dict={'underwater-site_creation': check_underwater_module}, +    condition_dict={'underwater-site_creation': forms.check_underwater_module},      url_name='site_creation',  )  site_modification_steps = [ -    ('selec-site_modification', SiteFormSelection), -    ('general-site_modification', SiteForm), -    ('towns-site_modification', SiteTownFormset), -    ('underwater-site_modification', SiteUnderwaterForm), +    ('selec-site_modification', forms.SiteFormSelection), +    ('general-site_modification', forms.SiteForm), +    ('towns-site_modification', forms.SiteTownFormset), +    ('underwater-site_modification', forms.SiteUnderwaterForm),      ('final-site_modification', FinalForm)  ] -site_modification_wizard = SiteModificationWizard.as_view( +site_modification_wizard = wizards.SiteModificationWizard.as_view(      site_modification_steps, -    condition_dict={'underwater-site_modification': check_underwater_module}, +    condition_dict={ +        'underwater-site_modification': forms.check_underwater_module},      url_name='site_modification',  ) @@ -408,18 +395,18 @@ def site_modify(request, pk):                                 models.ArchaeologicalSite, pk):          return HttpResponseRedirect("/")      wizard_url = 'site_modification' -    SiteModificationWizard.session_set_value( +    wizards.SiteModificationWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'general-' + wizard_url}))  site_deletion_steps = [ -    ('selec-site_deletion', SiteFormMultiSelection), +    ('selec-site_deletion', forms.SiteFormMultiSelection),      ('final-site_deletion', FinalDeleteForm)  ] -site_deletion_wizard = SiteDeletionWizard.as_view( +site_deletion_wizard = wizards.SiteDeletionWizard.as_view(      site_deletion_steps,      label=_(u"Site deletion"),      url_name='site_deletion',) @@ -430,38 +417,38 @@ def site_delete(request, pk):                                 models.ArchaeologicalSite, pk):          return HttpResponseRedirect("/")      wizard_url = 'site_deletion' -    SiteDeletionWizard.session_set_value( +    wizards.SiteDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'final-' + wizard_url})) -operation_administrativeactop_search_wizard = SearchWizard.as_view([ +operation_administrativeactop_search_wizard = wizards.SearchWizard.as_view([      ('general-operation_administrativeactop_search', -     AdministrativeActOpeFormSelection)], +     forms.AdministrativeActOpeFormSelection)],      label=_(u"Administrative act search"),      url_name='operation_administrativeactop_search',)  administrativeactop_steps = [ -    ('selec-operation_administrativeactop', OperationFormSelection), +    ('selec-operation_administrativeactop', forms.OperationFormSelection),      ('administrativeact-operation_administrativeactop', -     AdministrativeActOpeForm), +     forms.AdministrativeActOpeForm),      ('final-operation_administrativeactop', FinalForm)]  operation_administrativeactop_wizard = \ -    OperationAdministrativeActWizard.as_view( +    wizards.OperationAdministrativeActWizard.as_view(          administrativeactop_steps,          label=_(u"Operation: new administrative act"),          url_name='operation_administrativeactop',)  operation_administrativeactop_modification_wizard = \ -    OperationEditAdministrativeActWizard.as_view([ +    wizards.OperationEditAdministrativeActWizard.as_view([          ('selec-operation_administrativeactop_modification', -         AdministrativeActOpeFormSelection), +         forms.AdministrativeActOpeFormSelection),          ('administrativeact-operation_administrativeactop_modification', -         AdministrativeActOpeModifForm), +         forms.AdministrativeActOpeModifForm),          ('final-operation_administrativeactop_modification', FinalForm)], -        label=_(u"Operation: administrative act modification"), +        label=_("Operation: administrative act modification"),          url_name='operation_administrativeactop_modification',) @@ -471,18 +458,18 @@ def operation_administrativeactop_modify(request, pk):              models.AdministrativeAct, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_administrativeactop_modification' -    OperationEditAdministrativeActWizard.session_set_value( +    wizards.OperationEditAdministrativeActWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'administrativeact-' + wizard_url}))  operation_administrativeactop_deletion_wizard = \ -    AdministrativeActDeletionWizard.as_view([ +    wizards.AdministrativeActDeletionWizard.as_view([          ('selec-operation_administrativeactop_deletion', -         AdministrativeActOpeFormSelection), +         forms.AdministrativeActOpeFormSelection),          ('final-operation_administrativeactop_deletion', -         FinalAdministrativeActDeleteForm)], +         forms.FinalAdministrativeActDeleteForm)],          label=_(u"Operation: administrative act deletion"),          url_name='operation_administrativeactop_deletion',) @@ -493,7 +480,7 @@ def operation_administrativeactop_delete(request, pk):              models.AdministrativeAct, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_administrativeactop_deletion' -    AdministrativeActDeletionWizard.session_set_value( +    wizards.AdministrativeActDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) @@ -501,7 +488,7 @@ def operation_administrativeactop_delete(request, pk):  administrativact_register_wizard = SearchWizard.as_view([      ('general-administrativact_register', -     AdministrativeActRegisterFormSelection)], +     forms.AdministrativeActRegisterFormSelection)],      label=pgettext_lazy('admin act register', u"Register"),      url_name='administrativact_register',) @@ -511,7 +498,7 @@ generatedoc_administrativeactop = gen_generate_doc(models.AdministrativeAct)  def administrativeactfile_document(          request, file=False, treatment=False, treatment_file=False): -    search_form = AdministrativeActOpeFormSelection +    search_form = forms.AdministrativeActOpeFormSelection      document_type = 'O'      if file:          from archaeological_files.forms import \ @@ -533,6 +520,7 @@ def administrativeactfile_document(                                   models.AdministrativeAct):          return HttpResponse(content_type='text/plain')      dct = {} +    DocumentGenerationAdminActForm = forms.DocumentGenerationAdminActForm      if request.POST:          dct['search_form'] = search_form(request.POST)          dct['template_form'] = DocumentGenerationAdminActForm( @@ -578,22 +566,22 @@ def administrativeactfile_document(  def reset_wizards(request):      for wizard_class, url_name in ( -            (OperationWizard, 'operation_creation'), -            (OperationModificationWizard, 'operation_modification'), -            (OperationClosingWizard, 'operation_closing'), -            (OperationDeletionWizard, 'operation_deletion_wizard'), -            (OperationAdministrativeActWizard, +            (wizards.OperationWizard, 'operation_creation'), +            (wizards.OperationModificationWizard, 'operation_modification'), +            (wizards.OperationClosingWizard, 'operation_closing'), +            (wizards.OperationDeletionWizard, 'operation_deletion_wizard'), +            (wizards.OperationAdministrativeActWizard,               'operation_administrativeactop'), -            (OperationEditAdministrativeActWizard, +            (wizards.OperationEditAdministrativeActWizard,               'operation_administrativeactop_modification'), -            (AdministrativeActDeletionWizard, +            (wizards.AdministrativeActDeletionWizard,               'operation_administrativeactop_deletion'),):          wizard_class.session_reset(request, url_name)  class QAOperationForm(QAItemEditForm):      model = models.Operation -    form_class = QAOperationFormMulti +    form_class = forms.QAOperationFormMulti  class QAOperationLockView(QABaseLockView): @@ -604,3 +592,50 @@ class QAOperationLockView(QABaseLockView):  class QASiteLockView(QABaseLockView):      model = models.ArchaeologicalSite      base_url = "site-qa-lock" + + +class QAOperationdDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_operation_duplicate.html' +    model = models.Operation +    page_name = _("Duplicate") +    form_class = forms.QAOperationDuplicateForm +    base_url = "operation-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QAOperationdDuplicateFormView, 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(QAOperationdDuplicateFormView, self).get_context_data( +            **kwargs) +        data['action_name'] = _("Duplicate") +        return data + + +class QAArchaeologicalSiteDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_site_duplicate.html' +    model = models.ArchaeologicalSite +    page_name = _("Duplicate") +    form_class = forms.QAArchaeologicalSiteDuplicateForm +    base_url = "site-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QAArchaeologicalSiteDuplicateFormView, +                       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(QAArchaeologicalSiteDuplicateFormView, +                     self).get_context_data(**kwargs) +        data['action_name'] = _("Duplicate") +        return data | 
