diff --git a/apps/abs/models.py b/apps/abs/models.py index 424ad1c..e0a0368 100644 --- a/apps/abs/models.py +++ b/apps/abs/models.py @@ -420,9 +420,10 @@ class ABSConfiguration(Configuration): try: data, address = sock.recvfrom(1024) print (address, data) - + data = data.decode("utf-8") if data == '1': status[int(address[0][10:])-1] = '3' + #print (int(address[0][10:])-1) elif data == '0': status[int(address[0][10:])-1] = '1' except socket.timeout: @@ -477,6 +478,7 @@ class ABSConfiguration(Configuration): print('Inicia intento de salvar device.status') self.device.status = 3 self.module_status = ''.join(status) + #print(status) self.save() print('Estatus salvado') conf_active, __ = ABSActive.objects.get_or_create(pk=1) diff --git a/apps/abs/tasks.py b/apps/abs/tasks.py index a906b5f..a8a355c 100644 --- a/apps/abs/tasks.py +++ b/apps/abs/tasks.py @@ -6,6 +6,9 @@ import json from datetime import timedelta, datetime from celery.task import task +from celery.utils.log import get_task_logger +logger = get_task_logger(__name__) + @task(name='task_change_beam') def task_change_beam(id_conf): @@ -37,12 +40,12 @@ def task_change_beam(id_conf): abs_conf.send_beam_num(i+1) next_beam.set_as_activebeam() task = task_change_beam.apply_async((abs_conf.pk,), eta=date) - print next_beam + print (next_beam) else: abs_conf.send_beam_num(1) beams_list[0].set_as_activebeam() task = task_change_beam.apply_async((abs_conf.pk,), eta=date) - print beams_list[0] + print (beams_list[0]) i=0 else: diff --git a/apps/main/forms.py b/apps/main/forms.py index 2d3c52b..ecb9613 100644 --- a/apps/main/forms.py +++ b/apps/main/forms.py @@ -69,7 +69,7 @@ class CampaignForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(CampaignForm, self).__init__(*args, **kwargs) self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs) - self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs) + self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs) self.fields['description'].widget.attrs = {'rows': 2} if self.instance.pk: @@ -85,10 +85,10 @@ class ExperimentForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(ExperimentForm, self).__init__(*args, **kwargs) self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs) - self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs) + self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs) def save(self, *args, **kwargs): - exp = super(ExperimentForm, self).save(*args, **kwargs) + exp = super(ExperimentForm, self).save(*args, **kwargs) exp.name = exp.name.replace(' ', '') exp.save() return exp @@ -153,7 +153,7 @@ class OperationForm(forms.Form): campaigns = kwargs.pop('campaigns') super(OperationForm, self).__init__(*args, **kwargs) - self.fields['campaign'].label = 'Current Campaigns' + self.fields['campaign'].label = 'Current Campaigns' self.fields['campaign'].choices = add_empty_choice(campaigns.values_list('id', 'name')) @@ -201,6 +201,6 @@ class FilterForm(forms.Form): class ChangeIpForm(forms.Form): ip_address = forms.GenericIPAddressField() - mask = forms.GenericIPAddressField(initial='255.255.255.0') - gateway = forms.GenericIPAddressField(initial='0.0.0.0') - dns = forms.GenericIPAddressField(initial='0.0.0.0') + mask = forms.GenericIPAddressField(initial='255.255.255.0') + gateway = forms.GenericIPAddressField(initial='0.0.0.0') + dns = forms.GenericIPAddressField(initial='0.0.0.0') diff --git a/apps/main/models.py b/apps/main/models.py index 1526c84..3815031 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -132,13 +132,13 @@ class DeviceType(models.Model): class Device(models.Model): - device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE) - location = models.ForeignKey('Location', on_delete=models.CASCADE) - ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0') + device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE) + location = models.ForeignKey('Location', on_delete=models.CASCADE) + ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0') port_address = models.PositiveSmallIntegerField(default=2000) - description = models.TextField(blank=True, null=True) - status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES) - conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration') + description = models.TextField(blank=True, null=True) + status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES) + conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration') class Meta: db_table = 'db_devices' @@ -209,10 +209,10 @@ class Device(models.Model): headers = {'content-type': "application/json", 'cache-control': "no-cache"} - ip = [int(x) for x in ip_address.split('.')] - dns = [int(x) for x in dns.split('.')] + ip = [int(x) for x in ip_address.split('.')] + dns = [int(x) for x in dns.split('.')] gateway = [int(x) for x in gateway.split('.')] - subnet = [int(x) for x in mask.split('.')] + subnet = [int(x) for x in mask.split('.')] payload = { "ip": ip, @@ -225,7 +225,7 @@ class Device(models.Model): try: answer = req.json() if answer['changeip']=='ok': - self.message = '25|IP succesfully changed' + self.message = '25|IP succesfully changed' self.ip_address = ip_address self.save() else: @@ -241,14 +241,14 @@ class Device(models.Model): class Campaign(models.Model): - template = models.BooleanField(default=False) - name = models.CharField(max_length=60, unique=True) - start_date = models.DateTimeField(blank=True, null=True) - end_date = models.DateTimeField(blank=True, null=True) - tags = models.CharField(max_length=40, blank=True, null=True) + template = models.BooleanField(default=False) + name = models.CharField(max_length=60, unique=True) + start_date = models.DateTimeField(blank=True, null=True) + end_date = models.DateTimeField(blank=True, null=True) + tags = models.CharField(max_length=40, blank=True, null=True) description = models.TextField(blank=True, null=True) experiments = models.ManyToManyField('Experiment', blank=True) - author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) + author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) class Meta: db_table = 'db_campaigns' @@ -272,7 +272,7 @@ class Campaign(models.Model): data[field.name] = field.value_from_object(self) data['start_date'] = data['start_date'].strftime('%Y-%m-%d') - data['end_date'] = data['end_date'].strftime('%Y-%m-%d') + data['end_date'] = data['end_date'].strftime('%Y-%m-%d') return data @@ -311,10 +311,10 @@ class Campaign(models.Model): camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]] - self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d')) + self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d')) self.start_date = camp_parms['start_date'] - self.end_date = camp_parms['end_date'] - self.tags = camp_parms['tags'] + self.end_date = camp_parms['end_date'] + self.tags = camp_parms['tags'] self.save() return self @@ -329,8 +329,8 @@ class Campaign(models.Model): for loc in locations: dum = {} - dum['name'] = loc.name - dum['id'] = loc.pk + dum['name'] = loc.name + dum['id'] = loc.pk dum['experiments'] = [e for e in self.experiments.all() if e.location==loc] ret.append(dum) @@ -353,23 +353,23 @@ class Campaign(models.Model): class RunningExperiment(models.Model): - radar = models.OneToOneField('Location', on_delete=models.CASCADE) + radar = models.OneToOneField('Location', on_delete=models.CASCADE) running_experiment = models.ManyToManyField('Experiment', blank = True) - status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES) + status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES) class Experiment(models.Model): - template = models.BooleanField(default=False) - name = models.CharField(max_length=40, default='', unique=True) - location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE) - freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200) + template = models.BooleanField(default=False) + name = models.CharField(max_length=40, default='', unique=True) + location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE) + freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200) start_time = models.TimeField(default='00:00:00') - end_time = models.TimeField(default='23:59:59') - task = models.CharField(max_length=36, default='', blank=True, null=True) - status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES) - author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) - hash = models.CharField(default='', max_length=64, null=True, blank=True) + end_time = models.TimeField(default='23:59:59') + task = models.CharField(max_length=36, default='', blank=True, null=True) + status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES) + author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) + hash = models.CharField(default='', max_length=64, null=True, blank=True) class Meta: db_table = 'db_experiments' @@ -393,8 +393,8 @@ class Experiment(models.Model): data[field.name] = field.value_from_object(self) data['start_time'] = data['start_time'].strftime('%H:%M:%S') - data['end_time'] = data['end_time'].strftime('%H:%M:%S') - data['location'] = self.location.name + data['end_time'] = data['end_time'].strftime('%H:%M:%S') + data['location'] = self.location.name data['configurations'] = ['{}'.format(conf.pk) for conf in Configuration.objects.filter(experiment=self, type=0)] @@ -427,7 +427,7 @@ class Experiment(models.Model): confs = [] allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence') - rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix] + rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix] if rc_mix: for conf in allconfs: if conf.device.device_type.name == 'rc' and not conf.mix: @@ -456,7 +456,7 @@ class Experiment(models.Model): ''' confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence') - confs=confs.exclude(device__device_type__name='cgs') + confs = confs.exclude(device__device_type__name='cgs') try: for conf in confs: conf.stop_device() @@ -529,8 +529,8 @@ class Experiment(models.Model): for id_conf in exp_parms['configurations']: conf_parms = parms['configurations']['byId'][id_conf] - device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0] - model = CONF_MODELS[conf_parms['device_type']] + device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0] + model = CONF_MODELS[conf_parms['device_type']] conf = model( experiment = self, device = device, @@ -540,9 +540,9 @@ class Experiment(models.Model): location, created = Location.objects.get_or_create(name=exp_parms['location']) self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d')) - self.location = location + self.location = location self.start_time = exp_parms['start_time'] - self.end_time = exp_parms['end_time'] + self.end_time = exp_parms['end_time'] self.save() return self @@ -571,17 +571,17 @@ class Experiment(models.Model): class Configuration(PolymorphicModel): - template = models.BooleanField(default=False) - # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='') - device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE) - label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True) - experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE) - type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES) - created_date = models.DateTimeField(auto_now_add=True) + template = models.BooleanField(default=False) + # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='') + device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE) + label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True) + experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE) + type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES) + created_date = models.DateTimeField(auto_now_add=True) programmed_date = models.DateTimeField(auto_now=True) - parameters = models.TextField(default='{}') - author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) - hash = models.CharField(default='', max_length=64, null=True, blank=True) + parameters = models.TextField(default='{}') + author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE) + hash = models.CharField(default='', max_length=64, null=True, blank=True) message = "" class Meta: diff --git a/apps/main/tasks.py b/apps/main/tasks.py index e7d0e99..0ee12bf 100644 --- a/apps/main/tasks.py +++ b/apps/main/tasks.py @@ -5,18 +5,28 @@ from celery import task from datetime import timedelta, datetime from .models import Experiment +from celery import Celery + +from celery.utils.log import get_task_logger + +from django.utils import timezone + +logger = get_task_logger(__name__) @task def task_start(id_exp): - exp = Experiment.objects.get(pk=id_exp) + exp = Experiment.objects.get(pk=id_exp) status = exp.status if exp.status == 2: print('Experiment {} already running start task not executed'.format(exp)) return 2 if status == 3: - now = datetime.now() + now = datetime.now() start = datetime.combine(now.date(), exp.start_time) - end = datetime.combine(now.date(), exp.end_time) + end = datetime.combine(now.date(), exp.end_time) + print(now) + print(start) + print(end) if end < start: end += timedelta(1) try: @@ -26,7 +36,7 @@ def task_start(id_exp): print('Error') exp.status = 0 if exp.status == 2: - task = task_stop.apply_async((id_exp,), eta=end+timedelta(hours=5)) + task = task_stop.apply_async((id_exp,),eta=end) #Antiguo eta=end+timedelta(hours=5)) exp.task = task.id exp.save() return exp.status @@ -42,10 +52,10 @@ def task_stop(id_exp): print('Error') exp.status = 0 - now = datetime.now() - start = datetime.combine(now.date()+timedelta(1), exp.start_time) - task = task_start.apply_async((id_exp, ), eta=start+timedelta(hours=5)) - exp.task = task.id + now = datetime.now() + start = datetime.combine(now.date()+timedelta(1), exp.start_time) + task = task_start.apply_async((id_exp, ), eta=start) #Antiguo eta=start+timedelta(hours=5)) + exp.task = task.id exp.status = 3 exp.save() return exp.status @@ -53,12 +63,12 @@ def task_stop(id_exp): #Task to get status @task def task_status(id_exp): - + print ("task status"+str(id_exp)) exp = Experiment.objects.get(pk=id_exp) if exp.status==2: run_every = timedelta(minutes=1) - now = datetime.utcnow() - date = now + run_every + now = datetime.utcnow() + date = now + run_every task_status.apply_async((id_exp,), eta=date) print ("Monitoring...") exp.get_status() diff --git a/apps/main/urls.py b/apps/main/urls.py index 844b0f8..5539aa4 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -46,6 +46,7 @@ urlpatterns = ( path('experiment//new_dev_conf/', views.dev_conf_new, name='url_add_dev_conf'), path('experiment//new_dev_conf//', views.dev_conf_new, name='url_add_dev_conf'), + path('dev_conf/', views.dev_confs, name='url_dev_confs'), path('dev_conf//', views.dev_conf, name='url_dev_conf'), path('dev_conf//edit/', views.dev_conf_edit, name='url_edit_dev_conf'), diff --git a/apps/main/views.py b/apps/main/views.py index e2038a9..c2b8bc8 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -13,6 +13,8 @@ from django.contrib import messages from django.http.request import QueryDict from django.contrib.auth.decorators import login_required, user_passes_test +from django.utils.timezone import is_aware + try: from urllib.parse import urlencode except ImportError: @@ -21,8 +23,6 @@ except ImportError: from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm from .forms import OperationSearchForm, FilterForm, ChangeIpForm -from .tasks import task_start - from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm from apps.dds.forms import DDSConfigurationForm from apps.jars.forms import JARSConfigurationForm @@ -32,18 +32,19 @@ from apps.usrp.forms import USRPConfigurationForm from apps.dds_rest.forms import DDSRestConfigurationForm from .utils import Params -from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES -from apps.cgs.models import CGSConfiguration -from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE -from apps.usrp.models import USRPConfiguration -from apps.abs.models import ABSConfiguration -from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock -from apps.dds.models import DDSConfiguration +from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES +from apps.cgs.models import CGSConfiguration +from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE +from apps.usrp.models import USRPConfiguration +from apps.abs.models import ABSConfiguration +from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock +from apps.dds.models import DDSConfiguration from apps.dds_rest.models import DDSRestConfiguration +from .tasks import task_start from radarsys.celery import app - +#comentario test CONF_FORMS = { 'rc': RCConfigurationForm, 'dds': DDSConfigurationForm, @@ -442,9 +443,9 @@ def campaign_new(request): campaign.save() return redirect('url_campaign', id_camp=campaign.id) - kwargs['form'] = form - kwargs['title'] = 'Campaign' - kwargs['suptitle'] = 'New' + kwargs['form'] = form + kwargs['title'] = 'Campaign' + kwargs['suptitle'] = 'New' kwargs['menu_campaigns'] = 'active' return render(request, 'campaign_edit.html', kwargs) @@ -459,11 +460,11 @@ def campaign_edit(request, id_camp): form = CampaignForm(instance=campaign) if request.method == 'POST': - exps = campaign.experiments.all().values_list('pk', flat=True) - post = request.POST.copy() + exps = campaign.experiments.all().values_list('pk', flat=True) + post = request.POST.copy() new_exps = post.getlist('experiments') post.setlist('experiments', []) - form = CampaignForm(post, instance=campaign) + form = CampaignForm(post, instance=campaign) if form.is_valid(): camp = form.save() @@ -482,11 +483,11 @@ def campaign_edit(request, id_camp): return redirect('url_campaign', id_camp=id_camp) - kwargs = {} - kwargs['form'] = form - kwargs['title'] = 'Campaign' - kwargs['suptitle'] = 'Edit' - kwargs['button'] = 'Update' + kwargs = {} + kwargs['form'] = form + kwargs['title'] = 'Campaign' + kwargs['suptitle'] = 'Edit' + kwargs['button'] = 'Update' kwargs['menu_campaigns'] = 'active' return render(request, 'campaign_edit.html', kwargs) @@ -694,11 +695,11 @@ def experiment_edit(request, id_exp): experiment = form.save() return redirect('url_experiment', id_exp=experiment.id) - kwargs = {} - kwargs['form'] = form - kwargs['title'] = 'Experiment' - kwargs['suptitle'] = 'Edit' - kwargs['button'] = 'Update' + kwargs = {} + kwargs['form'] = form + kwargs['title'] = 'Experiment' + kwargs['suptitle'] = 'Edit' + kwargs['button'] = 'Update' kwargs['menu_experiments'] = 'active' return render(request, 'experiment_edit.html', kwargs) @@ -1790,12 +1791,24 @@ def operation(request, id_camp=None): @login_required def radar_start(request, id_camp, id_radar): - campaign = get_object_or_404(Campaign, pk=id_camp) + campaign = get_object_or_404(Campaign, pk=id_camp) experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments'] - now = datetime.now() + now = datetime.now() + for exp in experiments: + #app.control.revoke(exp.task) + print(exp.status) start = datetime.combine(datetime.now().date(), exp.start_time) - end = datetime.combine(datetime.now().date(), exp.end_time) + end = datetime.combine(datetime.now().date(), exp.end_time) + print(exp.start_time) + print(exp.end_time) + + print(start) + print(end) + print(is_aware(start)) + print(campaign.start_date) + print(campaign.end_date) + print(is_aware(campaign.start_date)) if end < start: end += timedelta(1) @@ -1814,8 +1827,9 @@ def radar_start(request, id_camp, id_radar): continue app.control.revoke(exp.task) - + print("Llego luego del revoke") if now > start and now <= end: + print("Caso now >start and end") + task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5)) + exp.task = task.id exp.status = 3 - messages.success( - request, 'Experiment {} programmed to start at {}'.format(exp, start)) + messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start)) exp.save() @@ -1838,14 +1851,18 @@ def radar_start(request, id_camp, id_radar): @login_required def radar_stop(request, id_camp, id_radar): - campaign = get_object_or_404(Campaign, pk=id_camp) + campaign = get_object_or_404(Campaign, pk=id_camp) experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments'] - + print("Ingreso en stop radar_stop") for exp in experiments: if exp.task: + print("Ingreso antes de revoke stop") app.control.revoke(exp.task) - if exp.status == 2: + + + if exp.status == 2: #status 2 es started + print("llama a exp.stop") exp.stop() messages.warning(request, 'Experiment {} stopped'.format(exp)) exp.status = 1 @@ -1857,12 +1874,15 @@ def radar_stop(request, id_camp, id_radar): @login_required def radar_refresh(request, id_camp, id_radar): - campaign = get_object_or_404(Campaign, pk=id_camp) + campaign = get_object_or_404(Campaign, pk=id_camp) experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments'] - i = app.control.inspect() - scheduled = i.scheduled().values()[0] - revoked = i.revoked().values()[0] + i = app.control.inspect() + print(i) + print(i.scheduled()) + print(i.scheduled().values()) + scheduled = list(i.scheduled().values())[0] + revoked = list(i.revoked().values())[0] for exp in experiments: if exp.task in revoked: @@ -1879,16 +1899,16 @@ def radar_refresh(request, id_camp, id_radar): @login_required def revoke_tasks(request, id_camp): - i = app.control.inspect() - scheduled = i.scheduled().values()[0] - revoked = i.revoked().values()[0] + i = app.control.inspect() + scheduled = list(i.scheduled().values())[0] + revoked = list(i.revoked().values())[0] for t in scheduled: if t['request']['id'] in revoked: continue app.control.revoke(t['request']['id']) - exp = Experiment.objects.get(pk=eval(t['request']['args'])[0]) - eta = t['eta'] + exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0]) + eta = t['eta'] task = t['request']['name'].split('.')[-1] messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name)) @@ -1897,14 +1917,14 @@ def revoke_tasks(request, id_camp): @login_required def show_tasks(request, id_camp): - i = app.control.inspect() - scheduled = i.scheduled().values()[0] - revoked = i.revoked().values()[0] + i = app.control.inspect() + scheduled = list(i.scheduled().values())[0] + revoked = list(i.revoked().values())[0] for t in scheduled: if t['request']['id'] in revoked: continue - exp = Experiment.objects.get(pk=eval(t['request']['args'])[0]) + exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0]) eta = t['eta'] task = t['request']['name'].split('.')[-1] messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name)) diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..7e3769a24a7658e36066502676e55187947618e9 GIT binary patch literal 1834 zc$|%u&2QX97{QiS*ykOHE38>CW{QV#ym=zXkrp5OD1FHN4F znuZWMn>!P&!W1m(q(&OJfgs#`YHLY`S$f;stoT{j(RU`#{?y#u(Mz=g9o@NY{Av7N zEfkM57vhfWHDnm6Flse?-PXxUqZ=w2FBgtiN2()ROWx_p=?gO#-vr~AFVCEve*MwP zp{IM1@E5dd=HJoF-sGfV7%;zzhVi_sBxKZefN)$2C~*nknkpa#7Y?M3@&ow7e#D@Q znd4y8polIi}hl|7Cdl$LI4Z`4k)EA za3ykpA~4Vn;{pq^y^@OnGB@yn!1;~h2iwTyL`nzcTk{Hv!YL^m15CXom^KLn1fJ;Py4LN5FbDLxS7^OoMBa#8-I1*6Cat1VK zz$Mcf3MI7tm~MquiZBrXKM;AhT-$(iN&w9P*&0ISyN_|m@okN`PykZp=Jiwq*H!{> zhLIx>qL`CEzIf-YrNu&?4|_`oGLbIixy%Icsl-Y$3pIhAZ1PYzQC>!<`wT1<9fep)^=J-WV)&1 zNSkL4TNq*p5C+JZL3|9eF+v-haGODs7p<-^JEg1{s<{(&33KE=2F!I?9yyf{fo~(g ze1~8uIVw7md9*YzqL1rOa-lM?!CEWV{+_$S|C+M9r+%IIs6M-D$ylunY`cn5{Py%x zOB0w*olC=O_)IDfojpH)4QKC8-H2NM)^eMUN0sWfxsN#-3ZgvvWw|1Wj} zbfp114^+~5q2eVIZAIYAVxBW|X!s#KcLq6Ql#OAY7whG2m}u`-zfo=_aj$E_{_b+3 zvm~6W8_>M4V{n|d!%mo)rZKxd>Q#*E=HYS@$60gzlR63-whE6pr6XZKlz*@3hP1e!_-h;5I4wL5?m1Vq_(;6Uj(;=}&U@=CK4t5cT@ zY~IXcQ4FKNd(BuK{k-7MTjxE~u;#ug#=XqCRctP3zh2CT-#lel>)#vU=q@AkM#k?< zj2q3LOW#(cNHwG0#D<{@nUKHi`e(jJzaDxd-=i0+5AtoTdA|4RdQz~i-|v4me}C`t HrF(w?MVlQ5 literal 0 Hc$@