##// END OF EJS Templates
experiment menu edition
amorales -
r358:7dca11c69628
parent child
Show More
@@ -0,0 +1,4
1 On branch master
2 Your branch is up to date with 'origin/master'.
3
4 nothing to commit, working tree clean
@@ -1,177 +1,177
1 from django import forms
1 from django import forms
2 from django.utils.safestring import mark_safe
2 from django.utils.safestring import mark_safe
3 from apps.main.models import Device, Experiment, Campaign, Location, Configuration
3 from apps.main.models import Device, Experiment, Campaign, Location, Configuration
4 from django.template.defaultfilters import default
4 from django.template.defaultfilters import default
5
5
6 FILE_FORMAT = (
6 FILE_FORMAT = (
7 ('json', 'json'),
7 ('json', 'json'),
8 )
8 )
9
9
10 def add_empty_choice(choices, pos=0, label='-----'):
10 def add_empty_choice(choices, pos=0, label='-----'):
11 if len(choices)>0:
11 if len(choices)>0:
12 choices = list(choices)
12 choices = list(choices)
13 choices.insert(0, (0, label))
13 choices.insert(0, (0, label))
14 return choices
14 return choices
15 else:
15 else:
16 return [(0, label)]
16 return [(0, label)]
17
17
18 class DatepickerWidget(forms.widgets.TextInput):
18 class DatepickerWidget(forms.widgets.TextInput):
19 def render(self, name, value, attrs=None, renderer=None):
19 def render(self, name, value, attrs=None, renderer=None):
20 input_html = super(DatepickerWidget, self).render(name, value, attrs)
20 input_html = super(DatepickerWidget, self).render(name, value, attrs)
21
21
22 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="far fa-calendar-alt"></i></span></div>'
22 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="far fa-calendar-alt"></i></span></div>'
23 return mark_safe(html)
23 return mark_safe(html)
24
24
25 class DateRangepickerWidget(forms.widgets.TextInput):
25 class DateRangepickerWidget(forms.widgets.TextInput):
26 def render(self, name, value, attrs=None, renderer=None):
26 def render(self, name, value, attrs=None, renderer=None):
27 start = attrs['start_date']
27 start = attrs['start_date']
28 end = attrs['end_date']
28 end = attrs['end_date']
29 html = '''<div class="col-md-6 input-group date" style="float:inherit">
29 html = '''<div class="col-md-6 input-group date" style="float:inherit">
30 <input class="form-control" id="id_start_date" name="start_date" placeholder="Start" title="" type="text" value="{}">
30 <input class="form-control" id="id_start_date" name="start_date" placeholder="Start" title="" type="text" value="{}">
31 <span class="input-group-addon"><i class="far fa-calendar-alt"></i></span>
31 <span class="input-group-addon"><i class="far fa-calendar-alt"></i></span>
32 </div>
32 </div>
33 <div class="col-md-6 input-group date" style="float:inherit">
33 <div class="col-md-6 input-group date" style="float:inherit">
34 <input class="form-control" id="id_end_date" name="end_date" placeholder="End" title="" type="text" value="{}">
34 <input class="form-control" id="id_end_date" name="end_date" placeholder="End" title="" type="text" value="{}">
35 <span class="input-group-addon"><i class="far fa-calendar-alt"></i></span>
35 <span class="input-group-addon"><i class="far fa-calendar-alt"></i></span>
36 </div>'''.format(start, end)
36 </div>'''.format(start, end)
37 return mark_safe(html)
37 return mark_safe(html)
38
38
39 class TimepickerWidget(forms.widgets.TextInput):
39 class TimepickerWidget(forms.widgets.TextInput):
40 def render(self, name, value, attrs=None, renderer=None):
40 def render(self, name, value, attrs=None, renderer=None):
41 input_html = super(TimepickerWidget, self).render(name, value, attrs)
41 input_html = super(TimepickerWidget, self).render(name, value, attrs)
42
42
43 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="far fa-clock"></i></span></div>'
43 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="far fa-clock"></i></span></div>'
44 return mark_safe(html)
44 return mark_safe(html)
45
45
46 class CampaignForm(forms.ModelForm):
46 class CampaignForm(forms.ModelForm):
47
47
48 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
48 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
49 queryset=Experiment.objects.filter(template=True),
49 queryset=Experiment.objects.filter(template=True),
50 required=False)
50 required=False)
51
51
52 def __init__(self, *args, **kwargs):
52 def __init__(self, *args, **kwargs):
53 super(CampaignForm, self).__init__(*args, **kwargs)
53 super(CampaignForm, self).__init__(*args, **kwargs)
54 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
54 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
55 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
55 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
56 self.fields['description'].widget.attrs = {'rows': 2}
56 self.fields['description'].widget.attrs = {'rows': 2}
57
57
58 if self.instance.pk:
58 if self.instance.pk:
59 self.fields['experiments'].queryset |= self.instance.experiments.all()
59 self.fields['experiments'].queryset |= self.instance.experiments.all()
60
60
61 class Meta:
61 class Meta:
62 model = Campaign
62 model = Campaign
63 exclude = ['author']
63 exclude = ['author']
64
64
65
65
66 class ExperimentForm(forms.ModelForm):
66 class ExperimentForm(forms.ModelForm):
67
67
68 def __init__(self, *args, **kwargs):
68 def __init__(self, *args, **kwargs):
69 super(ExperimentForm, self).__init__(*args, **kwargs)
69 super(ExperimentForm, self).__init__(*args, **kwargs)
70 self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
70 #self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
71 self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
71 #self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
72
72
73 def save(self, *args, **kwargs):
73 def save(self, *args, **kwargs):
74 exp = super(ExperimentForm, self).save(*args, **kwargs)
74 exp = super(ExperimentForm, self).save(*args, **kwargs)
75 exp.name = exp.name.replace(' ', '')
75 exp.name = exp.name.replace(' ', '')
76 exp.save()
76 exp.save()
77 return exp
77 return exp
78
78
79 class Meta:
79 class Meta:
80 model = Experiment
80 model = Experiment
81 exclude = ['task', 'status', 'author', 'hash']
81 exclude = ['task', 'status', 'author', 'hash']
82
82
83 class LocationForm(forms.ModelForm):
83 class LocationForm(forms.ModelForm):
84 class Meta:
84 class Meta:
85 model = Location
85 model = Location
86 exclude = ['']
86 exclude = ['']
87
87
88 class DeviceForm(forms.ModelForm):
88 class DeviceForm(forms.ModelForm):
89 class Meta:
89 class Meta:
90 model = Device
90 model = Device
91 exclude = ['status']
91 exclude = ['status']
92
92
93 class ConfigurationForm(forms.ModelForm):
93 class ConfigurationForm(forms.ModelForm):
94
94
95 def __init__(self, *args, **kwargs):
95 def __init__(self, *args, **kwargs):
96 super(ConfigurationForm, self).__init__(*args, **kwargs)
96 super(ConfigurationForm, self).__init__(*args, **kwargs)
97
97
98 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
98 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
99 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
99 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
100
100
101 class Meta:
101 class Meta:
102 model = Configuration
102 model = Configuration
103 exclude = ['type', 'created_date', 'programmed_date', 'parameters', 'author', 'hash']
103 exclude = ['type', 'created_date', 'programmed_date', 'parameters', 'author', 'hash']
104
104
105 class UploadFileForm(forms.Form):
105 class UploadFileForm(forms.Form):
106
106
107 file = forms.FileField()
107 file = forms.FileField()
108
108
109 class DownloadFileForm(forms.Form):
109 class DownloadFileForm(forms.Form):
110
110
111 format = forms.ChoiceField(choices= ((0, 'json'),) )
111 format = forms.ChoiceField(choices= ((0, 'json'),) )
112
112
113 def __init__(self, device_type, *args, **kwargs):
113 def __init__(self, device_type, *args, **kwargs):
114
114
115 super(DownloadFileForm, self).__init__(*args, **kwargs)
115 super(DownloadFileForm, self).__init__(*args, **kwargs)
116
116
117 self.fields['format'].choices = FILE_FORMAT
117 self.fields['format'].choices = FILE_FORMAT
118
118
119 class OperationForm(forms.Form):
119 class OperationForm(forms.Form):
120
120
121 campaign = forms.ChoiceField(label="Campaign")
121 campaign = forms.ChoiceField(label="Campaign")
122
122
123 def __init__(self, *args, **kwargs):
123 def __init__(self, *args, **kwargs):
124
124
125 campaigns = kwargs.pop('campaigns')
125 campaigns = kwargs.pop('campaigns')
126 super(OperationForm, self).__init__(*args, **kwargs)
126 super(OperationForm, self).__init__(*args, **kwargs)
127 self.fields['campaign'].label = 'Current Campaigns'
127 self.fields['campaign'].label = 'Current Campaigns'
128 self.fields['campaign'].choices = add_empty_choice(campaigns.values_list('id', 'name'))
128 self.fields['campaign'].choices = add_empty_choice(campaigns.values_list('id', 'name'))
129
129
130
130
131 class OperationSearchForm(forms.Form):
131 class OperationSearchForm(forms.Form):
132 # -----ALL Campaigns------
132 # -----ALL Campaigns------
133 campaign = forms.ChoiceField(label="Campaign")
133 campaign = forms.ChoiceField(label="Campaign")
134
134
135 def __init__(self, *args, **kwargs):
135 def __init__(self, *args, **kwargs):
136 super(OperationSearchForm, self).__init__(*args, **kwargs)
136 super(OperationSearchForm, self).__init__(*args, **kwargs)
137 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
137 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
138
138
139
139
140 class NewForm(forms.Form):
140 class NewForm(forms.Form):
141
141
142 create_from = forms.ChoiceField(choices=((0, '-----'),
142 create_from = forms.ChoiceField(choices=((0, '-----'),
143 (1, 'Empty (blank)'),
143 (1, 'Empty (blank)'),
144 (2, 'Template')))
144 (2, 'Template')))
145 choose_template = forms.ChoiceField()
145 choose_template = forms.ChoiceField()
146
146
147 def __init__(self, *args, **kwargs):
147 def __init__(self, *args, **kwargs):
148
148
149 template_choices = kwargs.pop('template_choices', [])
149 template_choices = kwargs.pop('template_choices', [])
150 super(NewForm, self).__init__(*args, **kwargs)
150 super(NewForm, self).__init__(*args, **kwargs)
151 self.fields['choose_template'].choices = add_empty_choice(template_choices)
151 self.fields['choose_template'].choices = add_empty_choice(template_choices)
152
152
153
153
154 class FilterForm(forms.Form):
154 class FilterForm(forms.Form):
155
155
156 def __init__(self, *args, **kwargs):
156 def __init__(self, *args, **kwargs):
157 extra_fields = kwargs.pop('extra_fields', [])
157 extra_fields = kwargs.pop('extra_fields', [])
158 super(FilterForm, self).__init__(*args, **kwargs)
158 super(FilterForm, self).__init__(*args, **kwargs)
159
159
160 for field in extra_fields:
160 for field in extra_fields:
161 if 'range_date' in field:
161 if 'range_date' in field:
162 self.fields[field] = forms.CharField(required=False)
162 self.fields[field] = forms.CharField(required=False)
163 self.fields[field].widget = DateRangepickerWidget()
163 self.fields[field].widget = DateRangepickerWidget()
164 if 'initial' in kwargs:
164 if 'initial' in kwargs:
165 self.fields[field].widget.attrs = {'start_date':kwargs['initial'].get('start_date', ''),
165 self.fields[field].widget.attrs = {'start_date':kwargs['initial'].get('start_date', ''),
166 'end_date':kwargs['initial'].get('end_date', '')}
166 'end_date':kwargs['initial'].get('end_date', '')}
167 elif field in ('template', 'historical') or 'my ' in field:
167 elif field in ('template', 'historical') or 'my ' in field:
168 self.fields[field] = forms.BooleanField(required=False)
168 self.fields[field] = forms.BooleanField(required=False)
169 else:
169 else:
170 self.fields[field] = forms.CharField(required=False)
170 self.fields[field] = forms.CharField(required=False)
171
171
172 class ChangeIpForm(forms.Form):
172 class ChangeIpForm(forms.Form):
173
173
174 ip_address = forms.GenericIPAddressField()
174 ip_address = forms.GenericIPAddressField()
175 mask = forms.GenericIPAddressField(initial='255.255.255.0')
175 mask = forms.GenericIPAddressField(initial='255.255.255.0')
176 gateway = forms.GenericIPAddressField(initial='0.0.0.0')
176 gateway = forms.GenericIPAddressField(initial='0.0.0.0')
177 dns = forms.GenericIPAddressField(initial='0.0.0.0')
177 dns = forms.GenericIPAddressField(initial='0.0.0.0')
@@ -1,733 +1,733
1
1
2 import os
2 import os
3 import json
3 import json
4 import requests
4 import requests
5 import time
5 import time
6 from datetime import datetime
6 from datetime import datetime
7
7
8 try:
8 try:
9 from polymorphic.models import PolymorphicModel
9 from polymorphic.models import PolymorphicModel
10 except:
10 except:
11 from polymorphic import PolymorphicModel
11 from polymorphic import PolymorphicModel
12
12
13 from django.template.base import kwarg_re
13 from django.template.base import kwarg_re
14 from django.db import models
14 from django.db import models
15 from django.urls import reverse
15 from django.urls import reverse
16 from django.core.validators import MinValueValidator, MaxValueValidator
16 from django.core.validators import MinValueValidator, MaxValueValidator
17 from django.shortcuts import get_object_or_404
17 from django.shortcuts import get_object_or_404
18 from django.contrib.auth.models import User
18 from django.contrib.auth.models import User
19 from django.db.models.signals import post_save
19 from django.db.models.signals import post_save
20 from django.dispatch import receiver
20 from django.dispatch import receiver
21
21
22 from apps.main.utils import Params
22 from apps.main.utils import Params
23
23
24
25 DEV_PORTS = {
24 DEV_PORTS = {
26 'pedestal' : 80,
25 'pedestal' : 80,
27 'pedestal_dev' : 80,
26 'pedestal_dev' : 80,
28 'generator' : 80,
27 'generator' : 80,
29 'usrp_rx' : 2000,
28 'usrp_rx' : 2000,
30 'usrp_tx' : 2000,
29 'usrp_tx' : 2000,
31 }
30 }
32
31
33 RADAR_STATES = (
32 RADAR_STATES = (
34 (0, 'No connected'),
33 (0, 'No connected'),
35 (1, 'Connected'),
34 (1, 'Connected'),
36 (2, 'Configured'),
35 (2, 'Configured'),
37 (3, 'Running'),
36 (3, 'Running'),
38 (4, 'Scheduled'),
37 (4, 'Scheduled'),
39 )
38 )
40
39
41 EXPERIMENT_TYPE = (
40 EXPERIMENT_TYPE = (
42 (0, 'RAW_DATA'),
41 (0, 'RAW_DATA'),
43 (1, 'PDATA'),
42 (1, 'PDATA'),
44 )
43 )
45
44
46 DECODE_TYPE = (
45 DECODE_TYPE = (
47 (0, 'None'),
46 (0, 'None'),
48 (1, 'TimeDomain'),
47 (1, 'TimeDomain'),
49 (2, 'FreqDomain'),
48 (2, 'FreqDomain'),
50 (3, 'InvFreqDomain'),
49 (3, 'InvFreqDomain'),
51 )
50 )
52
51
53 DEV_STATES = (
52 DEV_STATES = (
54 (0, 'Unknown'),
53 (0, 'Unknown'),
55 (1, 'Connected'),
54 (1, 'Connected'),
56 (2, 'Configured'),
55 (2, 'Configured'),
57 (3, 'Running'),
56 (3, 'Running'),
58 (4, 'Offline'),
57 (4, 'Offline'),
59 )
58 )
60
59
61 DEV_TYPES = (
60 DEV_TYPES = (
62 ('', 'Select a device type'),
61 ('', 'Select a device type'),
63 ('pedestal', 'Pedestal Controller'),
62 ('pedestal', 'Pedestal Controller'),
64 ('pedestal_dev', 'Pedestal Controller Dev Mode'),
63 ('pedestal_dev', 'Pedestal Controller Dev Mode'),
65 ('generator', 'Pulse Generator'),
64 ('generator', 'Pulse Generator'),
66 ('usrp_rx', 'Universal Software Radio Peripheral Rx'),
65 ('usrp_rx', 'Universal Software Radio Peripheral Rx'),
67 ('usrp_tx', 'Universal Software Radio Peripheral Tx'),
66 ('usrp_tx', 'Universal Software Radio Peripheral Tx'),
68 )
67 )
69
68
70 EXP_STATES = (
69 EXP_STATES = (
71 (0,'Error'), #RED
70 (0,'Error'), #RED
72 (1,'Cancelled'), #YELLOW
71 (1,'Cancelled'), #YELLOW
73 (2,'Running'), #GREEN
72 (2,'Running'), #GREEN
74 (3,'Scheduled'), #BLUE
73 (3,'Scheduled'), #BLUE
75 (4,'Unknown'), #WHITE
74 (4,'Unknown'), #WHITE
76 )
75 )
77
76
78 CONF_TYPES = (
77 CONF_TYPES = (
79 (0, 'Active'),
78 (0, 'Active'),
80 (1, 'Historical'),
79 (1, 'Historical'),
81 )
80 )
82
81
83 class Profile(models.Model):
82 class Profile(models.Model):
84 user = models.OneToOneField(User, on_delete=models.CASCADE)
83 user = models.OneToOneField(User, on_delete=models.CASCADE)
85 theme = models.CharField(max_length=30, default='spacelab')
84 theme = models.CharField(max_length=30, default='spacelab')
86
85
87
86
88 @receiver(post_save, sender=User)
87 @receiver(post_save, sender=User)
89 def create_user_profile(sender, instance, created, **kwargs):
88 def create_user_profile(sender, instance, created, **kwargs):
90 if created:
89 if created:
91 Profile.objects.create(user=instance)
90 Profile.objects.create(user=instance)
92
91
93 @receiver(post_save, sender=User)
92 @receiver(post_save, sender=User)
94 def save_user_profile(sender, instance, **kwargs):
93 def save_user_profile(sender, instance, **kwargs):
95 instance.profile.save()
94 instance.profile.save()
96
95
97
96
98 class Location(models.Model):
97 class Location(models.Model):
99
98
100 name = models.CharField(max_length = 30)
99 name = models.CharField(max_length = 30)
101 description = models.TextField(blank=True, null=True)
100 description = models.TextField(blank=True, null=True)
102
101
103 class Meta:
102 class Meta:
104 db_table = 'db_location'
103 db_table = 'db_location'
105
104
106 def __str__(self):
105 def __str__(self):
107 return u'%s' % self.name
106 return u'%s' % self.name
108
107
109 def get_absolute_url(self):
108 def get_absolute_url(self):
110 return reverse('url_location', args=[str(self.id)])
109 return reverse('url_location', args=[str(self.id)])
111
110
112
111
113 class DeviceType(models.Model):
112 class DeviceType(models.Model):
114
113
115 name = models.CharField(max_length = 15, choices = DEV_TYPES, default = 'pedestal')
114 name = models.CharField(max_length = 15, choices = DEV_TYPES, default = 'pedestal')
116 sequence = models.PositiveSmallIntegerField(default=55)
115 sequence = models.PositiveSmallIntegerField(default=55)
117 description = models.TextField(blank=True, null=True)
116 description = models.TextField(blank=True, null=True)
118
117
119 class Meta:
118 class Meta:
120 db_table = 'db_device_types'
119 db_table = 'db_device_types'
121
120
122 def __str__(self):
121 def __str__(self):
123 return u'%s' % self.name.title()
122 return u'%s' % self.name.title()
124
123
125 class Device(models.Model):
124 class Device(models.Model):
126
125
127 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
126 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
128 location = models.ForeignKey('Location', on_delete=models.CASCADE)
127 location = models.ForeignKey('Location', on_delete=models.CASCADE)
129 ip_address = models.GenericIPAddressField(verbose_name = 'IP address', protocol='IPv4', default='0.0.0.0')
128 ip_address = models.GenericIPAddressField(verbose_name = 'IP address', protocol='IPv4', default='0.0.0.0')
130 port_address = models.PositiveSmallIntegerField(default=2000)
129 port_address = models.PositiveSmallIntegerField(default=2000)
131 description = models.TextField(blank=True, null=True)
130 description = models.TextField(blank=True, null=True)
132 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
131 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
133 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
132 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
134
133
135 class Meta:
134 class Meta:
136 db_table = 'db_devices'
135 db_table = 'db_devices'
137
136
138 def __str__(self):
137 def __str__(self):
139 ret = self.device_type
138 ret = self.device_type
140 #ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
139 #ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
141 return str(ret)
140 return str(ret)
142
141
143 @property
142 @property
144 def name(self):
143 def name(self):
145 return str(self)
144 return str(self)
146
145
147 def get_status(self):
146 def get_status(self):
148 return self.status
147 return self.status
149
148
150 @property
149 @property
151 def status_color(self):
150 def status_color(self):
152 color = 'muted'
151 color = 'muted'
153 if self.status == 0:
152 if self.status == 0:
154 color = "danger"
153 color = "danger"
155 elif self.status == 1:
154 elif self.status == 1:
156 color = "warning"
155 color = "warning"
157 elif self.status == 2:
156 elif self.status == 2:
158 color = "info"
157 color = "info"
159 elif self.status == 3:
158 elif self.status == 3:
160 color = "success"
159 color = "success"
161
160
162 return color
161 return color
163
162
164 def url(self, path=None):
163 def url(self, path=None):
165
164
166 if path:
165 if path:
167 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
166 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
168 else:
167 else:
169 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
168 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
170
169
171 def get_absolute_url(self):
170 def get_absolute_url(self):
172 return reverse('url_device', args=[str(self.id)])
171 return reverse('url_device', args=[str(self.id)])
173
172
174 def get_absolute_url_edit(self):
173 def get_absolute_url_edit(self):
175 return reverse('url_edit_device', args=[str(self.id)])
174 return reverse('url_edit_device', args=[str(self.id)])
176
175
177 def get_absolute_url_delete(self):
176 def get_absolute_url_delete(self):
178 return reverse('url_delete_device', args=[str(self.id)])
177 return reverse('url_delete_device', args=[str(self.id)])
179
178
180 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
179 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
181
180
182 if self.device_type.name=='pedestal':
181 if self.device_type.name=='pedestal':
183 headers = {'content-type': "application/json",
182 headers = {'content-type': "application/json",
184 'cache-control': "no-cache"}
183 'cache-control': "no-cache"}
185
184
186 ip = [int(x) for x in ip_address.split('.')]
185 ip = [int(x) for x in ip_address.split('.')]
187 dns = [int(x) for x in dns.split('.')]
186 dns = [int(x) for x in dns.split('.')]
188 gateway = [int(x) for x in gateway.split('.')]
187 gateway = [int(x) for x in gateway.split('.')]
189 subnet = [int(x) for x in mask.split('.')]
188 subnet = [int(x) for x in mask.split('.')]
190
189
191 payload = {
190 payload = {
192 "ip": ip,
191 "ip": ip,
193 "dns": dns,
192 "dns": dns,
194 "gateway": gateway,
193 "gateway": gateway,
195 "subnet": subnet
194 "subnet": subnet
196 }
195 }
197
196
198 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
197 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
199 try:
198 try:
200 answer = req.json()
199 answer = req.json()
201 if answer['changeip']=='ok':
200 if answer['changeip']=='ok':
202 self.message = '25|IP succesfully changed'
201 self.message = '25|IP succesfully changed'
203 self.ip_address = ip_address
202 self.ip_address = ip_address
204 self.save()
203 self.save()
205 else:
204 else:
206 self.message = '30|An error ocuur when changing IP'
205 self.message = '30|An error ocuur when changing IP'
207 except Exception as e:
206 except Exception as e:
208 self.message = '40|{}'.format(str(e))
207 self.message = '40|{}'.format(str(e))
209 else:
208 else:
210 self.message = 'Not implemented'
209 self.message = 'Not implemented'
211 return False
210 return False
212
211
213 return True
212 return True
214
213
215
214
216 class Campaign(models.Model):
215 class Campaign(models.Model):
217
216
218 template = models.BooleanField(default=False)
217 template = models.BooleanField(default=False)
219 name = models.CharField(max_length=60, unique=True)
218 name = models.CharField(max_length=60, unique=True)
220 start_date = models.DateTimeField(blank=True, null=True)
219 start_date = models.DateTimeField(blank=True, null=True)
221 end_date = models.DateTimeField(blank=True, null=True)
220 end_date = models.DateTimeField(blank=True, null=True)
222 tags = models.CharField(max_length=40, blank=True, null=True)
221 tags = models.CharField(max_length=40, blank=True, null=True)
223 description = models.TextField(blank=True, null=True)
222 description = models.TextField(blank=True, null=True)
224 experiments = models.ManyToManyField('Experiment', blank=True)
223 experiments = models.ManyToManyField('Experiment', blank=True)
225 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
224 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
226
225
227 class Meta:
226 class Meta:
228 db_table = 'db_campaigns'
227 db_table = 'db_campaigns'
229 ordering = ('name',)
228 ordering = ('name',)
230
229
231 def __str__(self):
230 def __str__(self):
232 if self.template:
231 if self.template:
233 return u'{} (template)'.format(self.name)
232 return u'{} (template)'.format(self.name)
234 else:
233 else:
235 return u'{}'.format(self.name)
234 return u'{}'.format(self.name)
236
235
237 def jsonify(self):
236 def jsonify(self):
238
237
239 data = {}
238 data = {}
240
239
241 ignored = ('template')
240 ignored = ('template')
242
241
243 for field in self._meta.fields:
242 for field in self._meta.fields:
244 if field.name in ignored:
243 if field.name in ignored:
245 continue
244 continue
246 data[field.name] = field.value_from_object(self)
245 data[field.name] = field.value_from_object(self)
247
246
248 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
247 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
249 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
248 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
250
249
251 return data
250 return data
252
251
253 def parms_to_dict(self):
252 def parms_to_dict(self):
254
253
255 params = Params({})
254 params = Params({})
256 params.add(self.jsonify(), 'campaigns')
255 params.add(self.jsonify(), 'campaigns')
257
256
258 for exp in Experiment.objects.filter(campaign = self):
257 for exp in Experiment.objects.filter(campaign = self):
259 params.add(exp.jsonify(), 'experiments')
258 params.add(exp.jsonify(), 'experiments')
260 configurations = Configuration.objects.filter(experiment=exp, type=0)
259 configurations = Configuration.objects.filter(experiment=exp, type=0)
261
260
262 for conf in configurations:
261 for conf in configurations:
263 params.add(conf.jsonify(), 'configurations')
262 params.add(conf.jsonify(), 'configurations')
264
263
265 return params.data
264 return params.data
266
265
267 def dict_to_parms(self, parms, CONF_MODELS):
266 def dict_to_parms(self, parms, CONF_MODELS):
268
267
269 experiments = Experiment.objects.filter(campaign = self)
268 experiments = Experiment.objects.filter(campaign = self)
270
269
271 if experiments:
270 if experiments:
272 for experiment in experiments:
271 for experiment in experiments:
273 experiment.delete()
272 experiment.delete()
274
273
275 for id_exp in parms['experiments']['allIds']:
274 for id_exp in parms['experiments']['allIds']:
276 exp_parms = parms['experiments']['byId'][id_exp]
275 exp_parms = parms['experiments']['byId'][id_exp]
277 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
276 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
278 exp = Experiment(name='{}'.format(dum))
277 exp = Experiment(name='{}'.format(dum))
279 exp.save()
278 exp.save()
280 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
279 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
281 self.experiments.add(exp)
280 self.experiments.add(exp)
282
281
283 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
282 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
284
283
285 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
284 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
286 self.start_date = camp_parms['start_date']
285 self.start_date = camp_parms['start_date']
287 self.end_date = camp_parms['end_date']
286 self.end_date = camp_parms['end_date']
288 self.tags = camp_parms['tags']
287 self.tags = camp_parms['tags']
289 self.save()
288 self.save()
290
289
291 return self
290 return self
292
291
293 def get_experiments_by_radar(self, radar=None):
292 def get_experiments_by_radar(self, radar=None):
294
293
295 ret = []
294 ret = []
296 if radar:
295 if radar:
297 locations = Location.objects.filter(pk=radar)
296 locations = Location.objects.filter(pk=radar)
298 else:
297 else:
299 locations = set([e.location for e in self.experiments.all()])
298 locations = set([e.location for e in self.experiments.all()])
300
299
301 for loc in locations:
300 for loc in locations:
302 dum = {}
301 dum = {}
303 dum['name'] = loc.name
302 dum['name'] = loc.name
304 dum['id'] = loc.pk
303 dum['id'] = loc.pk
305 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
304 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
306 ret.append(dum)
305 ret.append(dum)
307
306
308 return ret
307 return ret
309
308
310 def get_absolute_url(self):
309 def get_absolute_url(self):
311 return reverse('url_campaign', args=[str(self.id)])
310 return reverse('url_campaign', args=[str(self.id)])
312
311
313 def get_absolute_url_edit(self):
312 def get_absolute_url_edit(self):
314 return reverse('url_edit_campaign', args=[str(self.id)])
313 return reverse('url_edit_campaign', args=[str(self.id)])
315
314
316 def get_absolute_url_delete(self):
315 def get_absolute_url_delete(self):
317 return reverse('url_delete_campaign', args=[str(self.id)])
316 return reverse('url_delete_campaign', args=[str(self.id)])
318
317
319 def get_absolute_url_export(self):
318 def get_absolute_url_export(self):
320 return reverse('url_export_campaign', args=[str(self.id)])
319 return reverse('url_export_campaign', args=[str(self.id)])
321
320
322 def get_absolute_url_import(self):
321 def get_absolute_url_import(self):
323 return reverse('url_import_campaign', args=[str(self.id)])
322 return reverse('url_import_campaign', args=[str(self.id)])
324
323
325
324
326 class RunningExperiment(models.Model):
325 class RunningExperiment(models.Model):
327 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
326 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
328 running_experiment = models.ManyToManyField('Experiment', blank = True)
327 running_experiment = models.ManyToManyField('Experiment', blank = True)
329 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
328 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
330
329
331
330
332 class Experiment(models.Model):
331 class Experiment(models.Model):
333
332
334 template = models.BooleanField(default=False)
333 template = models.BooleanField(default=False)
335 name = models.CharField(max_length=40, default='', unique=True)
334 name = models.CharField(max_length=40, default='', unique=True)
336 location = models.ForeignKey('Location', null=False, blank=False, on_delete=models.CASCADE, default='')
335 location = models.ForeignKey('Location', null=False, blank=False, on_delete=models.CASCADE, default=None)
337 #freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
336 #freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
338 start_time = models.TimeField(default='00:00:00')
337 #start_time = models.TimeField(default='00:00:00')
339 end_time = models.TimeField(default='23:59:59')
338 #end_time = models.TimeField(default='23:59:59')
339 pedestal = models.ForeignKey('pedestal.PedestalConfiguration', null=False, blank=False, on_delete=models.CASCADE, default=None, related_name = "pedestal_conf")
340 task = models.CharField(max_length=36, default='', blank=True, null=True)
340 task = models.CharField(max_length=36, default='', blank=True, null=True)
341 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
341 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
342 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
342 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
343 hash = models.CharField(default='', max_length=64, null=True, blank=True)
343 hash = models.CharField(default='', max_length=64, null=True, blank=True)
344
344
345 class Meta:
345 class Meta:
346 db_table = 'db_experiments'
346 db_table = 'db_experiments'
347 ordering = ('template', 'name')
347 ordering = ('template', 'name')
348
348
349 def __str__(self):
349 def __str__(self):
350 if self.template:
350 if self.template:
351 return u'%s (template)' % (self.name)
351 return u'%s (template)' % (self.name)
352 else:
352 else:
353 return u'%s' % (self.name)
353 return u'%s' % (self.name)
354
354
355 def jsonify(self):
355 def jsonify(self):
356
356
357 data = {}
357 data = {}
358
358
359 ignored = ('template')
359 ignored = ('template')
360
360
361 for field in self._meta.fields:
361 for field in self._meta.fields:
362 if field.name in ignored:
362 if field.name in ignored:
363 continue
363 continue
364 data[field.name] = field.value_from_object(self)
364 data[field.name] = field.value_from_object(self)
365
365
366 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
366 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
367 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
367 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
368 data['location'] = self.location.name
368 data['location'] = self.location.name
369 data['configurations'] = ['{}'.format(conf.pk) for
369 data['configurations'] = ['{}'.format(conf.pk) for
370 conf in Configuration.objects.filter(experiment=self, type=0)]
370 conf in Configuration.objects.filter(experiment=self, type=0)]
371
371
372 return data
372 return data
373
373
374 @property
374 @property
375 def radar_system(self):
375 def radar_system(self):
376 return self.location
376 return self.location
377
377
378 def clone(self, **kwargs):
378 def clone(self, **kwargs):
379
379
380 confs = Configuration.objects.filter(experiment=self, type=0)
380 confs = Configuration.objects.filter(experiment=self, type=0)
381 self.pk = None
381 self.pk = None
382 self.name = '{}_{:%y%m%d}'.format(self.name, datetime.now())
382 self.name = '{}_{:%y%m%d}'.format(self.name, datetime.now())
383 for attr, value in kwargs.items():
383 for attr, value in kwargs.items():
384 setattr(self, attr, value)
384 setattr(self, attr, value)
385
385
386 self.save()
386 self.save()
387
387
388 for conf in confs:
388 for conf in confs:
389 conf.clone(experiment=self, template=False)
389 conf.clone(experiment=self, template=False)
390
390
391 return self
391 return self
392
392
393 def start(self):
393 def start(self):
394 '''
394 '''
395 Configure and start experiments's devices
395 Configure and start experiments's devices
396 '''
396 '''
397
397
398 confs = []
398 confs = []
399 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
399 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
400 confs = allconfs
400 confs = allconfs
401
401
402 try:
402 try:
403 for conf in confs:
403 for conf in confs:
404 conf.stop_device()
404 conf.stop_device()
405 print("OK")
405 print("OK")
406 #conf.write_device()
406 #conf.write_device()
407 conf.device.conf_active = conf.pk
407 conf.device.conf_active = conf.pk
408 conf.device.save()
408 conf.device.save()
409 conf.start_device()
409 conf.start_device()
410 print("OK")
410 print("OK")
411 time.sleep(1)
411 time.sleep(1)
412 except:
412 except:
413 return 0
413 return 0
414 return 2
414 return 2
415
415
416
416
417 def stop(self):
417 def stop(self):
418 '''
418 '''
419 Stop experiments's devices
419 Stop experiments's devices
420 PEDESTAL, PULSE GENERATOR & USRP's
420 PEDESTAL, PULSE GENERATOR & USRP's
421 '''
421 '''
422
422
423 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
423 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
424 try:
424 try:
425 for conf in confs:
425 for conf in confs:
426 conf.stop_device()
426 conf.stop_device()
427 except:
427 except:
428 return 0
428 return 0
429 return 1
429 return 1
430
430
431 def get_status(self):
431 def get_status(self):
432
432
433 if self.status == 3:
433 if self.status == 3:
434 return
434 return
435
435
436 confs = Configuration.objects.filter(experiment=self, type=0)
436 confs = Configuration.objects.filter(experiment=self, type=0)
437
437
438 for conf in confs:
438 for conf in confs:
439 conf.status_device()
439 conf.status_device()
440
440
441 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
441 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
442
442
443 if total==2*confs.count():
443 if total==2*confs.count():
444 status = 1
444 status = 1
445 elif total == 3*confs.count():
445 elif total == 3*confs.count():
446 status = 2
446 status = 2
447 else:
447 else:
448 status = 0
448 status = 0
449
449
450 self.status = status
450 self.status = status
451 self.save()
451 self.save()
452
452
453 def status_color(self):
453 def status_color(self):
454 color = 'muted'
454 color = 'muted'
455 if self.status == 0:
455 if self.status == 0:
456 color = "danger"
456 color = "danger"
457 elif self.status == 1:
457 elif self.status == 1:
458 color = "warning"
458 color = "warning"
459 elif self.status == 2:
459 elif self.status == 2:
460 color = "success"
460 color = "success"
461 elif self.status == 3:
461 elif self.status == 3:
462 color = "info"
462 color = "info"
463
463
464 return color
464 return color
465
465
466 def parms_to_dict(self):
466 def parms_to_dict(self):
467
467
468 params = Params({})
468 params = Params({})
469 params.add(self.jsonify(), 'experiments')
469 params.add(self.jsonify(), 'experiments')
470
470
471 configurations = Configuration.objects.filter(experiment=self, type=0)
471 configurations = Configuration.objects.filter(experiment=self, type=0)
472
472
473 for conf in configurations:
473 for conf in configurations:
474 params.add(conf.jsonify(), 'configurations')
474 params.add(conf.jsonify(), 'configurations')
475
475
476 return params.data
476 return params.data
477
477
478 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
478 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
479
479
480 configurations = Configuration.objects.filter(experiment=self)
480 configurations = Configuration.objects.filter(experiment=self)
481
481
482 if id_exp is not None:
482 if id_exp is not None:
483 exp_parms = parms['experiments']['byId'][id_exp]
483 exp_parms = parms['experiments']['byId'][id_exp]
484 else:
484 else:
485 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
485 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
486
486
487 if configurations:
487 if configurations:
488 for configuration in configurations:
488 for configuration in configurations:
489 configuration.delete()
489 configuration.delete()
490
490
491 for id_conf in exp_parms['configurations']:
491 for id_conf in exp_parms['configurations']:
492 conf_parms = parms['configurations']['byId'][id_conf]
492 conf_parms = parms['configurations']['byId'][id_conf]
493 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
493 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
494 model = CONF_MODELS[conf_parms['device_type']]
494 model = CONF_MODELS[conf_parms['device_type']]
495 conf = model(
495 conf = model(
496 experiment = self,
496 experiment = self,
497 device = device,
497 device = device,
498 )
498 )
499 conf.dict_to_parms(parms, id=id_conf)
499 conf.dict_to_parms(parms, id=id_conf)
500
500
501
501
502 location, created = Location.objects.get_or_create(name=exp_parms['location'])
502 location, created = Location.objects.get_or_create(name=exp_parms['location'])
503 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
503 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
504 self.location = location
504 self.location = location
505 self.start_time = exp_parms['start_time']
505 self.start_time = exp_parms['start_time']
506 self.end_time = exp_parms['end_time']
506 self.end_time = exp_parms['end_time']
507 self.save()
507 self.save()
508
508
509 return self
509 return self
510
510
511 def get_absolute_url(self):
511 def get_absolute_url(self):
512 return reverse('url_experiment', args=[str(self.id)])
512 return reverse('url_experiment', args=[str(self.id)])
513
513
514 def get_absolute_url_edit(self):
514 def get_absolute_url_edit(self):
515 return reverse('url_edit_experiment', args=[str(self.id)])
515 return reverse('url_edit_experiment', args=[str(self.id)])
516
516
517 def get_absolute_url_delete(self):
517 def get_absolute_url_delete(self):
518 return reverse('url_delete_experiment', args=[str(self.id)])
518 return reverse('url_delete_experiment', args=[str(self.id)])
519
519
520 def get_absolute_url_import(self):
520 def get_absolute_url_import(self):
521 return reverse('url_import_experiment', args=[str(self.id)])
521 return reverse('url_import_experiment', args=[str(self.id)])
522
522
523 def get_absolute_url_export(self):
523 def get_absolute_url_export(self):
524 return reverse('url_export_experiment', args=[str(self.id)])
524 return reverse('url_export_experiment', args=[str(self.id)])
525
525
526 def get_absolute_url_start(self):
526 def get_absolute_url_start(self):
527 return reverse('url_start_experiment', args=[str(self.id)])
527 return reverse('url_start_experiment', args=[str(self.id)])
528
528
529 def get_absolute_url_stop(self):
529 def get_absolute_url_stop(self):
530 return reverse('url_stop_experiment', args=[str(self.id)])
530 return reverse('url_stop_experiment', args=[str(self.id)])
531
531
532
532
533 class Configuration(PolymorphicModel):
533 class Configuration(PolymorphicModel):
534
534
535 id = models.AutoField(primary_key=True)
535 id = models.AutoField(primary_key=True)
536 template = models.BooleanField(default=False)
536 template = models.BooleanField(default=False)
537 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
537 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
538 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
538 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
539 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=False, null=False)
539 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=False, null=False)
540 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
540 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
541 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
541 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
542 created_date = models.DateTimeField(auto_now_add=True)
542 created_date = models.DateTimeField(auto_now_add=True)
543 programmed_date = models.DateTimeField(auto_now=True)
543 programmed_date = models.DateTimeField(auto_now=True)
544 parameters = models.TextField(default='{}')
544 parameters = models.TextField(default='{}')
545 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
545 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
546 hash = models.CharField(default='', max_length=64, null=True, blank=True)
546 hash = models.CharField(default='', max_length=64, null=True, blank=True)
547 message = ""
547 message = ""
548
548
549 class Meta:
549 class Meta:
550 db_table = 'db_configurations'
550 db_table = 'db_configurations'
551 ordering = ('device__device_type__name',)
551 ordering = ('device__device_type__name',)
552
552
553 def __str__(self):
553 def __str__(self):
554
554
555 ret = u'{} '.format(self.device.device_type.name.upper())
555 ret = u'{} '.format(self.device.device_type.name.upper())
556
556
557 if 'mix' in [f.name for f in self._meta.get_fields()]:
557 if 'mix' in [f.name for f in self._meta.get_fields()]:
558 if self.mix:
558 if self.mix:
559 ret = '{} MIX '.format(self.device.device_type.name.upper())
559 ret = '{} MIX '.format(self.device.device_type.name.upper())
560
560
561 if 'label' in [f.name for f in self._meta.get_fields()]:
561 if 'label' in [f.name for f in self._meta.get_fields()]:
562 ret += '{}'.format(self.label)
562 ret += '{}'.format(self.label)
563
563
564 if self.template:
564 if self.template:
565 ret += ' (template)'
565 ret += ' (template)'
566
566
567 return ret
567 return ret
568
568
569 @property
569 @property
570 def name(self):
570 def name(self):
571
571
572 return str(self)
572 return str(self)
573
573
574 def jsonify(self):
574 def jsonify(self):
575
575
576 data = {}
576 data = {}
577
577
578 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
578 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
579 'created_date', 'programmed_date', 'template', 'device',
579 'created_date', 'programmed_date', 'template', 'device',
580 'experiment')
580 'experiment')
581
581
582 for field in self._meta.fields:
582 for field in self._meta.fields:
583 if field.name in ignored:
583 if field.name in ignored:
584 continue
584 continue
585 data[field.name] = field.value_from_object(self)
585 data[field.name] = field.value_from_object(self)
586
586
587 data['device_type'] = self.device.device_type.name
587 data['device_type'] = self.device.device_type.name
588 return data
588 return data
589
589
590 def clone(self, **kwargs):
590 def clone(self, **kwargs):
591
591
592 self.pk = None
592 self.pk = None
593 self.id = None
593 self.id = None
594 for attr, value in kwargs.items():
594 for attr, value in kwargs.items():
595 setattr(self, attr, value)
595 setattr(self, attr, value)
596
596
597 self.save()
597 self.save()
598
598
599 return self
599 return self
600
600
601 def parms_to_dict(self):
601 def parms_to_dict(self):
602
602
603 params = Params({})
603 params = Params({})
604 params.add(self.jsonify(), 'configurations')
604 params.add(self.jsonify(), 'configurations')
605 return params.data
605 return params.data
606
606
607 def parms_to_text(self):
607 def parms_to_text(self):
608
608
609 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
609 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
610
610
611
611
612 def parms_to_binary(self):
612 def parms_to_binary(self):
613
613
614 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
614 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
615
615
616
616
617 def dict_to_parms(self, parameters, id=None):
617 def dict_to_parms(self, parameters, id=None):
618
618
619 params = Params(parameters)
619 params = Params(parameters)
620
620
621 if id:
621 if id:
622 data = params.get_conf(id_conf=id)
622 data = params.get_conf(id_conf=id)
623 else:
623 else:
624 data = params.get_conf(dtype=self.device.device_type.name)
624 data = params.get_conf(dtype=self.device.device_type.name)
625
625
626 for key, value in data.items():
626 for key, value in data.items():
627 if key not in ('id', 'device_type'):
627 if key not in ('id', 'device_type'):
628 setattr(self, key, value)
628 setattr(self, key, value)
629
629
630 self.save()
630 self.save()
631
631
632
632
633 def export_to_file(self, format="json"):
633 def export_to_file(self, format="json"):
634
634
635 content_type = ''
635 content_type = ''
636
636
637 if format == 'racp':
637 if format == 'racp':
638 content_type = 'text/plain'
638 content_type = 'text/plain'
639 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
639 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
640 content = self.parms_to_text(file_format = 'racp')
640 content = self.parms_to_text(file_format = 'racp')
641
641
642 if format == 'text':
642 if format == 'text':
643 content_type = 'text/plain'
643 content_type = 'text/plain'
644 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
644 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
645 content = self.parms_to_text()
645 content = self.parms_to_text()
646
646
647 if format == 'binary':
647 if format == 'binary':
648 content_type = 'application/octet-stream'
648 content_type = 'application/octet-stream'
649 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
649 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
650 content = self.parms_to_binary()
650 content = self.parms_to_binary()
651
651
652 if not content_type:
652 if not content_type:
653 content_type = 'application/json'
653 content_type = 'application/json'
654 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
654 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
655 content = json.dumps(self.parms_to_dict(), indent=2)
655 content = json.dumps(self.parms_to_dict(), indent=2)
656
656
657 fields = {'content_type':content_type,
657 fields = {'content_type':content_type,
658 'filename':filename,
658 'filename':filename,
659 'content':content
659 'content':content
660 }
660 }
661
661
662 return fields
662 return fields
663
663
664 def import_from_file(self, fp):
664 def import_from_file(self, fp):
665
665
666 parms = {}
666 parms = {}
667
667
668 path, ext = os.path.splitext(fp.name)
668 path, ext = os.path.splitext(fp.name)
669
669
670 if ext == '.json':
670 if ext == '.json':
671 parms = json.load(fp)
671 parms = json.load(fp)
672
672
673 return parms
673 return parms
674
674
675 def status_device(self):
675 def status_device(self):
676
676
677 self.message = 'Function not implemented'
677 self.message = 'Function not implemented'
678 return False
678 return False
679
679
680
680
681 def stop_device(self):
681 def stop_device(self):
682
682
683 self.message = 'Function not implemented'
683 self.message = 'Function not implemented'
684 return False
684 return False
685
685
686
686
687 def start_device(self):
687 def start_device(self):
688
688
689 self.message = 'Function not implemented'
689 self.message = 'Function not implemented'
690 return False
690 return False
691
691
692
692
693 def write_device(self):
693 def write_device(self):
694
694
695 self.message = 'Function not implemented'
695 self.message = 'Function not implemented'
696 return False
696 return False
697
697
698
698
699 def read_device(self):
699 def read_device(self):
700
700
701 self.message = 'Function not implemented'
701 self.message = 'Function not implemented'
702 return False
702 return False
703
703
704
704
705 def get_absolute_url(self):
705 def get_absolute_url(self):
706 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
706 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
707
707
708 def get_absolute_url_edit(self):
708 def get_absolute_url_edit(self):
709 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
709 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
710
710
711 def get_absolute_url_delete(self):
711 def get_absolute_url_delete(self):
712 return reverse('url_delete_dev_conf', args=[str(self.id)])
712 return reverse('url_delete_dev_conf', args=[str(self.id)])
713
713
714 def get_absolute_url_import(self):
714 def get_absolute_url_import(self):
715 return reverse('url_import_dev_conf', args=[str(self.id)])
715 return reverse('url_import_dev_conf', args=[str(self.id)])
716
716
717 def get_absolute_url_export(self):
717 def get_absolute_url_export(self):
718 return reverse('url_export_dev_conf', args=[str(self.id)])
718 return reverse('url_export_dev_conf', args=[str(self.id)])
719
719
720 def get_absolute_url_write(self):
720 def get_absolute_url_write(self):
721 return reverse('url_write_dev_conf', args=[str(self.id)])
721 return reverse('url_write_dev_conf', args=[str(self.id)])
722
722
723 def get_absolute_url_read(self):
723 def get_absolute_url_read(self):
724 return reverse('url_read_dev_conf', args=[str(self.id)])
724 return reverse('url_read_dev_conf', args=[str(self.id)])
725
725
726 def get_absolute_url_start(self):
726 def get_absolute_url_start(self):
727 return reverse('url_start_dev_conf', args=[str(self.id)])
727 return reverse('url_start_dev_conf', args=[str(self.id)])
728
728
729 def get_absolute_url_stop(self):
729 def get_absolute_url_stop(self):
730 return reverse('url_stop_dev_conf', args=[str(self.id)])
730 return reverse('url_stop_dev_conf', args=[str(self.id)])
731
731
732 def get_absolute_url_status(self):
732 def get_absolute_url_status(self):
733 return reverse('url_status_dev_conf', args=[str(self.id)])
733 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,105 +1,103
1 {% extends "base.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap4 %}
2 {% load bootstrap4 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5 {% block extra-head %}
5 {% block extra-head %}
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
7 {% endblock %}
7 {% endblock %}
8 {% block content-title %}{{title}}{% endblock %}
8 {% block content-title %}{{title}}{% endblock %}
9 {% block content-suptitle %}{{suptitle}}{% endblock %}
9 {% block content-suptitle %}{{suptitle}}{% endblock %}
10
10
11 {% block content %}
11 {% block content %}
12
12
13 {% block menu-actions %}
13 {% block menu-actions %}
14 <span class=" dropdown pull-right">
14 <span class=" dropdown pull-right">
15 <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="fas fa-bars" aria-hidden="true"></span></a>
15 <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="fas fa-bars" aria-hidden="true"></span></a>
16 <ul class="dropdown-menu" role="menu">
16 <ul class="dropdown-menu" role="menu">
17 <li><a href="{% url 'url_edit_experiment' experiment.id %}"><span class="fa fa-pencil" aria-hidden="true"></span> Edit</a></li>
17 <li><a href="{% url 'url_edit_experiment' experiment.id %}"><span class="fa fa-pencil" aria-hidden="true"></span> Edit</a></li>
18 <li><a href="{% url 'url_delete_experiment' experiment.id %}"><span class="fa fa-times" aria-hidden="true"></span> Delete</a></li>
18 <li><a href="{% url 'url_delete_experiment' experiment.id %}"><span class="fa fa-times" aria-hidden="true"></span> Delete</a></li>
19 <li><a href="{{ experiment.get_absolute_url_import }}"><span class="fas fa-cloud-download-alt" aria-hidden="true"></span> Import </a></li>
19 <li><a href="{{ experiment.get_absolute_url_import }}"><span class="fas fa-cloud-download-alt" aria-hidden="true"></span> Import </a></li>
20 <li><a href="{{ experiment.get_absolute_url_export }}"><span class="fas fa-cloud-upload-alt" aria-hidden="true"></span> Export </a></li>
20 <li><a href="{{ experiment.get_absolute_url_export }}"><span class="fas fa-cloud-upload-alt" aria-hidden="true"></span> Export </a></li>
21 <li><a>----------------</a></li>
21 <li><a>----------------</a></li>
22 <li><a href="{{ experiment.get_absolute_url_start}}"><span class="fa fa-play" aria-hidden="true"></span> Start</a></li>
22 <li><a href="{{ experiment.get_absolute_url_start}}"><span class="fa fa-play" aria-hidden="true"></span> Start</a></li>
23 <li><a href="{{ experiment.get_absolute_url_stop }}"><span class="fa fa-stop" aria-hidden="true"></span> Stop</a></li>
23 <li><a href="{{ experiment.get_absolute_url_stop }}"><span class="fa fa-stop" aria-hidden="true"></span> Stop</a></li>
24 <li><a href="{% url 'url_mix_experiment' experiment.id %}"><span class="fa fa-random" aria-hidden="true"></span> Mix RC Configurations </a></li>
25 <li><a href="{% url 'url_add_dev_conf' experiment.id %}"><span class="fa fa-plus-circle" aria-hidden="true"></span> Add Configuration</a></li>
24 <li><a href="{% url 'url_add_dev_conf' experiment.id %}"><span class="fa fa-plus-circle" aria-hidden="true"></span> Add Configuration</a></li>
26 <li><a href="{% url 'url_sum_experiment' experiment.id %}"><span class="fa fa-list-alt" aria-hidden="true"></span> Summary</a></li>
25
27
28 </ul>
26 </ul>
29 </span>
27 </span>
30 {% endblock %}
28 {% endblock %}
31
29
32 <table class="table table-bordered">
30 <table class="table table-bordered">
33 {% for key in experiment_keys %}
31 {% for key in experiment_keys %}
34 {% if key == 'freq' %}
32 {% if key == 'freq' %}
35 <tr><th>Operating Freq. (MHz)</th><td>{{experiment|attr:key}}</td></tr>
33 <tr><th>Operating Freq. (MHz)</th><td>{{experiment|attr:key}}</td></tr>
36 {% else %}
34 {% else %}
37 <tr><th>{{key|title}}</th><td>{{experiment|attr:key}}</td></tr>
35 <tr><th>{{key|title}}</th><td>{{experiment|attr:key}}</td></tr>
38 {% endif %}
36 {% endif %}
39 {% endfor %}
37 {% endfor %}
40 </table>
38 </table>
41 <br>
39 <br>
42
40
43 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
41 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
44
42
45 <div class="panel panel-default bootcards-summary">
43 <div class="panel panel-default bootcards-summary">
46 <div class="panel-heading" role="tab">
44 <div class="panel-heading" role="tab">
47 <h4 class="panel-title">
45 <h4 class="panel-title">
48 Devices
46 Devices
49 </h4>
47 </h4>
50 </div>
48 </div>
51 <div class="panel-body">
49 <div class="panel-body">
52
50
53 {% for item in configurations %}
51 {% for item in configurations %}
54 <div class="col-xs-6 col-sm-4" style="padding-top:5px;padding-bottom:5px">
52 <div class="col-xs-6 col-sm-4" style="padding-top:5px;padding-bottom:5px">
55 <a class="bootcards-summary-item" href="{{item.get_absolute_url}}"><br>
53 <a class="bootcards-summary-item" href="{{item.get_absolute_url}}"><br>
56 {% if item.device.device_type.name == 'cgs' %}
54 {% if item.device.device_type.name == 'cgs' %}
57 <i class="fa fa-2x fa-clock-o"></i>
55 <i class="fa fa-2x fa-clock-o"></i>
58 {% elif item.device.device_type.name == 'rc' %}
56 {% elif item.device.device_type.name == 'rc' %}
59 <i class="fa fa-2x fa-microchip"></i>
57 <i class="fa fa-2x fa-microchip"></i>
60 {% elif item.device.device_type.name == 'abs' %}
58 {% elif item.device.device_type.name == 'abs' %}
61 <i class="fa fa-2x fa-podcast"></i>
59 <i class="fa fa-2x fa-podcast"></i>
62 {% elif item.device.device_type.name == 'jars' %}
60 {% elif item.device.device_type.name == 'jars' %}
63 <i class="fa fa-2x fa-desktop"></i>
61 <i class="fa fa-2x fa-desktop"></i>
64 {% elif item.device.device_type.name == 'dds' %}
62 {% elif item.device.device_type.name == 'dds' %}
65 <i class="fa fa-2x fa-bar-chart"></i>
63 <i class="fa fa-2x fa-bar-chart"></i>
66 {% else %}
64 {% else %}
67 <i class="fa fa-3x fa-puzzle-piece"></i>
65 <i class="fa fa-3x fa-puzzle-piece"></i>
68 {%endif%}
66 {%endif%}
69 <h4>{{item}}<br><small>{{item.device.ip_address}}</small>
67 <h4>{{item}}<br><small>{{item.device.ip_address}}</small>
70 {%if item.pk != item.device.conf_active %}
68 {%if item.pk != item.device.conf_active %}
71 <span class="label label-info">Configured</span>
69 <span class="label label-info">Configured</span>
72 {%else%}
70 {%else%}
73 <span class="label label-{{item.device.status_color}}">{{item.device.get_status_display}}</span>
71 <span class="label label-{{item.device.status_color}}">{{item.device.get_status_display}}</span>
74 {%endif%}
72 {%endif%}
75 </h4>
73 </h4>
76 </a>
74 </a>
77 </div>
75 </div>
78 {% endfor %}
76 {% endfor %}
79
77
80 </div>
78 </div>
81 </div>
79 </div>
82 </div>
80 </div>
83 {% endblock %}
81 {% endblock %}
84
82
85 {% block sidebar%}
83 {% block sidebar%}
86 {% include "sidebar_devices.html" %}
84 {% include "sidebar_devices.html" %}
87 {% endblock %}
85 {% endblock %}
88
86
89 {% block extra-js%}
87 {% block extra-js%}
90 <script type="text/javascript">
88 <script type="text/javascript">
91
89
92 $(".clickable-row").click(function() {
90 $(".clickable-row").click(function() {
93 document.location = $(this).data("href");
91 document.location = $(this).data("href");
94 });
92 });
95
93
96 $("#bt_edit").click(function() {
94 $("#bt_edit").click(function() {
97 document.location = "{% url 'url_edit_experiment' experiment.id%}";
95 document.location = "{% url 'url_edit_experiment' experiment.id%}";
98 });
96 });
99
97
100 $("#bt_add_conf").click(function() {
98 $("#bt_add_conf").click(function() {
101 document.location = "{% url 'url_add_dev_conf' experiment.id %}";
99 document.location = "{% url 'url_add_dev_conf' experiment.id %}";
102 });
100 });
103
101
104 </script>
102 </script>
105 {% endblock %}
103 {% endblock %}
@@ -1,1920 +1,1918
1 import ast
1 import ast
2 import json
2 import json
3 import hashlib
3 import hashlib
4 from datetime import datetime, timedelta
4 from datetime import datetime, timedelta
5
5
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 from django.utils.safestring import mark_safe
7 from django.utils.safestring import mark_safe
8 from django.http import HttpResponseRedirect
8 from django.http import HttpResponseRedirect
9 from django.urls import reverse
9 from django.urls import reverse
10 from django.db.models import Q
10 from django.db.models import Q
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
12 from django.contrib import messages
12 from django.contrib import messages
13 from django.http.request import QueryDict
13 from django.http.request import QueryDict
14 from django.contrib.auth.decorators import login_required, user_passes_test
14 from django.contrib.auth.decorators import login_required, user_passes_test
15
15
16 from django.utils.timezone import is_aware
16 from django.utils.timezone import is_aware
17
17
18 try:
18 try:
19 from urllib.parse import urlencode
19 from urllib.parse import urlencode
20 except ImportError:
20 except ImportError:
21 from urllib import urlencode
21 from urllib import urlencode
22
22
23 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
23 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
25
25
26 from apps.pedestal.forms import PedestalConfigurationForm
26 from apps.pedestal.forms import PedestalConfigurationForm
27 from apps.pedestal_dev.forms import PedestalDevConfigurationForm
27 from apps.pedestal_dev.forms import PedestalDevConfigurationForm
28 from apps.generator.forms import GeneratorConfigurationForm
28 from apps.generator.forms import GeneratorConfigurationForm
29 from apps.usrp_rx.forms import USRPRXConfigurationForm
29 from apps.usrp_rx.forms import USRPRXConfigurationForm
30 from apps.usrp_tx.forms import USRPTXConfigurationForm
30 from apps.usrp_tx.forms import USRPTXConfigurationForm
31 from .utils import Params
31 from .utils import Params
32
32
33 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
33 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
34 from apps.pedestal.models import PedestalConfiguration
34 from apps.pedestal.models import PedestalConfiguration
35 from apps.pedestal_dev.models import PedestalDevConfiguration
35 from apps.pedestal_dev.models import PedestalDevConfiguration
36 from apps.generator.models import GeneratorConfiguration
36 from apps.generator.models import GeneratorConfiguration
37 from apps.usrp_rx.models import USRPRXConfiguration
37 from apps.usrp_rx.models import USRPRXConfiguration
38 from apps.usrp_tx.models import USRPTXConfiguration
38 from apps.usrp_tx.models import USRPTXConfiguration
39
39
40
40
41 #comentario test
41 #comentario test
42 CONF_FORMS = {
42 CONF_FORMS = {
43 'pedestal': PedestalConfigurationForm,
43 'pedestal': PedestalConfigurationForm,
44 'pedestal_dev': PedestalDevConfigurationForm,
44 'pedestal_dev': PedestalDevConfigurationForm,
45 'generator': GeneratorConfigurationForm,
45 'generator': GeneratorConfigurationForm,
46 'usrp_rx': USRPRXConfigurationForm,
46 'usrp_rx': USRPRXConfigurationForm,
47 'usrp_tx': USRPTXConfigurationForm,
47 'usrp_tx': USRPTXConfigurationForm,
48 }
48 }
49
49
50 CONF_MODELS = {
50 CONF_MODELS = {
51 'pedestal': PedestalConfiguration,
51 'pedestal': PedestalConfiguration,
52 'pedestal_dev': PedestalDevConfiguration,
52 'pedestal_dev': PedestalDevConfiguration,
53 'generator': GeneratorConfiguration,
53 'generator': GeneratorConfiguration,
54 'usrp_rx': USRPRXConfiguration,
54 'usrp_rx': USRPRXConfiguration,
55 'usrp_tx': USRPTXConfiguration,
55 'usrp_tx': USRPTXConfiguration,
56 }
56 }
57
57
58 MIX_MODES = {
58 MIX_MODES = {
59 '0': 'P',
59 '0': 'P',
60 '1': 'S',
60 '1': 'S',
61 }
61 }
62
62
63 MIX_OPERATIONS = {
63 MIX_OPERATIONS = {
64 '0': 'OR',
64 '0': 'OR',
65 '1': 'XOR',
65 '1': 'XOR',
66 '2': 'AND',
66 '2': 'AND',
67 '3': 'NAND',
67 '3': 'NAND',
68 }
68 }
69
69
70
70
71 def is_developer(user):
71 def is_developer(user):
72
72
73 groups = [str(g.name) for g in user.groups.all()]
73 groups = [str(g.name) for g in user.groups.all()]
74 return 'Developer' in groups or user.is_staff
74 return 'Developer' in groups or user.is_staff
75
75
76
76
77 def is_operator(user):
77 def is_operator(user):
78
78
79 groups = [str(g.name) for g in user.groups.all()]
79 groups = [str(g.name) for g in user.groups.all()]
80 return 'Operator' in groups or user.is_staff
80 return 'Operator' in groups or user.is_staff
81
81
82
82
83 def has_been_modified(model):
83 def has_been_modified(model):
84
84
85 prev_hash = model.hash
85 prev_hash = model.hash
86 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
86 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
87 if prev_hash != new_hash:
87 if prev_hash != new_hash:
88 model.hash = new_hash
88 model.hash = new_hash
89 model.save()
89 model.save()
90 return True
90 return True
91 return False
91 return False
92
92
93
93
94 def index(request):
94 def index(request):
95 kwargs = {'no_sidebar': True}
95 kwargs = {'no_sidebar': True}
96
96
97 return render(request, 'index.html', kwargs)
97 return render(request, 'index.html', kwargs)
98
98
99
99
100 def locations(request):
100 def locations(request):
101
101
102 page = request.GET.get('page')
102 page = request.GET.get('page')
103 order = ('name',)
103 order = ('name',)
104
104
105 kwargs = get_paginator(Location, page, order)
105 kwargs = get_paginator(Location, page, order)
106
106
107 kwargs['keys'] = ['name', 'description']
107 kwargs['keys'] = ['name', 'description']
108 kwargs['title'] = 'Radar System'
108 kwargs['title'] = 'Radar System'
109 kwargs['suptitle'] = 'List'
109 kwargs['suptitle'] = 'List'
110 kwargs['no_sidebar'] = True
110 kwargs['no_sidebar'] = True
111
111
112 return render(request, 'base_list.html', kwargs)
112 return render(request, 'base_list.html', kwargs)
113
113
114
114
115 def location(request, id_loc):
115 def location(request, id_loc):
116
116
117 location = get_object_or_404(Location, pk=id_loc)
117 location = get_object_or_404(Location, pk=id_loc)
118
118
119 kwargs = {}
119 kwargs = {}
120 kwargs['location'] = location
120 kwargs['location'] = location
121 kwargs['location_keys'] = ['name', 'description']
121 kwargs['location_keys'] = ['name', 'description']
122
122
123 kwargs['title'] = 'Location'
123 kwargs['title'] = 'Location'
124 kwargs['suptitle'] = 'Details'
124 kwargs['suptitle'] = 'Details'
125
125
126 return render(request, 'location.html', kwargs)
126 return render(request, 'location.html', kwargs)
127
127
128
128
129 @login_required
129 @login_required
130 def location_new(request):
130 def location_new(request):
131
131
132 if request.method == 'GET':
132 if request.method == 'GET':
133 form = LocationForm()
133 form = LocationForm()
134
134
135 if request.method == 'POST':
135 if request.method == 'POST':
136 form = LocationForm(request.POST)
136 form = LocationForm(request.POST)
137
137
138 if form.is_valid():
138 if form.is_valid():
139 form.save()
139 form.save()
140 return redirect('url_locations')
140 return redirect('url_locations')
141
141
142 kwargs = {}
142 kwargs = {}
143 kwargs['form'] = form
143 kwargs['form'] = form
144 kwargs['title'] = 'Radar System'
144 kwargs['title'] = 'Radar System'
145 kwargs['suptitle'] = 'New'
145 kwargs['suptitle'] = 'New'
146 kwargs['button'] = 'Create'
146 kwargs['button'] = 'Create'
147
147
148 return render(request, 'base_edit.html', kwargs)
148 return render(request, 'base_edit.html', kwargs)
149
149
150
150
151 @login_required
151 @login_required
152 def location_edit(request, id_loc):
152 def location_edit(request, id_loc):
153
153
154 location = get_object_or_404(Location, pk=id_loc)
154 location = get_object_or_404(Location, pk=id_loc)
155
155
156 if request.method == 'GET':
156 if request.method == 'GET':
157 form = LocationForm(instance=location)
157 form = LocationForm(instance=location)
158
158
159 if request.method == 'POST':
159 if request.method == 'POST':
160 form = LocationForm(request.POST, instance=location)
160 form = LocationForm(request.POST, instance=location)
161
161
162 if form.is_valid():
162 if form.is_valid():
163 form.save()
163 form.save()
164 return redirect('url_locations')
164 return redirect('url_locations')
165
165
166 kwargs = {}
166 kwargs = {}
167 kwargs['form'] = form
167 kwargs['form'] = form
168 kwargs['title'] = 'Location'
168 kwargs['title'] = 'Location'
169 kwargs['suptitle'] = 'Edit'
169 kwargs['suptitle'] = 'Edit'
170 kwargs['button'] = 'Update'
170 kwargs['button'] = 'Update'
171
171
172 return render(request, 'base_edit.html', kwargs)
172 return render(request, 'base_edit.html', kwargs)
173
173
174
174
175 @login_required
175 @login_required
176 def location_delete(request, id_loc):
176 def location_delete(request, id_loc):
177
177
178 location = get_object_or_404(Location, pk=id_loc)
178 location = get_object_or_404(Location, pk=id_loc)
179
179
180 if request.method == 'POST':
180 if request.method == 'POST':
181
181
182 if is_developer(request.user):
182 if is_developer(request.user):
183 location.delete()
183 location.delete()
184 return redirect('url_locations')
184 return redirect('url_locations')
185
185
186 messages.error(request, 'Not enough permission to delete this object')
186 messages.error(request, 'Not enough permission to delete this object')
187 return redirect(location.get_absolute_url())
187 return redirect(location.get_absolute_url())
188
188
189 kwargs = {
189 kwargs = {
190 'title': 'Delete',
190 'title': 'Delete',
191 'suptitle': 'Location',
191 'suptitle': 'Location',
192 'object': location,
192 'object': location,
193 'delete': True
193 'delete': True
194 }
194 }
195
195
196 return render(request, 'confirm.html', kwargs)
196 return render(request, 'confirm.html', kwargs)
197
197
198
198
199 def devices(request):
199 def devices(request):
200
200
201 page = request.GET.get('page')
201 page = request.GET.get('page')
202 order = ('location', 'device_type')
202 order = ('location', 'device_type')
203
203
204 filters = request.GET.copy()
204 filters = request.GET.copy()
205 kwargs = get_paginator(Device, page, order, filters)
205 kwargs = get_paginator(Device, page, order, filters)
206 form = FilterForm(initial=request.GET, extra_fields=['tags'])
206 form = FilterForm(initial=request.GET, extra_fields=['tags'])
207
207
208 kwargs['keys'] = ['device_type', 'location',
208 kwargs['keys'] = ['device_type', 'location',
209 'ip_address', 'port_address', 'actions']
209 'ip_address', 'port_address', 'actions']
210 kwargs['title'] = 'Device'
210 kwargs['title'] = 'Device'
211 kwargs['suptitle'] = 'List'
211 kwargs['suptitle'] = 'List'
212 kwargs['no_sidebar'] = True
212 kwargs['no_sidebar'] = True
213 kwargs['form'] = form
213 kwargs['form'] = form
214 kwargs['add_url'] = reverse('url_add_device')
214 kwargs['add_url'] = reverse('url_add_device')
215 filters.pop('page', None)
215 filters.pop('page', None)
216 kwargs['q'] = urlencode(filters)
216 kwargs['q'] = urlencode(filters)
217 kwargs['menu_devices'] = 'active'
217 kwargs['menu_devices'] = 'active'
218 return render(request, 'base_list.html', kwargs)
218 return render(request, 'base_list.html', kwargs)
219
219
220
220
221 def device(request, id_dev):
221 def device(request, id_dev):
222
222
223 device = get_object_or_404(Device, pk=id_dev)
223 device = get_object_or_404(Device, pk=id_dev)
224
224
225 kwargs = {}
225 kwargs = {}
226 kwargs['device'] = device
226 kwargs['device'] = device
227 kwargs['device_keys'] = ['device_type',
227 kwargs['device_keys'] = ['device_type',
228 'ip_address', 'port_address', 'description']
228 'ip_address', 'port_address', 'description']
229
229
230 kwargs['title'] = 'Device'
230 kwargs['title'] = 'Device'
231 kwargs['suptitle'] = 'Details'
231 kwargs['suptitle'] = 'Details'
232 kwargs['menu_devices'] = 'active'
232 kwargs['menu_devices'] = 'active'
233
233
234 return render(request, 'device.html', kwargs)
234 return render(request, 'device.html', kwargs)
235
235
236
236
237 @login_required
237 @login_required
238 def device_new(request):
238 def device_new(request):
239
239
240 if request.method == 'GET':
240 if request.method == 'GET':
241 form = DeviceForm()
241 form = DeviceForm()
242
242
243 if request.method == 'POST':
243 if request.method == 'POST':
244 form = DeviceForm(request.POST)
244 form = DeviceForm(request.POST)
245
245
246 if form.is_valid():
246 if form.is_valid():
247 form.save()
247 form.save()
248 return redirect('url_devices')
248 return redirect('url_devices')
249
249
250 kwargs = {}
250 kwargs = {}
251 kwargs['form'] = form
251 kwargs['form'] = form
252 kwargs['title'] = 'Device'
252 kwargs['title'] = 'Device'
253 kwargs['suptitle'] = 'New'
253 kwargs['suptitle'] = 'New'
254 kwargs['button'] = 'Create'
254 kwargs['button'] = 'Create'
255 kwargs['menu_devices'] = 'active'
255 kwargs['menu_devices'] = 'active'
256
256
257 return render(request, 'base_edit.html', kwargs)
257 return render(request, 'base_edit.html', kwargs)
258
258
259
259
260 @login_required
260 @login_required
261 def device_edit(request, id_dev):
261 def device_edit(request, id_dev):
262
262
263 device = get_object_or_404(Device, pk=id_dev)
263 device = get_object_or_404(Device, pk=id_dev)
264
264
265 if request.method == 'GET':
265 if request.method == 'GET':
266 form = DeviceForm(instance=device)
266 form = DeviceForm(instance=device)
267
267
268 if request.method == 'POST':
268 if request.method == 'POST':
269 form = DeviceForm(request.POST, instance=device)
269 form = DeviceForm(request.POST, instance=device)
270
270
271 if form.is_valid():
271 if form.is_valid():
272 form.save()
272 form.save()
273 return redirect(device.get_absolute_url())
273 return redirect(device.get_absolute_url())
274
274
275 kwargs = {}
275 kwargs = {}
276 kwargs['form'] = form
276 kwargs['form'] = form
277 kwargs['title'] = 'Device'
277 kwargs['title'] = 'Device'
278 kwargs['suptitle'] = 'Edit'
278 kwargs['suptitle'] = 'Edit'
279 kwargs['button'] = 'Update'
279 kwargs['button'] = 'Update'
280 kwargs['menu_devices'] = 'active'
280 kwargs['menu_devices'] = 'active'
281
281
282 return render(request, 'base_edit.html', kwargs)
282 return render(request, 'base_edit.html', kwargs)
283
283
284
284
285 @login_required
285 @login_required
286 def device_delete(request, id_dev):
286 def device_delete(request, id_dev):
287
287
288 device = get_object_or_404(Device, pk=id_dev)
288 device = get_object_or_404(Device, pk=id_dev)
289
289
290 if request.method == 'POST':
290 if request.method == 'POST':
291
291
292 if is_developer(request.user):
292 if is_developer(request.user):
293 device.delete()
293 device.delete()
294 return redirect('url_devices')
294 return redirect('url_devices')
295
295
296 messages.error(request, 'Not enough permission to delete this object')
296 messages.error(request, 'Not enough permission to delete this object')
297 return redirect(device.get_absolute_url())
297 return redirect(device.get_absolute_url())
298
298
299 kwargs = {
299 kwargs = {
300 'title': 'Delete',
300 'title': 'Delete',
301 'suptitle': 'Device',
301 'suptitle': 'Device',
302 'object': device,
302 'object': device,
303 'delete': True
303 'delete': True
304 }
304 }
305 kwargs['menu_devices'] = 'active'
305 kwargs['menu_devices'] = 'active'
306
306
307 return render(request, 'confirm.html', kwargs)
307 return render(request, 'confirm.html', kwargs)
308
308
309
309
310 @login_required
310 @login_required
311 def device_change_ip(request, id_dev):
311 def device_change_ip(request, id_dev):
312
312
313 device = get_object_or_404(Device, pk=id_dev)
313 device = get_object_or_404(Device, pk=id_dev)
314
314
315 if request.method == 'POST':
315 if request.method == 'POST':
316
316
317 if is_developer(request.user):
317 if is_developer(request.user):
318 device.change_ip(**request.POST.dict())
318 device.change_ip(**request.POST.dict())
319 level, message = device.message.split('|')
319 level, message = device.message.split('|')
320 messages.add_message(request, level, message)
320 messages.add_message(request, level, message)
321 else:
321 else:
322 messages.error(
322 messages.error(
323 request, 'Not enough permission to delete this object')
323 request, 'Not enough permission to delete this object')
324 return redirect(device.get_absolute_url())
324 return redirect(device.get_absolute_url())
325
325
326 kwargs = {
326 kwargs = {
327 'title': 'Device',
327 'title': 'Device',
328 'suptitle': 'Change IP',
328 'suptitle': 'Change IP',
329 'object': device,
329 'object': device,
330 'previous': device.get_absolute_url(),
330 'previous': device.get_absolute_url(),
331 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
331 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
332 'message': ' ',
332 'message': ' ',
333 }
333 }
334 kwargs['menu_devices'] = 'active'
334 kwargs['menu_devices'] = 'active'
335
335
336 return render(request, 'confirm.html', kwargs)
336 return render(request, 'confirm.html', kwargs)
337
337
338
338
339 def campaigns(request):
339 def campaigns(request):
340
340
341 page = request.GET.get('page')
341 page = request.GET.get('page')
342 order = ('-start_date',)
342 order = ('-start_date',)
343 filters = request.GET.copy()
343 filters = request.GET.copy()
344
344
345 kwargs = get_paginator(Campaign, page, order, filters)
345 kwargs = get_paginator(Campaign, page, order, filters)
346
346
347 form = FilterForm(initial=request.GET, extra_fields=[
347 form = FilterForm(initial=request.GET, extra_fields=[
348 'range_date', 'tags', 'template'])
348 'range_date', 'tags', 'template'])
349 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
349 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
350 kwargs['title'] = 'Campaign'
350 kwargs['title'] = 'Campaign'
351 kwargs['suptitle'] = 'List'
351 kwargs['suptitle'] = 'List'
352 kwargs['no_sidebar'] = True
352 kwargs['no_sidebar'] = True
353 kwargs['form'] = form
353 kwargs['form'] = form
354 kwargs['add_url'] = reverse('url_add_campaign')
354 kwargs['add_url'] = reverse('url_add_campaign')
355 filters.pop('page', None)
355 filters.pop('page', None)
356 kwargs['q'] = urlencode(filters)
356 kwargs['q'] = urlencode(filters)
357 kwargs['menu_campaigns'] = 'active'
357 kwargs['menu_campaigns'] = 'active'
358
358
359 return render(request, 'base_list.html', kwargs)
359 return render(request, 'base_list.html', kwargs)
360
360
361
361
362 def campaign(request, id_camp):
362 def campaign(request, id_camp):
363
363
364 campaign = get_object_or_404(Campaign, pk=id_camp)
364 campaign = get_object_or_404(Campaign, pk=id_camp)
365 experiments = Experiment.objects.filter(campaign=campaign)
365 experiments = Experiment.objects.filter(campaign=campaign)
366
366
367 form = CampaignForm(instance=campaign)
367 form = CampaignForm(instance=campaign)
368
368
369 kwargs = {}
369 kwargs = {}
370 kwargs['campaign'] = campaign
370 kwargs['campaign'] = campaign
371 kwargs['campaign_keys'] = ['template', 'name',
371 kwargs['campaign_keys'] = ['template', 'name',
372 'start_date', 'end_date', 'tags', 'description']
372 'start_date', 'end_date', 'tags', 'description']
373
373
374 kwargs['experiments'] = experiments
374 kwargs['experiments'] = experiments
375 kwargs['experiment_keys'] = [
375 kwargs['experiment_keys'] = [
376 'name', 'radar_system', 'start_time', 'end_time']
376 'name', 'radar_system', 'start_time', 'end_time']
377
377
378 kwargs['title'] = 'Campaign'
378 kwargs['title'] = 'Campaign'
379 kwargs['suptitle'] = 'Details'
379 kwargs['suptitle'] = 'Details'
380
380
381 kwargs['form'] = form
381 kwargs['form'] = form
382 kwargs['button'] = 'Add Experiment'
382 kwargs['button'] = 'Add Experiment'
383 kwargs['menu_campaigns'] = 'active'
383 kwargs['menu_campaigns'] = 'active'
384
384
385 return render(request, 'campaign.html', kwargs)
385 return render(request, 'campaign.html', kwargs)
386
386
387
387
388 @login_required
388 @login_required
389 def campaign_new(request):
389 def campaign_new(request):
390
390
391 kwargs = {}
391 kwargs = {}
392
392
393 if request.method == 'GET':
393 if request.method == 'GET':
394
394
395 if 'template' in request.GET:
395 if 'template' in request.GET:
396 if request.GET['template'] == '0':
396 if request.GET['template'] == '0':
397 form = NewForm(initial={'create_from': 2},
397 form = NewForm(initial={'create_from': 2},
398 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
398 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
399 else:
399 else:
400 kwargs['button'] = 'Create'
400 kwargs['button'] = 'Create'
401 kwargs['experiments'] = Configuration.objects.filter(
401 kwargs['experiments'] = Configuration.objects.filter(
402 experiment=request.GET['template'])
402 experiment=request.GET['template'])
403 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
403 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
404 camp = Campaign.objects.get(pk=request.GET['template'])
404 camp = Campaign.objects.get(pk=request.GET['template'])
405 form = CampaignForm(instance=camp,
405 form = CampaignForm(instance=camp,
406 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
406 initial={'name': '{}_{:%Y%m%d}'.format(camp.name, datetime.now()),
407 'template': False})
407 'template': False})
408 elif 'blank' in request.GET:
408 elif 'blank' in request.GET:
409 kwargs['button'] = 'Create'
409 kwargs['button'] = 'Create'
410 form = CampaignForm()
410 form = CampaignForm()
411 else:
411 else:
412 form = NewForm()
412 form = NewForm()
413
413
414 if request.method == 'POST':
414 if request.method == 'POST':
415 kwargs['button'] = 'Create'
415 kwargs['button'] = 'Create'
416 post = request.POST.copy()
416 post = request.POST.copy()
417 experiments = []
417 experiments = []
418
418
419 for id_exp in post.getlist('experiments'):
419 for id_exp in post.getlist('experiments'):
420 exp = Experiment.objects.get(pk=id_exp)
420 exp = Experiment.objects.get(pk=id_exp)
421 new_exp = exp.clone(template=False)
421 new_exp = exp.clone(template=False)
422 experiments.append(new_exp)
422 experiments.append(new_exp)
423
423
424 post.setlist('experiments', [])
424 post.setlist('experiments', [])
425
425
426 form = CampaignForm(post)
426 form = CampaignForm(post)
427
427
428 if form.is_valid():
428 if form.is_valid():
429 campaign = form.save(commit=False)
429 campaign = form.save(commit=False)
430 campaign.author = request.user
430 campaign.author = request.user
431 for exp in experiments:
431 for exp in experiments:
432 campaign.experiments.add(exp)
432 campaign.experiments.add(exp)
433 campaign.save()
433 campaign.save()
434 return redirect('url_campaign', id_camp=campaign.id)
434 return redirect('url_campaign', id_camp=campaign.id)
435
435
436 kwargs['form'] = form
436 kwargs['form'] = form
437 kwargs['title'] = 'Campaign'
437 kwargs['title'] = 'Campaign'
438 kwargs['suptitle'] = 'New'
438 kwargs['suptitle'] = 'New'
439 kwargs['menu_campaigns'] = 'active'
439 kwargs['menu_campaigns'] = 'active'
440
440
441 return render(request, 'campaign_edit.html', kwargs)
441 return render(request, 'campaign_edit.html', kwargs)
442
442
443
443
444 @login_required
444 @login_required
445 def campaign_edit(request, id_camp):
445 def campaign_edit(request, id_camp):
446
446
447 campaign = get_object_or_404(Campaign, pk=id_camp)
447 campaign = get_object_or_404(Campaign, pk=id_camp)
448
448
449 if request.method == 'GET':
449 if request.method == 'GET':
450 form = CampaignForm(instance=campaign)
450 form = CampaignForm(instance=campaign)
451
451
452 if request.method == 'POST':
452 if request.method == 'POST':
453 exps = campaign.experiments.all().values_list('pk', flat=True)
453 exps = campaign.experiments.all().values_list('pk', flat=True)
454 post = request.POST.copy()
454 post = request.POST.copy()
455 new_exps = post.getlist('experiments')
455 new_exps = post.getlist('experiments')
456 post.setlist('experiments', [])
456 post.setlist('experiments', [])
457 form = CampaignForm(post, instance=campaign)
457 form = CampaignForm(post, instance=campaign)
458
458
459 if form.is_valid():
459 if form.is_valid():
460 camp = form.save()
460 camp = form.save()
461 for id_exp in new_exps:
461 for id_exp in new_exps:
462 if int(id_exp) in exps:
462 if int(id_exp) in exps:
463 exps.pop(id_exp)
463 exps.pop(id_exp)
464 else:
464 else:
465 exp = Experiment.objects.get(pk=id_exp)
465 exp = Experiment.objects.get(pk=id_exp)
466 if exp.template:
466 if exp.template:
467 camp.experiments.add(exp.clone(template=False))
467 camp.experiments.add(exp.clone(template=False))
468 else:
468 else:
469 camp.experiments.add(exp)
469 camp.experiments.add(exp)
470
470
471 for id_exp in exps:
471 for id_exp in exps:
472 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
472 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
473
473
474 return redirect('url_campaign', id_camp=id_camp)
474 return redirect('url_campaign', id_camp=id_camp)
475
475
476 kwargs = {}
476 kwargs = {}
477 kwargs['form'] = form
477 kwargs['form'] = form
478 kwargs['title'] = 'Campaign'
478 kwargs['title'] = 'Campaign'
479 kwargs['suptitle'] = 'Edit'
479 kwargs['suptitle'] = 'Edit'
480 kwargs['button'] = 'Update'
480 kwargs['button'] = 'Update'
481 kwargs['menu_campaigns'] = 'active'
481 kwargs['menu_campaigns'] = 'active'
482
482
483 return render(request, 'campaign_edit.html', kwargs)
483 return render(request, 'campaign_edit.html', kwargs)
484
484
485
485
486 @login_required
486 @login_required
487 def campaign_delete(request, id_camp):
487 def campaign_delete(request, id_camp):
488
488
489 campaign = get_object_or_404(Campaign, pk=id_camp)
489 campaign = get_object_or_404(Campaign, pk=id_camp)
490
490
491 if request.method == 'POST':
491 if request.method == 'POST':
492 if is_developer(request.user):
492 if is_developer(request.user):
493
493
494 for exp in campaign.experiments.all():
494 for exp in campaign.experiments.all():
495 for conf in Configuration.objects.filter(experiment=exp):
495 for conf in Configuration.objects.filter(experiment=exp):
496 conf.delete()
496 conf.delete()
497 exp.delete()
497 exp.delete()
498 campaign.delete()
498 campaign.delete()
499
499
500 return redirect('url_campaigns')
500 return redirect('url_campaigns')
501
501
502 messages.error(request, 'Not enough permission to delete this object')
502 messages.error(request, 'Not enough permission to delete this object')
503 return redirect(campaign.get_absolute_url())
503 return redirect(campaign.get_absolute_url())
504
504
505 kwargs = {
505 kwargs = {
506 'title': 'Delete',
506 'title': 'Delete',
507 'suptitle': 'Campaign',
507 'suptitle': 'Campaign',
508 'object': campaign,
508 'object': campaign,
509 'delete': True
509 'delete': True
510 }
510 }
511 kwargs['menu_campaigns'] = 'active'
511 kwargs['menu_campaigns'] = 'active'
512
512
513 return render(request, 'confirm.html', kwargs)
513 return render(request, 'confirm.html', kwargs)
514
514
515
515
516 @login_required
516 @login_required
517 def campaign_export(request, id_camp):
517 def campaign_export(request, id_camp):
518
518
519 campaign = get_object_or_404(Campaign, pk=id_camp)
519 campaign = get_object_or_404(Campaign, pk=id_camp)
520 content = campaign.parms_to_dict()
520 content = campaign.parms_to_dict()
521 content_type = 'application/json'
521 content_type = 'application/json'
522 filename = '%s_%s.json' % (campaign.name, campaign.id)
522 filename = '%s_%s.json' % (campaign.name, campaign.id)
523
523
524 response = HttpResponse(content_type=content_type)
524 response = HttpResponse(content_type=content_type)
525 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
525 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
526 response.write(json.dumps(content, indent=2))
526 response.write(json.dumps(content, indent=2))
527
527
528 return response
528 return response
529
529
530
530
531 @login_required
531 @login_required
532 def campaign_import(request, id_camp):
532 def campaign_import(request, id_camp):
533
533
534 campaign = get_object_or_404(Campaign, pk=id_camp)
534 campaign = get_object_or_404(Campaign, pk=id_camp)
535
535
536 if request.method == 'GET':
536 if request.method == 'GET':
537 file_form = UploadFileForm()
537 file_form = UploadFileForm()
538
538
539 if request.method == 'POST':
539 if request.method == 'POST':
540 file_form = UploadFileForm(request.POST, request.FILES)
540 file_form = UploadFileForm(request.POST, request.FILES)
541
541
542 if file_form.is_valid():
542 if file_form.is_valid():
543 new_camp = campaign.dict_to_parms(
543 new_camp = campaign.dict_to_parms(
544 json.load(request.FILES['file']), CONF_MODELS)
544 json.load(request.FILES['file']), CONF_MODELS)
545 messages.success(
545 messages.success(
546 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
546 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
547 return redirect(new_camp.get_absolute_url_edit())
547 return redirect(new_camp.get_absolute_url_edit())
548
548
549 messages.error(request, "Could not import parameters from file")
549 messages.error(request, "Could not import parameters from file")
550
550
551 kwargs = {}
551 kwargs = {}
552 kwargs['title'] = 'Campaign'
552 kwargs['title'] = 'Campaign'
553 kwargs['form'] = file_form
553 kwargs['form'] = file_form
554 kwargs['suptitle'] = 'Importing file'
554 kwargs['suptitle'] = 'Importing file'
555 kwargs['button'] = 'Import'
555 kwargs['button'] = 'Import'
556 kwargs['menu_campaigns'] = 'active'
556 kwargs['menu_campaigns'] = 'active'
557
557
558 return render(request, 'campaign_import.html', kwargs)
558 return render(request, 'campaign_import.html', kwargs)
559
559
560
560
561 def experiments(request):
561 def experiments(request):
562
562
563 page = request.GET.get('page')
563 page = request.GET.get('page')
564 order = ('location',)
564 order = ('location',)
565 filters = request.GET.copy()
565 filters = request.GET.copy()
566
566
567 if 'my experiments' in filters:
567 if 'my experiments' in filters:
568 filters.pop('my experiments', None)
568 filters.pop('my experiments', None)
569 filters['mine'] = request.user.id
569 filters['mine'] = request.user.id
570
570
571 kwargs = get_paginator(Experiment, page, order, filters)
571 kwargs = get_paginator(Experiment, page, order, filters)
572
572
573 fields = ['tags', 'template']
573 fields = ['tags', 'template']
574 if request.user.is_authenticated:
574 if request.user.is_authenticated:
575 fields.append('my experiments')
575 fields.append('my experiments')
576
576
577 form = FilterForm(initial=request.GET, extra_fields=fields)
577 form = FilterForm(initial=request.GET, extra_fields=fields)
578
578
579 kwargs['keys'] = ['name', 'radar_system',
579 kwargs['keys'] = ['name', 'radar_system', 'actions']
580 'start_time', 'end_time', 'actions']
581 kwargs['title'] = 'Experiment'
580 kwargs['title'] = 'Experiment'
582 kwargs['suptitle'] = 'List'
581 kwargs['suptitle'] = 'List'
583 kwargs['no_sidebar'] = True
582 kwargs['no_sidebar'] = True
584 kwargs['form'] = form
583 kwargs['form'] = form
585 kwargs['add_url'] = reverse('url_add_experiment')
584 kwargs['add_url'] = reverse('url_add_experiment')
586 filters = request.GET.copy()
585 filters = request.GET.copy()
587 filters.pop('page', None)
586 filters.pop('page', None)
588 kwargs['q'] = urlencode(filters)
587 kwargs['q'] = urlencode(filters)
589 kwargs['menu_experiments'] = 'active'
588 kwargs['menu_experiments'] = 'active'
590
589
591 return render(request, 'base_list.html', kwargs)
590 return render(request, 'base_list.html', kwargs)
592
591
593
592
594 def experiment(request, id_exp):
593 def experiment(request, id_exp):
595
594
596 experiment = get_object_or_404(Experiment, pk=id_exp)
595 experiment = get_object_or_404(Experiment, pk=id_exp)
597
596
598 configurations = Configuration.objects.filter(
597 configurations = Configuration.objects.filter(
599 experiment=experiment, type=0)
598 experiment=experiment, type=0)
600
599
601 kwargs = {}
600 kwargs = {}
602
601
603 kwargs['experiment_keys'] = ['template', 'radar_system',
602 kwargs['experiment_keys'] = ['template', 'radar_system', 'name']
604 'name', 'start_time', 'end_time']
605 kwargs['experiment'] = experiment
603 kwargs['experiment'] = experiment
606 kwargs['configuration_keys'] = ['name', 'device__ip_address',
604 kwargs['configuration_keys'] = ['name', 'device__ip_address',
607 'device__port_address', 'device__status']
605 'device__port_address', 'device__status']
608 kwargs['configurations'] = configurations
606 kwargs['configurations'] = configurations
609 kwargs['title'] = 'Experiment'
607 kwargs['title'] = 'Experiment'
610 kwargs['suptitle'] = 'Details'
608 kwargs['suptitle'] = 'Details'
611 kwargs['button'] = 'Add Configuration'
609 kwargs['button'] = 'Add Configuration'
612 kwargs['menu_experiments'] = 'active'
610 kwargs['menu_experiments'] = 'active'
613
611
614 ###### SIDEBAR ######
612 ###### SIDEBAR ######
615 kwargs.update(sidebar(experiment=experiment))
613 kwargs.update(sidebar(experiment=experiment))
616
614
617 return render(request, 'experiment.html', kwargs)
615 return render(request, 'experiment.html', kwargs)
618
616
619
617
620 @login_required
618 @login_required
621 def experiment_new(request, id_camp=None):
619 def experiment_new(request, id_camp=None):
622
620
623 if not is_developer(request.user):
621 if not is_developer(request.user):
624 messages.error(
622 messages.error(
625 request, 'Developer required, to create new Experiments')
623 request, 'Developer required, to create new Experiments')
626 return redirect('index')
624 return redirect('index')
627 kwargs = {}
625 kwargs = {}
628
626
629 if request.method == 'GET':
627 if request.method == 'GET':
630 if 'template' in request.GET:
628 if 'template' in request.GET:
631 if request.GET['template'] == '0':
629 if request.GET['template'] == '0':
632 form = NewForm(initial={'create_from': 2},
630 form = NewForm(initial={'create_from': 2},
633 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
631 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
634 else:
632 else:
635 kwargs['button'] = 'Create'
633 kwargs['button'] = 'Create'
636 kwargs['configurations'] = Configuration.objects.filter(
634 kwargs['configurations'] = Configuration.objects.filter(
637 experiment=request.GET['template'])
635 experiment=request.GET['template'])
638 kwargs['configuration_keys'] = ['name', 'device__name',
636 kwargs['configuration_keys'] = ['name', 'device__name',
639 'device__ip_address', 'device__port_address']
637 'device__ip_address', 'device__port_address']
640 exp = Experiment.objects.get(pk=request.GET['template'])
638 exp = Experiment.objects.get(pk=request.GET['template'])
641 form = ExperimentForm(instance=exp,
639 form = ExperimentForm(instance=exp,
642 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
640 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
643 'template': False})
641 'template': False})
644 elif 'blank' in request.GET:
642 elif 'blank' in request.GET:
645 kwargs['button'] = 'Create'
643 kwargs['button'] = 'Create'
646 form = ExperimentForm()
644 form = ExperimentForm()
647 else:
645 else:
648 form = NewForm()
646 form = NewForm()
649
647
650 if request.method == 'POST':
648 if request.method == 'POST':
651 form = ExperimentForm(request.POST)
649 form = ExperimentForm(request.POST)
652 if form.is_valid():
650 if form.is_valid():
653 experiment = form.save(commit=False)
651 experiment = form.save(commit=False)
654 experiment.author = request.user
652 experiment.author = request.user
655 experiment.save()
653 experiment.save()
656
654
657 if 'template' in request.GET:
655 if 'template' in request.GET:
658 configurations = Configuration.objects.filter(
656 configurations = Configuration.objects.filter(
659 experiment=request.GET['template'], type=0)
657 experiment=request.GET['template'], type=0)
660 for conf in configurations:
658 for conf in configurations:
661 conf.clone(experiment=experiment, template=False)
659 conf.clone(experiment=experiment, template=False)
662
660
663 return redirect('url_experiment', id_exp=experiment.id)
661 return redirect('url_experiment', id_exp=experiment.id)
664
662
665 kwargs['form'] = form
663 kwargs['form'] = form
666 kwargs['title'] = 'Experiment'
664 kwargs['title'] = 'Experiment'
667 kwargs['suptitle'] = 'New'
665 kwargs['suptitle'] = 'New'
668 kwargs['menu_experiments'] = 'active'
666 kwargs['menu_experiments'] = 'active'
669
667
670 return render(request, 'experiment_edit.html', kwargs)
668 return render(request, 'experiment_edit.html', kwargs)
671
669
672
670
673 @login_required
671 @login_required
674 def experiment_edit(request, id_exp):
672 def experiment_edit(request, id_exp):
675
673
676 experiment = get_object_or_404(Experiment, pk=id_exp)
674 experiment = get_object_or_404(Experiment, pk=id_exp)
677
675
678 if request.method == 'GET':
676 if request.method == 'GET':
679 form = ExperimentForm(instance=experiment)
677 form = ExperimentForm(instance=experiment)
680
678
681 if request.method == 'POST':
679 if request.method == 'POST':
682 form = ExperimentForm(request.POST, instance=experiment)
680 form = ExperimentForm(request.POST, instance=experiment)
683
681
684 if form.is_valid():
682 if form.is_valid():
685 experiment = form.save()
683 experiment = form.save()
686 return redirect('url_experiment', id_exp=experiment.id)
684 return redirect('url_experiment', id_exp=experiment.id)
687
685
688 kwargs = {}
686 kwargs = {}
689 kwargs['form'] = form
687 kwargs['form'] = form
690 kwargs['title'] = 'Experiment'
688 kwargs['title'] = 'Experiment'
691 kwargs['suptitle'] = 'Edit'
689 kwargs['suptitle'] = 'Edit'
692 kwargs['button'] = 'Update'
690 kwargs['button'] = 'Update'
693 kwargs['menu_experiments'] = 'active'
691 kwargs['menu_experiments'] = 'active'
694
692
695 return render(request, 'experiment_edit.html', kwargs)
693 return render(request, 'experiment_edit.html', kwargs)
696
694
697
695
698 @login_required
696 @login_required
699 def experiment_delete(request, id_exp):
697 def experiment_delete(request, id_exp):
700
698
701 experiment = get_object_or_404(Experiment, pk=id_exp)
699 experiment = get_object_or_404(Experiment, pk=id_exp)
702
700
703 if request.method == 'POST':
701 if request.method == 'POST':
704 if is_developer(request.user):
702 if is_developer(request.user):
705 for conf in Configuration.objects.filter(experiment=experiment):
703 for conf in Configuration.objects.filter(experiment=experiment):
706 conf.delete()
704 conf.delete()
707 experiment.delete()
705 experiment.delete()
708 return redirect('url_experiments')
706 return redirect('url_experiments')
709
707
710 messages.error(request, 'Not enough permission to delete this object')
708 messages.error(request, 'Not enough permission to delete this object')
711 return redirect(experiment.get_absolute_url())
709 return redirect(experiment.get_absolute_url())
712
710
713 kwargs = {
711 kwargs = {
714 'title': 'Delete',
712 'title': 'Delete',
715 'suptitle': 'Experiment',
713 'suptitle': 'Experiment',
716 'object': experiment,
714 'object': experiment,
717 'delete': True
715 'delete': True
718 }
716 }
719
717
720 return render(request, 'confirm.html', kwargs)
718 return render(request, 'confirm.html', kwargs)
721
719
722
720
723 @login_required
721 @login_required
724 def experiment_export(request, id_exp):
722 def experiment_export(request, id_exp):
725
723
726 experiment = get_object_or_404(Experiment, pk=id_exp)
724 experiment = get_object_or_404(Experiment, pk=id_exp)
727 content = experiment.parms_to_dict()
725 content = experiment.parms_to_dict()
728 content_type = 'application/json'
726 content_type = 'application/json'
729 filename = '%s_%s.json' % (experiment.name, experiment.id)
727 filename = '%s_%s.json' % (experiment.name, experiment.id)
730
728
731 response = HttpResponse(content_type=content_type)
729 response = HttpResponse(content_type=content_type)
732 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
730 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
733 response.write(json.dumps(content, indent=2))
731 response.write(json.dumps(content, indent=2))
734
732
735 return response
733 return response
736
734
737
735
738 @login_required
736 @login_required
739 def experiment_import(request, id_exp):
737 def experiment_import(request, id_exp):
740
738
741 experiment = get_object_or_404(Experiment, pk=id_exp)
739 experiment = get_object_or_404(Experiment, pk=id_exp)
742 configurations = Configuration.objects.filter(experiment=experiment)
740 configurations = Configuration.objects.filter(experiment=experiment)
743
741
744 if request.method == 'GET':
742 if request.method == 'GET':
745 file_form = UploadFileForm()
743 file_form = UploadFileForm()
746
744
747 if request.method == 'POST':
745 if request.method == 'POST':
748 file_form = UploadFileForm(request.POST, request.FILES)
746 file_form = UploadFileForm(request.POST, request.FILES)
749
747
750 if file_form.is_valid():
748 if file_form.is_valid():
751 new_exp = experiment.dict_to_parms(
749 new_exp = experiment.dict_to_parms(
752 json.load(request.FILES['file']), CONF_MODELS)
750 json.load(request.FILES['file']), CONF_MODELS)
753 messages.success(
751 messages.success(
754 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
752 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
755 return redirect(new_exp.get_absolute_url_edit())
753 return redirect(new_exp.get_absolute_url_edit())
756
754
757 messages.error(request, "Could not import parameters from file")
755 messages.error(request, "Could not import parameters from file")
758
756
759 kwargs = {}
757 kwargs = {}
760 kwargs['title'] = 'Experiment'
758 kwargs['title'] = 'Experiment'
761 kwargs['form'] = file_form
759 kwargs['form'] = file_form
762 kwargs['suptitle'] = 'Importing file'
760 kwargs['suptitle'] = 'Importing file'
763 kwargs['button'] = 'Import'
761 kwargs['button'] = 'Import'
764 kwargs['menu_experiments'] = 'active'
762 kwargs['menu_experiments'] = 'active'
765
763
766 kwargs.update(sidebar(experiment=experiment))
764 kwargs.update(sidebar(experiment=experiment))
767
765
768 return render(request, 'experiment_import.html', kwargs)
766 return render(request, 'experiment_import.html', kwargs)
769
767
770
768
771 @login_required
769 @login_required
772 def experiment_start(request, id_exp):
770 def experiment_start(request, id_exp):
773
771
774 exp = get_object_or_404(Experiment, pk=id_exp)
772 exp = get_object_or_404(Experiment, pk=id_exp)
775
773
776 if exp.status == 2:
774 if exp.status == 2:
777 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
775 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
778 else:
776 else:
779 exp.status = exp.start()
777 exp.status = exp.start()
780 if exp.status == 0:
778 if exp.status == 0:
781 messages.error(request, 'Experiment {} not start'.format(exp))
779 messages.error(request, 'Experiment {} not start'.format(exp))
782 if exp.status == 2:
780 if exp.status == 2:
783 messages.success(request, 'Experiment {} started'.format(exp))
781 messages.success(request, 'Experiment {} started'.format(exp))
784
782
785 exp.save()
783 exp.save()
786
784
787 return redirect(exp.get_absolute_url())
785 return redirect(exp.get_absolute_url())
788
786
789
787
790 @login_required
788 @login_required
791 def experiment_stop(request, id_exp):
789 def experiment_stop(request, id_exp):
792
790
793 exp = get_object_or_404(Experiment, pk=id_exp)
791 exp = get_object_or_404(Experiment, pk=id_exp)
794
792
795 if exp.status == 2:
793 if exp.status == 2:
796 exp.status = exp.stop()
794 exp.status = exp.stop()
797 exp.save()
795 exp.save()
798 messages.success(request, 'Experiment {} stopped'.format(exp))
796 messages.success(request, 'Experiment {} stopped'.format(exp))
799 else:
797 else:
800 messages.error(request, 'Experiment {} not running'.format(exp))
798 messages.error(request, 'Experiment {} not running'.format(exp))
801
799
802 return redirect(exp.get_absolute_url())
800 return redirect(exp.get_absolute_url())
803
801
804
802
805 def experiment_status(request, id_exp):
803 def experiment_status(request, id_exp):
806
804
807 exp = get_object_or_404(Experiment, pk=id_exp)
805 exp = get_object_or_404(Experiment, pk=id_exp)
808
806
809 exp.get_status()
807 exp.get_status()
810
808
811 return redirect(exp.get_absolute_url())
809 return redirect(exp.get_absolute_url())
812
810
813
811
814 @login_required
812 @login_required
815 def experiment_mix(request, id_exp):
813 def experiment_mix(request, id_exp):
816
814
817 experiment = get_object_or_404(Experiment, pk=id_exp)
815 experiment = get_object_or_404(Experiment, pk=id_exp)
818 rc_confs = [conf for conf in PedestalConfiguration.objects.filter(
816 rc_confs = [conf for conf in PedestalConfiguration.objects.filter(
819 experiment=id_exp,
817 experiment=id_exp,
820 type=0,
818 type=0,
821 mix=False)]
819 mix=False)]
822
820
823 if len(rc_confs) < 2:
821 if len(rc_confs) < 2:
824 messages.warning(
822 messages.warning(
825 request, 'You need at least two RC Configurations to make a mix')
823 request, 'You need at least two RC Configurations to make a mix')
826 return redirect(experiment.get_absolute_url())
824 return redirect(experiment.get_absolute_url())
827
825
828 mix_confs = PedestalConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
826 mix_confs = PedestalConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
829
827
830 if mix_confs:
828 if mix_confs:
831 mix = mix_confs[0]
829 mix = mix_confs[0]
832 else:
830 else:
833 mix = PedestalConfiguration(experiment=experiment,
831 mix = PedestalConfiguration(experiment=experiment,
834 device=rc_confs[0].device,
832 device=rc_confs[0].device,
835 ipp=rc_confs[0].ipp,
833 ipp=rc_confs[0].ipp,
836 clock_in=rc_confs[0].clock_in,
834 clock_in=rc_confs[0].clock_in,
837 clock_divider=rc_confs[0].clock_divider,
835 clock_divider=rc_confs[0].clock_divider,
838 mix=True,
836 mix=True,
839 parameters='')
837 parameters='')
840 mix.save()
838 mix.save()
841
839
842 line_type = RCLineType.objects.get(name='mix')
840 line_type = RCLineType.objects.get(name='mix')
843 print("VIew obteniendo len getlines")
841 print("VIew obteniendo len getlines")
844 print(len(rc_confs[0].get_lines()))
842 print(len(rc_confs[0].get_lines()))
845 for i in range(len(rc_confs[0].get_lines())):
843 for i in range(len(rc_confs[0].get_lines())):
846 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
844 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
847 line.save()
845 line.save()
848
846
849 initial = {'name': mix.name,
847 initial = {'name': mix.name,
850 'result': parse_mix_result(mix.parameters),
848 'result': parse_mix_result(mix.parameters),
851 'delay': 0,
849 'delay': 0,
852 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
850 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
853 }
851 }
854
852
855 if request.method == 'GET':
853 if request.method == 'GET':
856 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
854 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
857
855
858 if request.method == 'POST':
856 if request.method == 'POST':
859 result = mix.parameters
857 result = mix.parameters
860
858
861 if '{}|'.format(request.POST['experiment']) in result:
859 if '{}|'.format(request.POST['experiment']) in result:
862 messages.error(request, 'Configuration already added')
860 messages.error(request, 'Configuration already added')
863 else:
861 else:
864 if 'operation' in request.POST:
862 if 'operation' in request.POST:
865 operation = MIX_OPERATIONS[request.POST['operation']]
863 operation = MIX_OPERATIONS[request.POST['operation']]
866 else:
864 else:
867 operation = ' '
865 operation = ' '
868
866
869 mode = MIX_MODES[request.POST['mode']]
867 mode = MIX_MODES[request.POST['mode']]
870
868
871 if result:
869 if result:
872 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
870 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
873 request.POST['experiment'],
871 request.POST['experiment'],
874 mode,
872 mode,
875 operation,
873 operation,
876 float(
874 float(
877 request.POST['delay']),
875 request.POST['delay']),
878 parse_mask(
876 parse_mask(
879 request.POST.getlist('mask'))
877 request.POST.getlist('mask'))
880 )
878 )
881 else:
879 else:
882 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
880 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
883 mode,
881 mode,
884 operation,
882 operation,
885 float(request.POST['delay']),
883 float(request.POST['delay']),
886 parse_mask(
884 parse_mask(
887 request.POST.getlist('mask'))
885 request.POST.getlist('mask'))
888 )
886 )
889
887
890 mix.parameters = result
888 mix.parameters = result
891 mix.save()
889 mix.save()
892 mix.update_pulses()
890 mix.update_pulses()
893
891
894 initial['result'] = parse_mix_result(result)
892 initial['result'] = parse_mix_result(result)
895 initial['name'] = mix.name
893 initial['name'] = mix.name
896
894
897 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
895 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
898
896
899 kwargs = {
897 kwargs = {
900 'title': 'Experiment',
898 'title': 'Experiment',
901 'suptitle': 'Mix Configurations',
899 'suptitle': 'Mix Configurations',
902 'form': form,
900 'form': form,
903 'extra_button': 'Delete',
901 'extra_button': 'Delete',
904 'button': 'Add',
902 'button': 'Add',
905 'cancel': 'Back',
903 'cancel': 'Back',
906 'previous': experiment.get_absolute_url(),
904 'previous': experiment.get_absolute_url(),
907 'id_exp': id_exp,
905 'id_exp': id_exp,
908
906
909 }
907 }
910 kwargs['menu_experiments'] = 'active'
908 kwargs['menu_experiments'] = 'active'
911
909
912 return render(request, 'experiment_mix.html', kwargs)
910 return render(request, 'experiment_mix.html', kwargs)
913
911
914
912
915 @login_required
913 @login_required
916 def experiment_mix_delete(request, id_exp):
914 def experiment_mix_delete(request, id_exp):
917
915
918 conf = PedestalConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
916 conf = PedestalConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
919 values = conf.parameters.split('-')
917 values = conf.parameters.split('-')
920 conf.parameters = '-'.join(values[:-1])
918 conf.parameters = '-'.join(values[:-1])
921 conf.save()
919 conf.save()
922
920
923 return redirect('url_mix_experiment', id_exp=id_exp)
921 return redirect('url_mix_experiment', id_exp=id_exp)
924
922
925
923
926 def experiment_summary(request, id_exp):
924 def experiment_summary(request, id_exp):
927
925
928 experiment = get_object_or_404(Experiment, pk=id_exp)
926 experiment = get_object_or_404(Experiment, pk=id_exp)
929 configurations = Configuration.objects.filter(
927 configurations = Configuration.objects.filter(
930 experiment=experiment, type=0)
928 experiment=experiment, type=0)
931
929
932 kwargs = {}
930 kwargs = {}
933 kwargs['experiment_keys'] = ['radar_system',
931 kwargs['experiment_keys'] = ['radar_system',
934 'name', 'freq', 'start_time', 'end_time']
932 'name', 'freq', 'start_time', 'end_time']
935 kwargs['experiment'] = experiment
933 kwargs['experiment'] = experiment
936 kwargs['configurations'] = []
934 kwargs['configurations'] = []
937 kwargs['title'] = 'Experiment Summary'
935 kwargs['title'] = 'Experiment Summary'
938 kwargs['suptitle'] = 'Details'
936 kwargs['suptitle'] = 'Details'
939 kwargs['button'] = 'Verify Parameters'
937 kwargs['button'] = 'Verify Parameters'
940
938
941 c_vel = 3.0*(10**8) # m/s
939 c_vel = 3.0*(10**8) # m/s
942 ope_freq = experiment.freq*(10**6) # 1/s
940 ope_freq = experiment.freq*(10**6) # 1/s
943 radar_lambda = c_vel/ope_freq # m
941 radar_lambda = c_vel/ope_freq # m
944 kwargs['radar_lambda'] = radar_lambda
942 kwargs['radar_lambda'] = radar_lambda
945
943
946 ipp = None
944 ipp = None
947 nsa = 1
945 nsa = 1
948 code_id = 0
946 code_id = 0
949 tx_line = {}
947 tx_line = {}
950
948
951 for configuration in configurations.filter(device__device_type__name = 'pedestal'):
949 for configuration in configurations.filter(device__device_type__name = 'pedestal'):
952
950
953 if configuration.mix:
951 if configuration.mix:
954 continue
952 continue
955 conf = {'conf': configuration}
953 conf = {'conf': configuration}
956 conf['keys'] = []
954 conf['keys'] = []
957 conf['NTxs'] = configuration.ntx
955 conf['NTxs'] = configuration.ntx
958 conf['keys'].append('NTxs')
956 conf['keys'].append('NTxs')
959 ipp = configuration.ipp
957 ipp = configuration.ipp
960 conf['IPP'] = ipp
958 conf['IPP'] = ipp
961 conf['keys'].append('IPP')
959 conf['keys'].append('IPP')
962 lines = configuration.get_lines(line_type__name='tx')
960 lines = configuration.get_lines(line_type__name='tx')
963
961
964 for tx_line in lines:
962 for tx_line in lines:
965 tx_params = json.loads(tx_line.params)
963 tx_params = json.loads(tx_line.params)
966 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
964 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
967 conf['keys'].append(tx_line.get_name())
965 conf['keys'].append(tx_line.get_name())
968 delays = tx_params['delays']
966 delays = tx_params['delays']
969 if delays not in ('', '0'):
967 if delays not in ('', '0'):
970 n = len(delays.split(','))
968 n = len(delays.split(','))
971 taus = '{} Taus: {}'.format(n, delays)
969 taus = '{} Taus: {}'.format(n, delays)
972 else:
970 else:
973 taus = '-'
971 taus = '-'
974 conf['Taus ({})'.format(tx_line.get_name())] = taus
972 conf['Taus ({})'.format(tx_line.get_name())] = taus
975 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
973 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
976 for code_line in configuration.get_lines(line_type__name='codes'):
974 for code_line in configuration.get_lines(line_type__name='codes'):
977 code_params = json.loads(code_line.params)
975 code_params = json.loads(code_line.params)
978 code_id = code_params['code']
976 code_id = code_params['code']
979 if tx_line.pk == int(code_params['TX_ref']):
977 if tx_line.pk == int(code_params['TX_ref']):
980 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
978 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
981 '-'.join(code_params['codes']))
979 '-'.join(code_params['codes']))
982 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
980 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
983
981
984 for windows_line in configuration.get_lines(line_type__name='windows'):
982 for windows_line in configuration.get_lines(line_type__name='windows'):
985 win_params = json.loads(windows_line.params)
983 win_params = json.loads(windows_line.params)
986 if tx_line.pk == int(win_params['TX_ref']):
984 if tx_line.pk == int(win_params['TX_ref']):
987 windows = ''
985 windows = ''
988 nsa = win_params['params'][0]['number_of_samples']
986 nsa = win_params['params'][0]['number_of_samples']
989 for i, params in enumerate(win_params['params']):
987 for i, params in enumerate(win_params['params']):
990 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
988 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
991 i, **params)
989 i, **params)
992 conf['Window'] = mark_safe(windows)
990 conf['Window'] = mark_safe(windows)
993 conf['keys'].append('Window')
991 conf['keys'].append('Window')
994
992
995 kwargs['configurations'].append(conf)
993 kwargs['configurations'].append(conf)
996
994
997 for configuration in configurations.filter(device__device_type__name = 'jars'):
995 for configuration in configurations.filter(device__device_type__name = 'jars'):
998
996
999 conf = {'conf': configuration}
997 conf = {'conf': configuration}
1000 conf['keys'] = []
998 conf['keys'] = []
1001 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
999 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1002 conf['keys'].append('Type of Data')
1000 conf['keys'].append('Type of Data')
1003 channels_number = configuration.channels_number
1001 channels_number = configuration.channels_number
1004 exp_type = configuration.exp_type
1002 exp_type = configuration.exp_type
1005 fftpoints = configuration.fftpoints
1003 fftpoints = configuration.fftpoints
1006 filter_parms = json.loads(configuration.filter_parms)
1004 filter_parms = json.loads(configuration.filter_parms)
1007 spectral_number = configuration.spectral_number
1005 spectral_number = configuration.spectral_number
1008 acq_profiles = configuration.acq_profiles
1006 acq_profiles = configuration.acq_profiles
1009 cohe_integr = configuration.cohe_integr
1007 cohe_integr = configuration.cohe_integr
1010 profiles_block = configuration.profiles_block
1008 profiles_block = configuration.profiles_block
1011
1009
1012 conf['Num of Profiles'] = acq_profiles
1010 conf['Num of Profiles'] = acq_profiles
1013 conf['keys'].append('Num of Profiles')
1011 conf['keys'].append('Num of Profiles')
1014
1012
1015 conf['Prof per Block'] = profiles_block
1013 conf['Prof per Block'] = profiles_block
1016 conf['keys'].append('Prof per Block')
1014 conf['keys'].append('Prof per Block')
1017
1015
1018 conf['Blocks per File'] = configuration.raw_data_blocks
1016 conf['Blocks per File'] = configuration.raw_data_blocks
1019 conf['keys'].append('Blocks per File')
1017 conf['keys'].append('Blocks per File')
1020
1018
1021 if exp_type == 0: # Short
1019 if exp_type == 0: # Short
1022 bytes_ = 2
1020 bytes_ = 2
1023 b = nsa*2*bytes_*channels_number
1021 b = nsa*2*bytes_*channels_number
1024 else: # Float
1022 else: # Float
1025 bytes_ = 4
1023 bytes_ = 4
1026 channels = channels_number + spectral_number
1024 channels = channels_number + spectral_number
1027 b = nsa*2*bytes_*fftpoints*channels
1025 b = nsa*2*bytes_*fftpoints*channels
1028
1026
1029 codes_num = 7
1027 codes_num = 7
1030 if code_id == 2:
1028 if code_id == 2:
1031 codes_num = 7
1029 codes_num = 7
1032 elif code_id == 12:
1030 elif code_id == 12:
1033 codes_num = 15
1031 codes_num = 15
1034
1032
1035 #Jars filter values:
1033 #Jars filter values:
1036
1034
1037 clock = float(filter_parms['clock'])
1035 clock = float(filter_parms['clock'])
1038 filter_2 = int(filter_parms['cic_2'])
1036 filter_2 = int(filter_parms['cic_2'])
1039 filter_5 = int(filter_parms['cic_5'])
1037 filter_5 = int(filter_parms['cic_5'])
1040 filter_fir = int(filter_parms['fir'])
1038 filter_fir = int(filter_parms['fir'])
1041 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1039 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1042
1040
1043 #Jars values:
1041 #Jars values:
1044 if ipp is not None:
1042 if ipp is not None:
1045 IPP_units = ipp/0.15*Fs_MHz
1043 IPP_units = ipp/0.15*Fs_MHz
1046 IPP_us = IPP_units / Fs_MHz
1044 IPP_us = IPP_units / Fs_MHz
1047 IPP_s = IPP_units / (Fs_MHz * (10**6))
1045 IPP_s = IPP_units / (Fs_MHz * (10**6))
1048 Ts = 1/(Fs_MHz*(10**6))
1046 Ts = 1/(Fs_MHz*(10**6))
1049
1047
1050 Va = radar_lambda/(4*Ts*cohe_integr)
1048 Va = radar_lambda/(4*Ts*cohe_integr)
1051 rate_bh = ((nsa-codes_num)*channels_number*2 *
1049 rate_bh = ((nsa-codes_num)*channels_number*2 *
1052 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1050 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1053 rate_gh = rate_bh/(1024*1024*1024)
1051 rate_gh = rate_bh/(1024*1024*1024)
1054
1052
1055 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1053 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1056 conf['keys'].append('Time per Block')
1054 conf['keys'].append('Time per Block')
1057 conf['Acq time'] = IPP_s * acq_profiles
1055 conf['Acq time'] = IPP_s * acq_profiles
1058 conf['keys'].append('Acq time')
1056 conf['keys'].append('Acq time')
1059 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1057 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1060 conf['keys'].append('Data rate')
1058 conf['keys'].append('Data rate')
1061 conf['Va (m/s)'] = Va
1059 conf['Va (m/s)'] = Va
1062 conf['keys'].append('Va (m/s)')
1060 conf['keys'].append('Va (m/s)')
1063 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1061 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1064 conf['keys'].append('Vrange (m/s)')
1062 conf['keys'].append('Vrange (m/s)')
1065
1063
1066 kwargs['configurations'].append(conf)
1064 kwargs['configurations'].append(conf)
1067 kwargs['menu_experiments'] = 'active'
1065 kwargs['menu_experiments'] = 'active'
1068
1066
1069 ###### SIDEBAR ######
1067 ###### SIDEBAR ######
1070 kwargs.update(sidebar(experiment=experiment))
1068 kwargs.update(sidebar(experiment=experiment))
1071
1069
1072 return render(request, 'experiment_summary.html', kwargs)
1070 return render(request, 'experiment_summary.html', kwargs)
1073
1071
1074
1072
1075 @login_required
1073 @login_required
1076 def experiment_verify(request, id_exp):
1074 def experiment_verify(request, id_exp):
1077
1075
1078 experiment = get_object_or_404(Experiment, pk=id_exp)
1076 experiment = get_object_or_404(Experiment, pk=id_exp)
1079 experiment_data = experiment.parms_to_dict()
1077 experiment_data = experiment.parms_to_dict()
1080 configurations = Configuration.objects.filter(
1078 configurations = Configuration.objects.filter(
1081 experiment=experiment, type=0)
1079 experiment=experiment, type=0)
1082
1080
1083 kwargs = {}
1081 kwargs = {}
1084
1082
1085 kwargs['experiment_keys'] = ['template',
1083 kwargs['experiment_keys'] = ['template',
1086 'radar_system', 'name', 'start_time', 'end_time']
1084 'radar_system', 'name', 'start_time', 'end_time']
1087 kwargs['experiment'] = experiment
1085 kwargs['experiment'] = experiment
1088
1086
1089 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1087 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1090 'device__port_address', 'device__status']
1088 'device__port_address', 'device__status']
1091 kwargs['configurations'] = configurations
1089 kwargs['configurations'] = configurations
1092 kwargs['experiment_data'] = experiment_data
1090 kwargs['experiment_data'] = experiment_data
1093
1091
1094 kwargs['title'] = 'Verify Experiment'
1092 kwargs['title'] = 'Verify Experiment'
1095 kwargs['suptitle'] = 'Parameters'
1093 kwargs['suptitle'] = 'Parameters'
1096
1094
1097 kwargs['button'] = 'Update'
1095 kwargs['button'] = 'Update'
1098
1096
1099 jars_conf = False
1097 jars_conf = False
1100 rc_conf = False
1098 rc_conf = False
1101 dds_conf = False
1099 dds_conf = False
1102
1100
1103 for configuration in configurations:
1101 for configuration in configurations:
1104 #-------------------- JARS -----------------------:
1102 #-------------------- JARS -----------------------:
1105 if configuration.device.device_type.name == 'jars':
1103 if configuration.device.device_type.name == 'jars':
1106 jars_conf = True
1104 jars_conf = True
1107 jars = configuration
1105 jars = configuration
1108 kwargs['jars_conf'] = jars_conf
1106 kwargs['jars_conf'] = jars_conf
1109 filter_parms = json.loads(jars.filter_parms)
1107 filter_parms = json.loads(jars.filter_parms)
1110 kwargs['filter_parms'] = filter_parms
1108 kwargs['filter_parms'] = filter_parms
1111 #--Sampling Frequency
1109 #--Sampling Frequency
1112 clock = filter_parms['clock']
1110 clock = filter_parms['clock']
1113 filter_2 = filter_parms['cic_2']
1111 filter_2 = filter_parms['cic_2']
1114 filter_5 = filter_parms['cic_5']
1112 filter_5 = filter_parms['cic_5']
1115 filter_fir = filter_parms['fir']
1113 filter_fir = filter_parms['fir']
1116 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1114 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1117
1115
1118 kwargs['samp_freq_jars'] = samp_freq_jars
1116 kwargs['samp_freq_jars'] = samp_freq_jars
1119 kwargs['jars'] = configuration
1117 kwargs['jars'] = configuration
1120
1118
1121 #--------------------- RC ----------------------:
1119 #--------------------- RC ----------------------:
1122 if configuration.device.device_type.name == 'pedestal' and not configuration.mix:
1120 if configuration.device.device_type.name == 'pedestal' and not configuration.mix:
1123 rc_conf = True
1121 rc_conf = True
1124 rc = configuration
1122 rc = configuration
1125
1123
1126 rc_parms = configuration.parms_to_dict()
1124 rc_parms = configuration.parms_to_dict()
1127
1125
1128 win_lines = rc.get_lines(line_type__name='windows')
1126 win_lines = rc.get_lines(line_type__name='windows')
1129 if win_lines:
1127 if win_lines:
1130 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1128 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1131 #--Sampling Frequency
1129 #--Sampling Frequency
1132 samp_freq_rc = 0.15/dh
1130 samp_freq_rc = 0.15/dh
1133 kwargs['samp_freq_rc'] = samp_freq_rc
1131 kwargs['samp_freq_rc'] = samp_freq_rc
1134
1132
1135 kwargs['rc_conf'] = rc_conf
1133 kwargs['rc_conf'] = rc_conf
1136 kwargs['rc'] = configuration
1134 kwargs['rc'] = configuration
1137
1135
1138 #-------------------- DDS ----------------------:
1136 #-------------------- DDS ----------------------:
1139 if configuration.device.device_type.name == 'dds':
1137 if configuration.device.device_type.name == 'dds':
1140 dds_conf = True
1138 dds_conf = True
1141 dds = configuration
1139 dds = configuration
1142 dds_parms = configuration.parms_to_dict()
1140 dds_parms = configuration.parms_to_dict()
1143
1141
1144 kwargs['dds_conf'] = dds_conf
1142 kwargs['dds_conf'] = dds_conf
1145 kwargs['dds'] = configuration
1143 kwargs['dds'] = configuration
1146
1144
1147 #------------Validation------------:
1145 #------------Validation------------:
1148 #Clock
1146 #Clock
1149 if dds_conf and rc_conf and jars_conf:
1147 if dds_conf and rc_conf and jars_conf:
1150 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1148 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1151 messages.warning(request, "Devices don't have the same clock.")
1149 messages.warning(request, "Devices don't have the same clock.")
1152 elif rc_conf and jars_conf:
1150 elif rc_conf and jars_conf:
1153 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1151 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1154 messages.warning(request, "Devices don't have the same clock.")
1152 messages.warning(request, "Devices don't have the same clock.")
1155 elif rc_conf and dds_conf:
1153 elif rc_conf and dds_conf:
1156 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1154 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1157 messages.warning(request, "Devices don't have the same clock.")
1155 messages.warning(request, "Devices don't have the same clock.")
1158 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1156 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1159 messages.warning(
1157 messages.warning(
1160 request, "Devices don't have the same Frequency A.")
1158 request, "Devices don't have the same Frequency A.")
1161
1159
1162 #------------POST METHOD------------:
1160 #------------POST METHOD------------:
1163 if request.method == 'POST':
1161 if request.method == 'POST':
1164 if request.POST['suggest_clock']:
1162 if request.POST['suggest_clock']:
1165 try:
1163 try:
1166 suggest_clock = float(request.POST['suggest_clock'])
1164 suggest_clock = float(request.POST['suggest_clock'])
1167 except:
1165 except:
1168 messages.warning(request, "Invalid value in CLOCK IN.")
1166 messages.warning(request, "Invalid value in CLOCK IN.")
1169 return redirect('url_verify_experiment', id_exp=experiment.id)
1167 return redirect('url_verify_experiment', id_exp=experiment.id)
1170 else:
1168 else:
1171 suggest_clock = ""
1169 suggest_clock = ""
1172 if suggest_clock:
1170 if suggest_clock:
1173 if rc_conf:
1171 if rc_conf:
1174 rc.clock_in = suggest_clock
1172 rc.clock_in = suggest_clock
1175 rc.save()
1173 rc.save()
1176 if jars_conf:
1174 if jars_conf:
1177 filter_parms = jars.filter_parms
1175 filter_parms = jars.filter_parms
1178 filter_parms = ast.literal_eval(filter_parms)
1176 filter_parms = ast.literal_eval(filter_parms)
1179 filter_parms['clock'] = suggest_clock
1177 filter_parms['clock'] = suggest_clock
1180 jars.filter_parms = json.dumps(filter_parms)
1178 jars.filter_parms = json.dumps(filter_parms)
1181 jars.save()
1179 jars.save()
1182 kwargs['filter_parms'] = filter_parms
1180 kwargs['filter_parms'] = filter_parms
1183 if dds_conf:
1181 if dds_conf:
1184 dds.clock = suggest_clock
1182 dds.clock = suggest_clock
1185 dds.save()
1183 dds.save()
1186
1184
1187 if request.POST['suggest_frequencyA']:
1185 if request.POST['suggest_frequencyA']:
1188 try:
1186 try:
1189 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1187 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1190 except:
1188 except:
1191 messages.warning(request, "Invalid value in FREQUENCY A.")
1189 messages.warning(request, "Invalid value in FREQUENCY A.")
1192 return redirect('url_verify_experiment', id_exp=experiment.id)
1190 return redirect('url_verify_experiment', id_exp=experiment.id)
1193 else:
1191 else:
1194 suggest_frequencyA = ""
1192 suggest_frequencyA = ""
1195 if suggest_frequencyA:
1193 if suggest_frequencyA:
1196 if jars_conf:
1194 if jars_conf:
1197 filter_parms = jars.filter_parms
1195 filter_parms = jars.filter_parms
1198 filter_parms = ast.literal_eval(filter_parms)
1196 filter_parms = ast.literal_eval(filter_parms)
1199 filter_parms['fch'] = suggest_frequencyA
1197 filter_parms['fch'] = suggest_frequencyA
1200 jars.filter_parms = json.dumps(filter_parms)
1198 jars.filter_parms = json.dumps(filter_parms)
1201 jars.save()
1199 jars.save()
1202 kwargs['filter_parms'] = filter_parms
1200 kwargs['filter_parms'] = filter_parms
1203 if dds_conf:
1201 if dds_conf:
1204 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1202 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1205 dds.save()
1203 dds.save()
1206
1204
1207 kwargs['menu_experiments'] = 'active'
1205 kwargs['menu_experiments'] = 'active'
1208 kwargs.update(sidebar(experiment=experiment))
1206 kwargs.update(sidebar(experiment=experiment))
1209 return render(request, 'experiment_verify.html', kwargs)
1207 return render(request, 'experiment_verify.html', kwargs)
1210
1208
1211
1209
1212 def parse_mix_result(s):
1210 def parse_mix_result(s):
1213
1211
1214 values = s.split('-')
1212 values = s.split('-')
1215 html = 'EXP MOD OPE DELAY MASK\r\n'
1213 html = 'EXP MOD OPE DELAY MASK\r\n'
1216
1214
1217 if not values or values[0] in ('', ' '):
1215 if not values or values[0] in ('', ' '):
1218 return mark_safe(html)
1216 return mark_safe(html)
1219
1217
1220 for i, value in enumerate(values):
1218 for i, value in enumerate(values):
1221 if not value:
1219 if not value:
1222 continue
1220 continue
1223 pk, mode, operation, delay, mask = value.split('|')
1221 pk, mode, operation, delay, mask = value.split('|')
1224 conf = PedestalConfiguration.objects.get(pk=pk)
1222 conf = PedestalConfiguration.objects.get(pk=pk)
1225 if i == 0:
1223 if i == 0:
1226 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1224 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1227 conf.name,
1225 conf.name,
1228 mode,
1226 mode,
1229 ' ',
1227 ' ',
1230 delay,
1228 delay,
1231 mask)
1229 mask)
1232 else:
1230 else:
1233 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1231 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1234 conf.name,
1232 conf.name,
1235 mode,
1233 mode,
1236 operation,
1234 operation,
1237 delay,
1235 delay,
1238 mask)
1236 mask)
1239
1237
1240 return mark_safe(html)
1238 return mark_safe(html)
1241
1239
1242
1240
1243 def parse_mask(l):
1241 def parse_mask(l):
1244
1242
1245 values = []
1243 values = []
1246
1244
1247 for x in range(16):
1245 for x in range(16):
1248 if '{}'.format(x) in l:
1246 if '{}'.format(x) in l:
1249 values.append(1)
1247 values.append(1)
1250 else:
1248 else:
1251 values.append(0)
1249 values.append(0)
1252
1250
1253 values.reverse()
1251 values.reverse()
1254
1252
1255 return int(''.join([str(x) for x in values]), 2)
1253 return int(''.join([str(x) for x in values]), 2)
1256
1254
1257
1255
1258 def dev_confs(request):
1256 def dev_confs(request):
1259
1257
1260 page = request.GET.get('page')
1258 page = request.GET.get('page')
1261 order = ('-programmed_date', )
1259 order = ('-programmed_date', )
1262 filters = request.GET.copy()
1260 filters = request.GET.copy()
1263 if 'my configurations' in filters:
1261 if 'my configurations' in filters:
1264 filters.pop('my configurations', None)
1262 filters.pop('my configurations', None)
1265 filters['mine'] = request.user.id
1263 filters['mine'] = request.user.id
1266 kwargs = get_paginator(Configuration, page, order, filters)
1264 kwargs = get_paginator(Configuration, page, order, filters)
1267 fields = ['tags', 'template', 'historical']
1265 fields = ['tags', 'template', 'historical']
1268 if request.user.is_authenticated:
1266 if request.user.is_authenticated:
1269 fields.append('my configurations')
1267 fields.append('my configurations')
1270 form = FilterForm(initial=request.GET, extra_fields=fields)
1268 form = FilterForm(initial=request.GET, extra_fields=fields)
1271 kwargs['keys'] = ['name', 'device', 'experiment',
1269 kwargs['keys'] = ['name', 'device', 'experiment',
1272 'type', 'programmed_date', 'actions']
1270 'type', 'programmed_date', 'actions']
1273 kwargs['title'] = 'Configuration'
1271 kwargs['title'] = 'Configuration'
1274 kwargs['suptitle'] = 'List'
1272 kwargs['suptitle'] = 'List'
1275 kwargs['no_sidebar'] = True
1273 kwargs['no_sidebar'] = True
1276 kwargs['form'] = form
1274 kwargs['form'] = form
1277 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1275 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1278 filters = request.GET.copy()
1276 filters = request.GET.copy()
1279 filters.pop('page', None)
1277 filters.pop('page', None)
1280 kwargs['q'] = urlencode(filters)
1278 kwargs['q'] = urlencode(filters)
1281 kwargs['menu_configurations'] = 'active'
1279 kwargs['menu_configurations'] = 'active'
1282
1280
1283 return render(request, 'base_list.html', kwargs)
1281 return render(request, 'base_list.html', kwargs)
1284
1282
1285
1283
1286 def dev_conf(request, id_conf):
1284 def dev_conf(request, id_conf):
1287
1285
1288 conf = get_object_or_404(Configuration, pk=id_conf)
1286 conf = get_object_or_404(Configuration, pk=id_conf)
1289
1287
1290 return redirect(conf.get_absolute_url())
1288 return redirect(conf.get_absolute_url())
1291
1289
1292
1290
1293 @login_required
1291 @login_required
1294 def dev_conf_new(request, id_exp=0, id_dev=0):
1292 def dev_conf_new(request, id_exp=0, id_dev=0):
1295
1293
1296 if not is_developer(request.user):
1294 if not is_developer(request.user):
1297 messages.error(
1295 messages.error(
1298 request, 'Developer required, to create new configurations')
1296 request, 'Developer required, to create new configurations')
1299 return redirect('index')
1297 return redirect('index')
1300
1298
1301 initial = {}
1299 initial = {}
1302 kwargs = {}
1300 kwargs = {}
1303
1301
1304 if id_exp != 0:
1302 if id_exp != 0:
1305 initial['experiment'] = id_exp
1303 initial['experiment'] = id_exp
1306
1304
1307 if id_dev != 0:
1305 if id_dev != 0:
1308 initial['device'] = id_dev
1306 initial['device'] = id_dev
1309
1307
1310 if request.method == 'GET':
1308 if request.method == 'GET':
1311
1309
1312 if id_dev:
1310 if id_dev:
1313 kwargs['button'] = 'Create'
1311 kwargs['button'] = 'Create'
1314 device = Device.objects.get(pk=id_dev)
1312 device = Device.objects.get(pk=id_dev)
1315 DevConfForm = CONF_FORMS[device.device_type.name]
1313 DevConfForm = CONF_FORMS[device.device_type.name]
1316 initial['name'] = request.GET['name']
1314 initial['name'] = request.GET['name']
1317 form = DevConfForm(initial=initial)
1315 form = DevConfForm(initial=initial)
1318 else:
1316 else:
1319 if 'template' in request.GET:
1317 if 'template' in request.GET:
1320 if request.GET['template'] == '0':
1318 if request.GET['template'] == '0':
1321 choices = [(conf.pk, '{}'.format(conf))
1319 choices = [(conf.pk, '{}'.format(conf))
1322 for conf in Configuration.objects.filter(template=True)]
1320 for conf in Configuration.objects.filter(template=True)]
1323 form = NewForm(initial={'create_from': 2},
1321 form = NewForm(initial={'create_from': 2},
1324 template_choices=choices)
1322 template_choices=choices)
1325 else:
1323 else:
1326 kwargs['button'] = 'Create'
1324 kwargs['button'] = 'Create'
1327 conf = Configuration.objects.get(
1325 conf = Configuration.objects.get(
1328 pk=request.GET['template'])
1326 pk=request.GET['template'])
1329 id_dev = conf.device.pk
1327 id_dev = conf.device.pk
1330 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1328 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1331 form = DevConfForm(instance=conf,
1329 form = DevConfForm(instance=conf,
1332 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1330 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1333 'template': False,
1331 'template': False,
1334 'experiment': id_exp})
1332 'experiment': id_exp})
1335 elif 'blank' in request.GET:
1333 elif 'blank' in request.GET:
1336 kwargs['button'] = 'Create'
1334 kwargs['button'] = 'Create'
1337 form = ConfigurationForm(initial=initial)
1335 form = ConfigurationForm(initial=initial)
1338 else:
1336 else:
1339 form = NewForm()
1337 form = NewForm()
1340
1338
1341 if request.method == 'POST':
1339 if request.method == 'POST':
1342
1340
1343 device = Device.objects.get(pk=request.POST['device'])
1341 device = Device.objects.get(pk=request.POST['device'])
1344 DevConfForm = CONF_FORMS[device.device_type.name]
1342 DevConfForm = CONF_FORMS[device.device_type.name]
1345
1343
1346 form = DevConfForm(request.POST)
1344 form = DevConfForm(request.POST)
1347 kwargs['button'] = 'Create'
1345 kwargs['button'] = 'Create'
1348 if form.is_valid():
1346 if form.is_valid():
1349 conf = form.save(commit=False)
1347 conf = form.save(commit=False)
1350 conf.author = request.user
1348 conf.author = request.user
1351 conf.save()
1349 conf.save()
1352 return redirect('url_dev_conf', id_conf=conf.pk)
1350 return redirect('url_dev_conf', id_conf=conf.pk)
1353
1351
1354 kwargs['id_exp'] = id_exp
1352 kwargs['id_exp'] = id_exp
1355 kwargs['form'] = form
1353 kwargs['form'] = form
1356 kwargs['title'] = 'Configuration'
1354 kwargs['title'] = 'Configuration'
1357 kwargs['suptitle'] = 'New'
1355 kwargs['suptitle'] = 'New'
1358 kwargs['menu_configurations'] = 'active'
1356 kwargs['menu_configurations'] = 'active'
1359
1357
1360 if id_dev != 0:
1358 if id_dev != 0:
1361 device = Device.objects.get(pk=id_dev)
1359 device = Device.objects.get(pk=id_dev)
1362 kwargs['device'] = device.device_type.name
1360 kwargs['device'] = device.device_type.name
1363 return render(request, 'dev_conf_edit.html', kwargs)
1361 return render(request, 'dev_conf_edit.html', kwargs)
1364
1362
1365
1363
1366 @login_required
1364 @login_required
1367 def dev_conf_edit(request, id_conf):
1365 def dev_conf_edit(request, id_conf):
1368
1366
1369 conf = get_object_or_404(Configuration, pk=id_conf)
1367 conf = get_object_or_404(Configuration, pk=id_conf)
1370
1368
1371 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1369 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1372
1370
1373 if request.method == 'GET':
1371 if request.method == 'GET':
1374 form = DevConfForm(instance=conf)
1372 form = DevConfForm(instance=conf)
1375
1373
1376 if request.method == 'POST':
1374 if request.method == 'POST':
1377 form = DevConfForm(request.POST, instance=conf)
1375 form = DevConfForm(request.POST, instance=conf)
1378
1376
1379 if form.is_valid():
1377 if form.is_valid():
1380 form.save()
1378 form.save()
1381 return redirect('url_dev_conf', id_conf=id_conf)
1379 return redirect('url_dev_conf', id_conf=id_conf)
1382
1380
1383 kwargs = {}
1381 kwargs = {}
1384 kwargs['form'] = form
1382 kwargs['form'] = form
1385 kwargs['title'] = 'Device Configuration'
1383 kwargs['title'] = 'Device Configuration'
1386 kwargs['suptitle'] = 'Edit'
1384 kwargs['suptitle'] = 'Edit'
1387 kwargs['button'] = 'Update'
1385 kwargs['button'] = 'Update'
1388 kwargs['menu_configurations'] = 'active'
1386 kwargs['menu_configurations'] = 'active'
1389
1387
1390 ###### SIDEBAR ######
1388 ###### SIDEBAR ######
1391 kwargs.update(sidebar(conf=conf))
1389 kwargs.update(sidebar(conf=conf))
1392
1390
1393 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1391 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1394
1392
1395
1393
1396 @login_required
1394 @login_required
1397 def dev_conf_start(request, id_conf):
1395 def dev_conf_start(request, id_conf):
1398
1396
1399 conf = get_object_or_404(Configuration, pk=id_conf)
1397 conf = get_object_or_404(Configuration, pk=id_conf)
1400
1398
1401 if conf.start_device():
1399 if conf.start_device():
1402 messages.success(request, conf.message)
1400 messages.success(request, conf.message)
1403 else:
1401 else:
1404 messages.error(request, conf.message)
1402 messages.error(request, conf.message)
1405
1403
1406 #conf.status_device()
1404 #conf.status_device()
1407
1405
1408 return redirect(conf.get_absolute_url())
1406 return redirect(conf.get_absolute_url())
1409
1407
1410
1408
1411 @login_required
1409 @login_required
1412 def dev_conf_stop(request, id_conf):
1410 def dev_conf_stop(request, id_conf):
1413
1411
1414 conf = get_object_or_404(Configuration, pk=id_conf)
1412 conf = get_object_or_404(Configuration, pk=id_conf)
1415
1413
1416 if conf.stop_device():
1414 if conf.stop_device():
1417 messages.success(request, conf.message)
1415 messages.success(request, conf.message)
1418 else:
1416 else:
1419 messages.error(request, conf.message)
1417 messages.error(request, conf.message)
1420
1418
1421 #conf.status_device()
1419 #conf.status_device()
1422
1420
1423 return redirect(conf.get_absolute_url())
1421 return redirect(conf.get_absolute_url())
1424
1422
1425
1423
1426 @login_required
1424 @login_required
1427 def dev_conf_status(request, id_conf):
1425 def dev_conf_status(request, id_conf):
1428
1426
1429 conf = get_object_or_404(Configuration, pk=id_conf)
1427 conf = get_object_or_404(Configuration, pk=id_conf)
1430
1428
1431 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1429 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1432 if conf_active!=conf:
1430 if conf_active!=conf:
1433 url = '#' if conf_active is None else conf_active.get_absolute_url()
1431 url = '#' if conf_active is None else conf_active.get_absolute_url()
1434 label = 'None' if conf_active is None else conf_active.label
1432 label = 'None' if conf_active is None else conf_active.label
1435 messages.warning(
1433 messages.warning(
1436 request,
1434 request,
1437 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1435 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1438 url,
1436 url,
1439 label
1437 label
1440 ))
1438 ))
1441 )
1439 )
1442
1440
1443 return redirect(conf.get_absolute_url())
1441 return redirect(conf.get_absolute_url())
1444
1442
1445 if conf.status_device():
1443 if conf.status_device():
1446 messages.success(request, conf.message)
1444 messages.success(request, conf.message)
1447 else:
1445 else:
1448 messages.error(request, conf.message)
1446 messages.error(request, conf.message)
1449
1447
1450 return redirect(conf.get_absolute_url())
1448 return redirect(conf.get_absolute_url())
1451
1449
1452
1450
1453 @login_required
1451 @login_required
1454 def dev_conf_reset(request, id_conf):
1452 def dev_conf_reset(request, id_conf):
1455
1453
1456 conf = get_object_or_404(Configuration, pk=id_conf)
1454 conf = get_object_or_404(Configuration, pk=id_conf)
1457
1455
1458 if conf.reset_device():
1456 if conf.reset_device():
1459 messages.success(request, conf.message)
1457 messages.success(request, conf.message)
1460 else:
1458 else:
1461 messages.error(request, conf.message)
1459 messages.error(request, conf.message)
1462
1460
1463 return redirect(conf.get_absolute_url())
1461 return redirect(conf.get_absolute_url())
1464
1462
1465
1463
1466 @login_required
1464 @login_required
1467 def dev_conf_write(request, id_conf):
1465 def dev_conf_write(request, id_conf):
1468
1466
1469 conf = get_object_or_404(Configuration, pk=id_conf)
1467 conf = get_object_or_404(Configuration, pk=id_conf)
1470
1468
1471 if request.method == 'POST':
1469 if request.method == 'POST':
1472 if conf.write_device():
1470 if conf.write_device():
1473 conf.device.conf_active = conf.pk
1471 conf.device.conf_active = conf.pk
1474 conf.device.save()
1472 conf.device.save()
1475 messages.success(request, conf.message)
1473 messages.success(request, conf.message)
1476 if has_been_modified(conf):
1474 if has_been_modified(conf):
1477 conf.clone(type=1, template=False)
1475 conf.clone(type=1, template=False)
1478 else:
1476 else:
1479 messages.error(request, conf.message)
1477 messages.error(request, conf.message)
1480
1478
1481 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1479 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1482
1480
1483 kwargs = {
1481 kwargs = {
1484 'title': 'Write Configuration',
1482 'title': 'Write Configuration',
1485 'suptitle': conf.label,
1483 'suptitle': conf.label,
1486 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1484 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1487 'delete': False
1485 'delete': False
1488 }
1486 }
1489 kwargs['menu_configurations'] = 'active'
1487 kwargs['menu_configurations'] = 'active'
1490
1488
1491 return render(request, 'confirm.html', kwargs)
1489 return render(request, 'confirm.html', kwargs)
1492
1490
1493
1491
1494 @login_required
1492 @login_required
1495 def dev_conf_read(request, id_conf):
1493 def dev_conf_read(request, id_conf):
1496
1494
1497 conf = get_object_or_404(Configuration, pk=id_conf)
1495 conf = get_object_or_404(Configuration, pk=id_conf)
1498
1496
1499 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1497 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1500
1498
1501 if request.method == 'GET':
1499 if request.method == 'GET':
1502 parms = conf.read_device()
1500 parms = conf.read_device()
1503 #conf.status_device()
1501 #conf.status_device()
1504
1502
1505 if not parms:
1503 if not parms:
1506 messages.error(request, conf.message)
1504 messages.error(request, conf.message)
1507 return redirect(conf.get_absolute_url())
1505 return redirect(conf.get_absolute_url())
1508
1506
1509 form = DevConfForm(initial=parms, instance=conf)
1507 form = DevConfForm(initial=parms, instance=conf)
1510
1508
1511 if request.method == 'POST':
1509 if request.method == 'POST':
1512 form = DevConfForm(request.POST, instance=conf)
1510 form = DevConfForm(request.POST, instance=conf)
1513
1511
1514 if form.is_valid():
1512 if form.is_valid():
1515 form.save()
1513 form.save()
1516 return redirect(conf.get_absolute_url())
1514 return redirect(conf.get_absolute_url())
1517
1515
1518 messages.error(request, "Parameters could not be saved")
1516 messages.error(request, "Parameters could not be saved")
1519
1517
1520 kwargs = {}
1518 kwargs = {}
1521 kwargs['id_dev'] = conf.id
1519 kwargs['id_dev'] = conf.id
1522 kwargs['form'] = form
1520 kwargs['form'] = form
1523 kwargs['title'] = 'Device Configuration'
1521 kwargs['title'] = 'Device Configuration'
1524 kwargs['suptitle'] = 'Parameters read from device'
1522 kwargs['suptitle'] = 'Parameters read from device'
1525 kwargs['button'] = 'Save'
1523 kwargs['button'] = 'Save'
1526
1524
1527 ###### SIDEBAR ######
1525 ###### SIDEBAR ######
1528 kwargs.update(sidebar(conf=conf))
1526 kwargs.update(sidebar(conf=conf))
1529
1527
1530 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1528 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1531
1529
1532
1530
1533 @login_required
1531 @login_required
1534 def dev_conf_import(request, id_conf):
1532 def dev_conf_import(request, id_conf):
1535
1533
1536 conf = get_object_or_404(Configuration, pk=id_conf)
1534 conf = get_object_or_404(Configuration, pk=id_conf)
1537 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1535 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1538
1536
1539 if request.method == 'GET':
1537 if request.method == 'GET':
1540 file_form = UploadFileForm()
1538 file_form = UploadFileForm()
1541
1539
1542 if request.method == 'POST':
1540 if request.method == 'POST':
1543 file_form = UploadFileForm(request.POST, request.FILES)
1541 file_form = UploadFileForm(request.POST, request.FILES)
1544
1542
1545 if file_form.is_valid():
1543 if file_form.is_valid():
1546
1544
1547 data = conf.import_from_file(request.FILES['file'])
1545 data = conf.import_from_file(request.FILES['file'])
1548 parms = Params(data=data).get_conf(
1546 parms = Params(data=data).get_conf(
1549 dtype=conf.device.device_type.name)
1547 dtype=conf.device.device_type.name)
1550
1548
1551 if parms:
1549 if parms:
1552
1550
1553 form = DevConfForm(initial=parms, instance=conf)
1551 form = DevConfForm(initial=parms, instance=conf)
1554
1552
1555 kwargs = {}
1553 kwargs = {}
1556 kwargs['id_dev'] = conf.id
1554 kwargs['id_dev'] = conf.id
1557 kwargs['form'] = form
1555 kwargs['form'] = form
1558 kwargs['title'] = 'Device Configuration'
1556 kwargs['title'] = 'Device Configuration'
1559 kwargs['suptitle'] = 'Parameters imported'
1557 kwargs['suptitle'] = 'Parameters imported'
1560 kwargs['button'] = 'Save'
1558 kwargs['button'] = 'Save'
1561 kwargs['action'] = conf.get_absolute_url_edit()
1559 kwargs['action'] = conf.get_absolute_url_edit()
1562 kwargs['previous'] = conf.get_absolute_url()
1560 kwargs['previous'] = conf.get_absolute_url()
1563
1561
1564 ###### SIDEBAR ######
1562 ###### SIDEBAR ######
1565 kwargs.update(sidebar(conf=conf))
1563 kwargs.update(sidebar(conf=conf))
1566
1564
1567 messages.success(
1565 messages.success(
1568 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1566 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1569
1567
1570 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1568 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1571
1569
1572 messages.error(request, "Could not import parameters from file")
1570 messages.error(request, "Could not import parameters from file")
1573
1571
1574 kwargs = {}
1572 kwargs = {}
1575 kwargs['id_dev'] = conf.id
1573 kwargs['id_dev'] = conf.id
1576 kwargs['title'] = 'Device Configuration'
1574 kwargs['title'] = 'Device Configuration'
1577 kwargs['form'] = file_form
1575 kwargs['form'] = file_form
1578 kwargs['suptitle'] = 'Importing file'
1576 kwargs['suptitle'] = 'Importing file'
1579 kwargs['button'] = 'Import'
1577 kwargs['button'] = 'Import'
1580 kwargs['menu_configurations'] = 'active'
1578 kwargs['menu_configurations'] = 'active'
1581
1579
1582 kwargs.update(sidebar(conf=conf))
1580 kwargs.update(sidebar(conf=conf))
1583
1581
1584 return render(request, 'dev_conf_import.html', kwargs)
1582 return render(request, 'dev_conf_import.html', kwargs)
1585
1583
1586
1584
1587 @login_required
1585 @login_required
1588 def dev_conf_export(request, id_conf):
1586 def dev_conf_export(request, id_conf):
1589
1587
1590 conf = get_object_or_404(Configuration, pk=id_conf)
1588 conf = get_object_or_404(Configuration, pk=id_conf)
1591
1589
1592 if request.method == 'GET':
1590 if request.method == 'GET':
1593 file_form = DownloadFileForm(conf.device.device_type.name)
1591 file_form = DownloadFileForm(conf.device.device_type.name)
1594
1592
1595 if request.method == 'POST':
1593 if request.method == 'POST':
1596 file_form = DownloadFileForm(
1594 file_form = DownloadFileForm(
1597 conf.device.device_type.name, request.POST)
1595 conf.device.device_type.name, request.POST)
1598
1596
1599 if file_form.is_valid():
1597 if file_form.is_valid():
1600 fields = conf.export_to_file(
1598 fields = conf.export_to_file(
1601 format=file_form.cleaned_data['format'])
1599 format=file_form.cleaned_data['format'])
1602 if not fields['content']:
1600 if not fields['content']:
1603 messages.error(request, conf.message)
1601 messages.error(request, conf.message)
1604 return redirect(conf.get_absolute_url_export())
1602 return redirect(conf.get_absolute_url_export())
1605 response = HttpResponse(content_type=fields['content_type'])
1603 response = HttpResponse(content_type=fields['content_type'])
1606 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1604 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1607 response.write(fields['content'])
1605 response.write(fields['content'])
1608
1606
1609 return response
1607 return response
1610
1608
1611 messages.error(request, "Could not export parameters")
1609 messages.error(request, "Could not export parameters")
1612
1610
1613 kwargs = {}
1611 kwargs = {}
1614 kwargs['id_dev'] = conf.id
1612 kwargs['id_dev'] = conf.id
1615 kwargs['title'] = 'Device Configuration'
1613 kwargs['title'] = 'Device Configuration'
1616 kwargs['form'] = file_form
1614 kwargs['form'] = file_form
1617 kwargs['suptitle'] = 'Exporting file'
1615 kwargs['suptitle'] = 'Exporting file'
1618 kwargs['button'] = 'Export'
1616 kwargs['button'] = 'Export'
1619 kwargs['menu_configurations'] = 'active'
1617 kwargs['menu_configurations'] = 'active'
1620
1618
1621 return render(request, 'dev_conf_export.html', kwargs)
1619 return render(request, 'dev_conf_export.html', kwargs)
1622
1620
1623
1621
1624 @login_required
1622 @login_required
1625 def dev_conf_delete(request, id_conf):
1623 def dev_conf_delete(request, id_conf):
1626
1624
1627 conf = get_object_or_404(Configuration, pk=id_conf)
1625 conf = get_object_or_404(Configuration, pk=id_conf)
1628
1626
1629 if request.method == 'POST':
1627 if request.method == 'POST':
1630 if is_developer(request.user):
1628 if is_developer(request.user):
1631 conf.delete()
1629 conf.delete()
1632 return redirect('url_dev_confs')
1630 return redirect('url_dev_confs')
1633
1631
1634 messages.error(request, 'Not enough permission to delete this object')
1632 messages.error(request, 'Not enough permission to delete this object')
1635 return redirect(conf.get_absolute_url())
1633 return redirect(conf.get_absolute_url())
1636
1634
1637 kwargs = {
1635 kwargs = {
1638 'title': 'Delete',
1636 'title': 'Delete',
1639 'suptitle': 'Configuration',
1637 'suptitle': 'Configuration',
1640 'object': conf,
1638 'object': conf,
1641 'delete': True
1639 'delete': True
1642 }
1640 }
1643 kwargs['menu_configurations'] = 'active'
1641 kwargs['menu_configurations'] = 'active'
1644
1642
1645 return render(request, 'confirm.html', kwargs)
1643 return render(request, 'confirm.html', kwargs)
1646
1644
1647
1645
1648 def sidebar(**kwargs):
1646 def sidebar(**kwargs):
1649
1647
1650 side_data = {}
1648 side_data = {}
1651
1649
1652 conf = kwargs.get('conf', None)
1650 conf = kwargs.get('conf', None)
1653 experiment = kwargs.get('experiment', None)
1651 experiment = kwargs.get('experiment', None)
1654
1652
1655 if not experiment:
1653 if not experiment:
1656 experiment = conf.experiment
1654 experiment = conf.experiment
1657
1655
1658 if experiment:
1656 if experiment:
1659 side_data['experiment'] = experiment
1657 side_data['experiment'] = experiment
1660 campaign = experiment.campaign_set.all()
1658 campaign = experiment.campaign_set.all()
1661 if campaign:
1659 if campaign:
1662 side_data['campaign'] = campaign[0]
1660 side_data['campaign'] = campaign[0]
1663 experiments = campaign[0].experiments.all().order_by('name')
1661 experiments = campaign[0].experiments.all().order_by('name')
1664 else:
1662 else:
1665 experiments = [experiment]
1663 experiments = [experiment]
1666 configurations = experiment.configuration_set.filter(type=0)
1664 configurations = experiment.configuration_set.filter(type=0)
1667 side_data['side_experiments'] = experiments
1665 side_data['side_experiments'] = experiments
1668 side_data['side_configurations'] = configurations.order_by(
1666 side_data['side_configurations'] = configurations.order_by(
1669 'device__device_type__name')
1667 'device__device_type__name')
1670
1668
1671 return side_data
1669 return side_data
1672
1670
1673
1671
1674 def get_paginator(model, page, order, filters={}, n=8):
1672 def get_paginator(model, page, order, filters={}, n=8):
1675
1673
1676 kwargs = {}
1674 kwargs = {}
1677 query = Q()
1675 query = Q()
1678 if isinstance(filters, QueryDict):
1676 if isinstance(filters, QueryDict):
1679 filters = filters.dict()
1677 filters = filters.dict()
1680 [filters.pop(key) for key in list(filters) if filters[key] in ('', ' ')]
1678 [filters.pop(key) for key in list(filters) if filters[key] in ('', ' ')]
1681 filters.pop('page', None)
1679 filters.pop('page', None)
1682
1680
1683 fields = [f.name for f in model._meta.get_fields()]
1681 fields = [f.name for f in model._meta.get_fields()]
1684
1682
1685 if 'template' in filters:
1683 if 'template' in filters:
1686 filters['template'] = True
1684 filters['template'] = True
1687 if 'historical' in filters:
1685 if 'historical' in filters:
1688 filters.pop('historical')
1686 filters.pop('historical')
1689 filters['type'] = 1
1687 filters['type'] = 1
1690 elif 'type' in fields:
1688 elif 'type' in fields:
1691 filters['type'] = 0
1689 filters['type'] = 0
1692 if 'start_date' in filters:
1690 if 'start_date' in filters:
1693 filters['start_date__gte'] = filters.pop('start_date')
1691 filters['start_date__gte'] = filters.pop('start_date')
1694 if 'end_date' in filters:
1692 if 'end_date' in filters:
1695 filters['start_date__lte'] = filters.pop('end_date')
1693 filters['start_date__lte'] = filters.pop('end_date')
1696 if 'tags' in filters:
1694 if 'tags' in filters:
1697 tags = filters.pop('tags')
1695 tags = filters.pop('tags')
1698 if 'tags' in fields:
1696 if 'tags' in fields:
1699 query = query | Q(tags__icontains=tags)
1697 query = query | Q(tags__icontains=tags)
1700 if 'label' in fields:
1698 if 'label' in fields:
1701 query = query | Q(label__icontains=tags)
1699 query = query | Q(label__icontains=tags)
1702 if 'location' in fields:
1700 if 'location' in fields:
1703 query = query | Q(location__name__icontains=tags)
1701 query = query | Q(location__name__icontains=tags)
1704 if 'device' in fields:
1702 if 'device' in fields:
1705 query = query | Q(device__device_type__name__icontains=tags)
1703 query = query | Q(device__device_type__name__icontains=tags)
1706 query = query | Q(device__location__name__icontains=tags)
1704 query = query | Q(device__location__name__icontains=tags)
1707 if 'device_type' in fields:
1705 if 'device_type' in fields:
1708 query = query | Q(device_type__name__icontains=tags)
1706 query = query | Q(device_type__name__icontains=tags)
1709
1707
1710 if 'mine' in filters:
1708 if 'mine' in filters:
1711 filters['author_id'] = filters['mine']
1709 filters['author_id'] = filters['mine']
1712 filters.pop('mine')
1710 filters.pop('mine')
1713 object_list = model.objects.filter(query, **filters).order_by(*order)
1711 object_list = model.objects.filter(query, **filters).order_by(*order)
1714 paginator = Paginator(object_list, n)
1712 paginator = Paginator(object_list, n)
1715
1713
1716 try:
1714 try:
1717 objects = paginator.page(page)
1715 objects = paginator.page(page)
1718 except PageNotAnInteger:
1716 except PageNotAnInteger:
1719 objects = paginator.page(1)
1717 objects = paginator.page(1)
1720 except EmptyPage:
1718 except EmptyPage:
1721 objects = paginator.page(paginator.num_pages)
1719 objects = paginator.page(paginator.num_pages)
1722
1720
1723 kwargs['objects'] = objects
1721 kwargs['objects'] = objects
1724 kwargs['offset'] = (int(page)-1)*n if page else 0
1722 kwargs['offset'] = (int(page)-1)*n if page else 0
1725
1723
1726 return kwargs
1724 return kwargs
1727
1725
1728
1726
1729 def operation(request, id_camp=None):
1727 def operation(request, id_camp=None):
1730
1728
1731 kwargs = {}
1729 kwargs = {}
1732 kwargs['title'] = 'Radars Operation'
1730 kwargs['title'] = 'Radars Operation'
1733 kwargs['no_sidebar'] = True
1731 kwargs['no_sidebar'] = True
1734 kwargs['menu_operation'] = 'active'
1732 kwargs['menu_operation'] = 'active'
1735 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1733 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1736 end_date__gte=datetime.now()).order_by('-start_date')
1734 end_date__gte=datetime.now()).order_by('-start_date')
1737
1735
1738 if id_camp:
1736 if id_camp:
1739 campaign = get_object_or_404(Campaign, pk=id_camp)
1737 campaign = get_object_or_404(Campaign, pk=id_camp)
1740 form = OperationForm(
1738 form = OperationForm(
1741 initial={'campaign': campaign.id}, campaigns=campaigns)
1739 initial={'campaign': campaign.id}, campaigns=campaigns)
1742 kwargs['campaign'] = campaign
1740 kwargs['campaign'] = campaign
1743 else:
1741 else:
1744 # form = OperationForm(campaigns=campaigns)
1742 # form = OperationForm(campaigns=campaigns)
1745 kwargs['campaigns'] = campaigns
1743 kwargs['campaigns'] = campaigns
1746 return render(request, 'operation.html', kwargs)
1744 return render(request, 'operation.html', kwargs)
1747
1745
1748 #---Experiment
1746 #---Experiment
1749 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1747 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1750 kwargs['experiment_keys'] = keys[1:]
1748 kwargs['experiment_keys'] = keys[1:]
1751 kwargs['experiments'] = experiments
1749 kwargs['experiments'] = experiments
1752 #---Radar
1750 #---Radar
1753 kwargs['locations'] = campaign.get_experiments_by_radar()
1751 kwargs['locations'] = campaign.get_experiments_by_radar()
1754 kwargs['form'] = form
1752 kwargs['form'] = form
1755
1753
1756 return render(request, 'operation.html', kwargs)
1754 return render(request, 'operation.html', kwargs)
1757
1755
1758
1756
1759 @login_required
1757 @login_required
1760 def radar_start(request, id_camp, id_radar):
1758 def radar_start(request, id_camp, id_radar):
1761
1759
1762 campaign = get_object_or_404(Campaign, pk=id_camp)
1760 campaign = get_object_or_404(Campaign, pk=id_camp)
1763 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1761 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1764 now = datetime.now()
1762 now = datetime.now()
1765
1763
1766 for exp in experiments:
1764 for exp in experiments:
1767 #app.control.revoke(exp.task)
1765 #app.control.revoke(exp.task)
1768 print(exp.status)
1766 print(exp.status)
1769 start = datetime.combine(datetime.now().date(), exp.start_time)
1767 start = datetime.combine(datetime.now().date(), exp.start_time)
1770 end = datetime.combine(datetime.now().date(), exp.end_time)
1768 end = datetime.combine(datetime.now().date(), exp.end_time)
1771 print(exp.start_time)
1769 print(exp.start_time)
1772 print(exp.end_time)
1770 print(exp.end_time)
1773
1771
1774 print(start)
1772 print(start)
1775 print(end)
1773 print(end)
1776 print(is_aware(start))
1774 print(is_aware(start))
1777 print(campaign.start_date)
1775 print(campaign.start_date)
1778 print(campaign.end_date)
1776 print(campaign.end_date)
1779 print(is_aware(campaign.start_date))
1777 print(is_aware(campaign.start_date))
1780 if end < start:
1778 if end < start:
1781 end += timedelta(1)
1779 end += timedelta(1)
1782
1780
1783 if exp.status == 2:
1781 if exp.status == 2:
1784 messages.warning(
1782 messages.warning(
1785 request, 'Experiment {} already running'.format(exp))
1783 request, 'Experiment {} already running'.format(exp))
1786 continue
1784 continue
1787
1785
1788 if exp.status == 3:
1786 if exp.status == 3:
1789 messages.warning(
1787 messages.warning(
1790 request, 'Experiment {} already programmed'.format(exp))
1788 request, 'Experiment {} already programmed'.format(exp))
1791 continue
1789 continue
1792
1790
1793 if start > campaign.end_date or start < campaign.start_date:
1791 if start > campaign.end_date or start < campaign.start_date:
1794 messages.warning(request, 'Experiment {} out of date'.format(exp))
1792 messages.warning(request, 'Experiment {} out of date'.format(exp))
1795 continue
1793 continue
1796
1794
1797 app.control.revoke(exp.task)
1795 app.control.revoke(exp.task)
1798 print("Llego luego del revoke")
1796 print("Llego luego del revoke")
1799 if now > start and now <= end:
1797 if now > start and now <= end:
1800 print("Caso now >start and <end")
1798 print("Caso now >start and <end")
1801 task = task_start.delay(exp.id)
1799 task = task_start.delay(exp.id)
1802 exp.status = task.wait()
1800 exp.status = task.wait()
1803 if exp.status == 0:
1801 if exp.status == 0:
1804 messages.error(request, 'Experiment {} not start'.format(exp))
1802 messages.error(request, 'Experiment {} not start'.format(exp))
1805 if exp.status == 2:
1803 if exp.status == 2:
1806 messages.success(request, 'Experiment {} started'.format(exp))
1804 messages.success(request, 'Experiment {} started'.format(exp))
1807 else:
1805 else:
1808 print("Caso now < start o >end")
1806 print("Caso now < start o >end")
1809 task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1807 task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1810 exp.task = task.id
1808 exp.task = task.id
1811 exp.status = 3
1809 exp.status = 3
1812 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1810 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1813
1811
1814 exp.save()
1812 exp.save()
1815
1813
1816 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1814 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1817
1815
1818
1816
1819 @login_required
1817 @login_required
1820 def radar_stop(request, id_camp, id_radar):
1818 def radar_stop(request, id_camp, id_radar):
1821
1819
1822 campaign = get_object_or_404(Campaign, pk=id_camp)
1820 campaign = get_object_or_404(Campaign, pk=id_camp)
1823 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1821 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1824 print("Ingreso en stop radar_stop")
1822 print("Ingreso en stop radar_stop")
1825 for exp in experiments:
1823 for exp in experiments:
1826
1824
1827 if exp.task:
1825 if exp.task:
1828 print("Ingreso antes de revoke stop")
1826 print("Ingreso antes de revoke stop")
1829 app.control.revoke(exp.task)
1827 app.control.revoke(exp.task)
1830
1828
1831
1829
1832 if exp.status == 2: #status 2 es started
1830 if exp.status == 2: #status 2 es started
1833 print("llama a exp.stop")
1831 print("llama a exp.stop")
1834 exp.stop()
1832 exp.stop()
1835 messages.warning(request, 'Experiment {} stopped'.format(exp))
1833 messages.warning(request, 'Experiment {} stopped'.format(exp))
1836 exp.status = 1
1834 exp.status = 1
1837 exp.save()
1835 exp.save()
1838
1836
1839 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1837 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1840
1838
1841
1839
1842 @login_required
1840 @login_required
1843 def radar_refresh(request, id_camp, id_radar):
1841 def radar_refresh(request, id_camp, id_radar):
1844
1842
1845 campaign = get_object_or_404(Campaign, pk=id_camp)
1843 campaign = get_object_or_404(Campaign, pk=id_camp)
1846 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1844 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1847
1845
1848 i = app.control.inspect()
1846 i = app.control.inspect()
1849 print(i)
1847 print(i)
1850 print(i.scheduled())
1848 print(i.scheduled())
1851 print(i.scheduled().values())
1849 print(i.scheduled().values())
1852 scheduled = list(i.scheduled().values())[0]
1850 scheduled = list(i.scheduled().values())[0]
1853 revoked = list(i.revoked().values())[0]
1851 revoked = list(i.revoked().values())[0]
1854
1852
1855 for exp in experiments:
1853 for exp in experiments:
1856 if exp.task in revoked:
1854 if exp.task in revoked:
1857 exp.status = 1
1855 exp.status = 1
1858 elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1856 elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
1859 exp.status = 2
1857 exp.status = 2
1860 elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1858 elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
1861 exp.status = 3
1859 exp.status = 3
1862 else:
1860 else:
1863 exp.status = 4
1861 exp.status = 4
1864 exp.save()
1862 exp.save()
1865 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1863 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1866
1864
1867 @login_required
1865 @login_required
1868 def revoke_tasks(request, id_camp):
1866 def revoke_tasks(request, id_camp):
1869
1867
1870 i = app.control.inspect()
1868 i = app.control.inspect()
1871 scheduled = list(i.scheduled().values())[0]
1869 scheduled = list(i.scheduled().values())[0]
1872 revoked = list(i.revoked().values())[0]
1870 revoked = list(i.revoked().values())[0]
1873
1871
1874 for t in scheduled:
1872 for t in scheduled:
1875 if t['request']['id'] in revoked:
1873 if t['request']['id'] in revoked:
1876 continue
1874 continue
1877 app.control.revoke(t['request']['id'])
1875 app.control.revoke(t['request']['id'])
1878 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1876 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1879 eta = t['eta']
1877 eta = t['eta']
1880 task = t['request']['name'].split('.')[-1]
1878 task = t['request']['name'].split('.')[-1]
1881 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1879 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1882
1880
1883 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1881 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1884
1882
1885 @login_required
1883 @login_required
1886 def show_tasks(request, id_camp):
1884 def show_tasks(request, id_camp):
1887
1885
1888 i = app.control.inspect()
1886 i = app.control.inspect()
1889 scheduled = list(i.scheduled().values())[0]
1887 scheduled = list(i.scheduled().values())[0]
1890 revoked = list(i.revoked().values())[0]
1888 revoked = list(i.revoked().values())[0]
1891
1889
1892 for t in scheduled:
1890 for t in scheduled:
1893 if t['request']['id'] in revoked:
1891 if t['request']['id'] in revoked:
1894 continue
1892 continue
1895 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1893 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1896 eta = t['eta']
1894 eta = t['eta']
1897 task = t['request']['name'].split('.')[-1]
1895 task = t['request']['name'].split('.')[-1]
1898 messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1896 messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1899
1897
1900 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1898 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1901
1899
1902 def real_time(request):
1900 def real_time(request):
1903
1901
1904 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1902 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1905
1903
1906 kwargs = {}
1904 kwargs = {}
1907 kwargs['title'] = 'CLAIRE'
1905 kwargs['title'] = 'CLAIRE'
1908 kwargs['suptitle'] = 'Real Time'
1906 kwargs['suptitle'] = 'Real Time'
1909 kwargs['no_sidebar'] = True
1907 kwargs['no_sidebar'] = True
1910 kwargs['graphic_path'] = graphic_path
1908 kwargs['graphic_path'] = graphic_path
1911 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1909 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1912
1910
1913 return render(request, 'real_time.html', kwargs)
1911 return render(request, 'real_time.html', kwargs)
1914
1912
1915 def theme(request, theme):
1913 def theme(request, theme):
1916
1914
1917 user = request.user
1915 user = request.user
1918 user.profile.theme = theme
1916 user.profile.theme = theme
1919 user.save()
1917 user.save()
1920 return redirect('index')
1918 return redirect('index')
General Comments 0
You need to be logged in to leave comments. Login now