22from __future__ import unicode_literals
33
44from django import forms
5+ from django .conf import settings
56from django .contrib .contenttypes .models import ContentType
7+ from django .core .exceptions import ValidationError
68from django .forms .models import formset_factory
79from django .contrib import admin , messages
810from django .contrib .admin import helpers , SimpleListFilter
1416from scheduler .models import RepeatableJob
1517from scheduler .admin import RepeatableJobAdmin
1618
19+ from django_datajsonar .synchronizer import create_or_update_synchro
1720from .views import config_csv
18- from .actions import process_node_register_file_action , confirm_delete
21+ from .actions import process_node_register_file_action
1922from .utils import download_config_csv , generate_stages
2023from .tasks import bulk_whitelist , read_datajson
2124from .models import DatasetIndexingFile , NodeRegisterFile , Node , NodeMetadata , ReadDataJsonTask , Metadata , Synchronizer , Stage
2225from .models import Catalog , Dataset , Distribution , Field , Jurisdiction
23- from .forms import ScheduleJobForm , SynchroForm , StageFormset , StageForm
26+ from .forms import ScheduleJobForm , SynchroForm , StageForm
2427
2528
2629class EnhancedMetaAdmin (GenericTabularInline ):
@@ -346,7 +349,6 @@ def process_register_file(self, _, queryset):
346349
347350
348351class CustomRepeatableJobAdmin (RepeatableJobAdmin ):
349-
350352 actions = ['delete_and_unschedule' ]
351353
352354 def delete_model (self , request , obj ):
@@ -357,6 +359,7 @@ def delete_and_unschedule(self, _, queryset):
357359 for job in queryset :
358360 job .unschedule ()
359361 queryset .delete ()
362+
360363 delete_and_unschedule .short_description = 'Delete and unschedule job'
361364
362365 def get_actions (self , request ):
@@ -366,34 +369,89 @@ def get_actions(self, request):
366369
367370
368371class SynchronizerAdmin (admin .ModelAdmin ):
372+ StageFormset = formset_factory (StageForm , extra = 0 )
369373
370374 def add_view (self , request , form_url = '' , extra_context = None ):
371- synchro_form = SynchroForm ()
375+ return self ._synchro_view (request )
376+
377+ def change_view (self , request , object_id , form_url = '' , extra_context = None ):
378+ synchro = Synchronizer .objects .get (id = object_id )
379+ return self ._synchro_view (request , synchro )
380+
381+ def _synchro_view (self , request , synchro = None ):
382+ if request .method == 'POST' :
383+ return self .post_synchro_edit (request , synchro .id if synchro else None )
384+
385+ if synchro is not None :
386+ synchro_form = SynchroForm ({
387+ 'name' : synchro .name ,
388+ 'frequency' : synchro .frequency ,
389+ 'scheduled_time' : synchro .scheduled_time
390+ })
391+ else :
392+ synchro_form = SynchroForm ()
372393
394+ context = self .add_synchro_context (request , synchro_form , synchro )
395+
396+ return render (request , 'synchronizer.html' , context )
397+
398+ def add_synchro_context (self , request , synchro_form , synchro = None ):
373399 context = {
374- 'title' : 'Define new process' ,
375- 'app_label' : self .model ._meta .app_label ,
376400 'opts' : self .model ._meta ,
377- 'has_change_permission' : self .has_change_permission (request )
401+ 'has_change_permission' : self .has_change_permission (request ),
402+ 'synchro_form' : self .admin_synchro_form (request , synchro_form ),
403+ 'stages_form' : self .get_stages_formset (synchro ),
404+ 'object' : synchro ,
405+ }
406+ return context
407+
408+ def get_stages_formset (self , model = None ):
409+ stages_data = []
410+ next_stage = model .start_stage if model else None
411+ while next_stage is not None :
412+ stages_data .append ({
413+ 'task' : self .get_stage_choice (next_stage .name )
414+ })
415+ next_stage = next_stage .next_stage
416+
417+ if not stages_data :
418+ stages_data .append ({})
419+
420+ return self .StageFormset (initial = stages_data )
421+
422+ def admin_synchro_form (self , request , synchro_form ):
423+ return helpers .AdminForm (synchro_form ,
424+ list ([(None , {'fields' : synchro_form .base_fields })]),
425+ self .get_prepopulated_fields (request ))
426+
427+ def post_synchro_edit (self , request , object_id = None ):
428+ synchro = Synchronizer .objects .get (id = object_id ) if object_id else None
429+ synchro_form = SynchroForm (request .POST )
430+ stages_formset = self .StageFormset (request .POST )
431+
432+ if not stages_formset .is_valid () or not synchro_form .is_valid ():
433+ synchro = Synchronizer .objects .get (id = object_id ) if object_id else None
434+ return render (request , 'synchronizer.html' , self .add_synchro_context (request , synchro_form , synchro ))
435+
436+ synchro_name = synchro_form .cleaned_data ['name' ]
437+ stages = generate_stages (stages_formset .forms , synchro_name )
438+ if not stages :
439+ messages .error (request , "No hay stages definidos" )
440+ return render (request , 'synchronizer.html' , self .add_synchro_context (request , synchro_form , synchro ))
441+
442+ data = {
443+ 'name' : synchro_name ,
444+ 'frequency' : synchro_form .cleaned_data ['frequency' ],
445+ 'scheduled_time' : synchro_form .cleaned_data ['scheduled_time' ],
378446 }
447+ create_or_update_synchro (object_id , stages , data )
379448
380- if request .method == 'POST' :
381- synchro_form = SynchroForm (request .POST )
382- stages_formset = formset_factory (form = StageForm ,
383- formset = StageFormset )(request .POST )
384-
385- if stages_formset .is_valid () and synchro_form .is_valid ():
386- synchro_name = synchro_form .cleaned_data ['name' ]
387- stages = generate_stages (stages_formset .forms , synchro_name )
388- synchro_form .create_synchronizer (start_stage = stages [0 ])
389- return redirect ('admin:django_datajsonar_synchronizer_changelist' )
390-
391- context ['synchro_form' ] = helpers .AdminForm (synchro_form , list ([(None , {'fields' : synchro_form .base_fields })]),
392- self .get_prepopulated_fields (request ))
393- stages_formset = formset_factory (form = StageForm ,
394- formset = StageFormset )()
395- context ['stages_form' ] = stages_formset
396- return render (request , 'synchronizer.html' , context )
449+ return redirect ('admin:django_datajsonar_synchronizer_changelist' )
450+
451+ def get_stage_choice (self , stage_name ):
452+ for name in settings .DATAJSONAR_STAGES .keys ():
453+ if name in stage_name :
454+ return name
397455
398456
399457class EnhancedMetaFilter (SimpleListFilter ):
0 commit comments