##// END OF EJS Templates
Add Change IP function for DDS Device...
Juan C. Espinoza -
r219:5b7b585249bb
parent child
Show More
@@ -1,183 +1,192
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 .models import Device, Experiment, Campaign, Location
3 from .models import Device, Experiment, Campaign, Location
4 from apps.main.models import Configuration
4 from apps.main.models import Configuration
5 from django.template.defaultfilters import default
5
6
6 FILE_FORMAT = (
7 FILE_FORMAT = (
7 ('json', 'json'),
8 ('json', 'json'),
8 )
9 )
9
10
10 DDS_FILE_FORMAT = (
11 DDS_FILE_FORMAT = (
11 ('json', 'json'),
12 ('json', 'json'),
12 ('text', 'dds')
13 ('text', 'dds')
13 )
14 )
14
15
15 RC_FILE_FORMAT = (
16 RC_FILE_FORMAT = (
16 ('json', 'json'),
17 ('json', 'json'),
17 ('text', 'racp'),
18 ('text', 'racp'),
18 ('binary', 'dat'),
19 ('binary', 'dat'),
19 )
20 )
20
21
21 def add_empty_choice(choices, pos=0, label='-----'):
22 def add_empty_choice(choices, pos=0, label='-----'):
22 if len(choices)>0:
23 if len(choices)>0:
23 choices = list(choices)
24 choices = list(choices)
24 choices.insert(0, (0, label))
25 choices.insert(0, (0, label))
25 return choices
26 return choices
26 else:
27 else:
27 return [(0, label)]
28 return [(0, label)]
28
29
29 class DatepickerWidget(forms.widgets.TextInput):
30 class DatepickerWidget(forms.widgets.TextInput):
30 def render(self, name, value, attrs=None):
31 def render(self, name, value, attrs=None):
31 input_html = super(DatepickerWidget, self).render(name, value, attrs)
32 input_html = super(DatepickerWidget, self).render(name, value, attrs)
32 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span></div>'
33 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span></div>'
33 return mark_safe(html)
34 return mark_safe(html)
34
35
35 class DateRangepickerWidget(forms.widgets.TextInput):
36 class DateRangepickerWidget(forms.widgets.TextInput):
36 def render(self, name, value, attrs=None):
37 def render(self, name, value, attrs=None):
37 start = attrs['start_date']
38 start = attrs['start_date']
38 end = attrs['end_date']
39 end = attrs['end_date']
39 html = '''<div class="col-md-6 input-group date" style="float:inherit">
40 html = '''<div class="col-md-6 input-group date" style="float:inherit">
40 <input class="form-control" id="id_start_date" name="start_date" placeholder="Start" title="" type="text" value="{}">
41 <input class="form-control" id="id_start_date" name="start_date" placeholder="Start" title="" type="text" value="{}">
41 <span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>
42 <span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>
42 </div>
43 </div>
43 <div class="col-md-6 input-group date" style="float:inherit">
44 <div class="col-md-6 input-group date" style="float:inherit">
44 <input class="form-control" id="id_end_date" name="end_date" placeholder="End" title="" type="text" value="{}">
45 <input class="form-control" id="id_end_date" name="end_date" placeholder="End" title="" type="text" value="{}">
45 <span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>
46 <span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>
46 </div>'''.format(start, end)
47 </div>'''.format(start, end)
47 return mark_safe(html)
48 return mark_safe(html)
48
49
49 class TimepickerWidget(forms.widgets.TextInput):
50 class TimepickerWidget(forms.widgets.TextInput):
50 def render(self, name, value, attrs=None):
51 def render(self, name, value, attrs=None):
51 input_html = super(TimepickerWidget, self).render(name, value, attrs)
52 input_html = super(TimepickerWidget, self).render(name, value, attrs)
52 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span></div>'
53 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span></div>'
53 return mark_safe(html)
54 return mark_safe(html)
54
55
55 class CampaignForm(forms.ModelForm):
56 class CampaignForm(forms.ModelForm):
56
57
57 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
58 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
58 queryset=Experiment.objects.filter(template=True),
59 queryset=Experiment.objects.filter(template=True),
59 required=False)
60 required=False)
60
61
61 def __init__(self, *args, **kwargs):
62 def __init__(self, *args, **kwargs):
62 super(CampaignForm, self).__init__(*args, **kwargs)
63 super(CampaignForm, self).__init__(*args, **kwargs)
63 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
64 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
64 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
65 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
65 self.fields['description'].widget.attrs = {'rows': 2}
66 self.fields['description'].widget.attrs = {'rows': 2}
66
67
67 if self.instance.pk:
68 if self.instance.pk:
68 self.fields['experiments'].queryset |= self.instance.experiments.all()
69 self.fields['experiments'].queryset |= self.instance.experiments.all()
69
70
70 class Meta:
71 class Meta:
71 model = Campaign
72 model = Campaign
72 exclude = ['']
73 exclude = ['']
73
74
74
75
75 class ExperimentForm(forms.ModelForm):
76 class ExperimentForm(forms.ModelForm):
76
77
77 def __init__(self, *args, **kwargs):
78 def __init__(self, *args, **kwargs):
78 super(ExperimentForm, self).__init__(*args, **kwargs)
79 super(ExperimentForm, self).__init__(*args, **kwargs)
79 self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
80 self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
80 self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
81 self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
81
82
82 class Meta:
83 class Meta:
83 model = Experiment
84 model = Experiment
84 exclude = ['status']
85 exclude = ['status']
85
86
86 class LocationForm(forms.ModelForm):
87 class LocationForm(forms.ModelForm):
87 class Meta:
88 class Meta:
88 model = Location
89 model = Location
89 exclude = ['']
90 exclude = ['']
90
91
91 class DeviceForm(forms.ModelForm):
92 class DeviceForm(forms.ModelForm):
92 class Meta:
93 class Meta:
93 model = Device
94 model = Device
94 exclude = ['status']
95 exclude = ['status']
95
96
96 class ConfigurationForm(forms.ModelForm):
97 class ConfigurationForm(forms.ModelForm):
97
98
98 def __init__(self, *args, **kwargs):
99 def __init__(self, *args, **kwargs):
99 super(ConfigurationForm, self).__init__(*args, **kwargs)
100 super(ConfigurationForm, self).__init__(*args, **kwargs)
100
101
101 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
102 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
102 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
103 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
103
104
104 class Meta:
105 class Meta:
105 model = Configuration
106 model = Configuration
106 exclude = ['type', 'created_date', 'programmed_date', 'parameters']
107 exclude = ['type', 'created_date', 'programmed_date', 'parameters']
107
108
108 #class DeviceTypeForm(forms.Form):
109 #class DeviceTypeForm(forms.Form):
109 # device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name')))
110 # device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name')))
110
111
111
112
112 class UploadFileForm(forms.Form):
113 class UploadFileForm(forms.Form):
113
114
114 file = forms.FileField()
115 file = forms.FileField()
115
116
116 class DownloadFileForm(forms.Form):
117 class DownloadFileForm(forms.Form):
117
118
118 format = forms.ChoiceField(choices= ((0, 'json'),) )
119 format = forms.ChoiceField(choices= ((0, 'json'),) )
119
120
120 def __init__(self, device_type, *args, **kwargs):
121 def __init__(self, device_type, *args, **kwargs):
121
122
122 super(DownloadFileForm, self).__init__(*args, **kwargs)
123 super(DownloadFileForm, self).__init__(*args, **kwargs)
123
124
124 self.fields['format'].choices = FILE_FORMAT
125 self.fields['format'].choices = FILE_FORMAT
125
126
126 if device_type == 'dds':
127 if device_type == 'dds':
127 self.fields['format'].choices = DDS_FILE_FORMAT
128 self.fields['format'].choices = DDS_FILE_FORMAT
128
129
129 if device_type == 'rc':
130 if device_type == 'rc':
130 self.fields['format'].choices = RC_FILE_FORMAT
131 self.fields['format'].choices = RC_FILE_FORMAT
131
132
132 class OperationForm(forms.Form):
133 class OperationForm(forms.Form):
133
134
134 campaign = forms.ChoiceField(label="Campaign")
135 campaign = forms.ChoiceField(label="Campaign")
135
136
136 def __init__(self, *args, **kwargs):
137 def __init__(self, *args, **kwargs):
137
138
138 campaigns = kwargs.pop('campaigns')
139 campaigns = kwargs.pop('campaigns')
139 super(OperationForm, self).__init__(*args, **kwargs)
140 super(OperationForm, self).__init__(*args, **kwargs)
140 self.fields['campaign'].label = 'Current Campaigns'
141 self.fields['campaign'].label = 'Current Campaigns'
141 self.fields['campaign'].choices = add_empty_choice(campaigns.values_list('id', 'name'))
142 self.fields['campaign'].choices = add_empty_choice(campaigns.values_list('id', 'name'))
142
143
143
144
144 class OperationSearchForm(forms.Form):
145 class OperationSearchForm(forms.Form):
145 # -----ALL Campaigns------
146 # -----ALL Campaigns------
146 campaign = forms.ChoiceField(label="Campaign")
147 campaign = forms.ChoiceField(label="Campaign")
147
148
148 def __init__(self, *args, **kwargs):
149 def __init__(self, *args, **kwargs):
149 super(OperationSearchForm, self).__init__(*args, **kwargs)
150 super(OperationSearchForm, self).__init__(*args, **kwargs)
150 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
151 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
151
152
152
153
153 class NewForm(forms.Form):
154 class NewForm(forms.Form):
154
155
155 create_from = forms.ChoiceField(choices=((0, '-----'),
156 create_from = forms.ChoiceField(choices=((0, '-----'),
156 (1, 'Empty (blank)'),
157 (1, 'Empty (blank)'),
157 (2, 'Template')))
158 (2, 'Template')))
158 choose_template = forms.ChoiceField()
159 choose_template = forms.ChoiceField()
159
160
160 def __init__(self, *args, **kwargs):
161 def __init__(self, *args, **kwargs):
161
162
162 template_choices = kwargs.pop('template_choices', [])
163 template_choices = kwargs.pop('template_choices', [])
163 super(NewForm, self).__init__(*args, **kwargs)
164 super(NewForm, self).__init__(*args, **kwargs)
164 self.fields['choose_template'].choices = add_empty_choice(template_choices)
165 self.fields['choose_template'].choices = add_empty_choice(template_choices)
165
166
166
167
167 class FilterForm(forms.Form):
168 class FilterForm(forms.Form):
168
169
169 def __init__(self, *args, **kwargs):
170 def __init__(self, *args, **kwargs):
170 extra_fields = kwargs.pop('extra_fields', [])
171 extra_fields = kwargs.pop('extra_fields', [])
171 super(FilterForm, self).__init__(*args, **kwargs)
172 super(FilterForm, self).__init__(*args, **kwargs)
172
173
173 for field in extra_fields:
174 for field in extra_fields:
174 if 'range_date' in field:
175 if 'range_date' in field:
175 self.fields[field] = forms.CharField(required=False)
176 self.fields[field] = forms.CharField(required=False)
176 self.fields[field].widget = DateRangepickerWidget()
177 self.fields[field].widget = DateRangepickerWidget()
177 if 'initial' in kwargs:
178 if 'initial' in kwargs:
178 self.fields[field].widget.attrs = {'start_date':kwargs['initial'].get('start_date', ''),
179 self.fields[field].widget.attrs = {'start_date':kwargs['initial'].get('start_date', ''),
179 'end_date':kwargs['initial'].get('end_date', '')}
180 'end_date':kwargs['initial'].get('end_date', '')}
180 elif 'template' in field:
181 elif 'template' in field:
181 self.fields['template'] = forms.BooleanField(required=False)
182 self.fields['template'] = forms.BooleanField(required=False)
182 else:
183 else:
183 self.fields[field] = forms.CharField(required=False)
184 self.fields[field] = forms.CharField(required=False)
185
186 class ChangeIpForm(forms.Form):
187
188 ip_address = forms.GenericIPAddressField()
189 mask = forms.GenericIPAddressField(initial='255.255.255.0')
190 gateway = forms.GenericIPAddressField(initial='0.0.0.0')
191
192
@@ -1,658 +1,686
1
1
2 from datetime import datetime
2 from datetime import datetime
3 from django.template.base import kwarg_re
3
4
4 try:
5 try:
5 from polymorphic.models import PolymorphicModel
6 from polymorphic.models import PolymorphicModel
6 except:
7 except:
7 from polymorphic import PolymorphicModel
8 from polymorphic import PolymorphicModel
8
9
9 from django.db import models
10 from django.db import models
10 from django.core.urlresolvers import reverse
11 from django.core.urlresolvers import reverse
11 from django.shortcuts import get_object_or_404
12 from django.shortcuts import get_object_or_404
12
13
14 from devices.dds import api as dds_api
13
15
14 EXP_STATES = (
16 EXP_STATES = (
15 (0,'Error'), #RED
17 (0,'Error'), #RED
16 (1,'Configured'), #BLUE
18 (1,'Configured'), #BLUE
17 (2,'Running'), #GREEN
19 (2,'Running'), #GREEN
18 (3,'Scheduled'), #YELLOW
20 (3,'Scheduled'), #YELLOW
19 (4,'Not Configured'), #WHITE
21 (4,'Not Configured'), #WHITE
20 )
22 )
21
23
22 CONF_TYPES = (
24 CONF_TYPES = (
23 (0, 'Active'),
25 (0, 'Active'),
24 (1, 'Historical'),
26 (1, 'Historical'),
25 )
27 )
26
28
27 DEV_STATES = (
29 DEV_STATES = (
28 (0, 'No connected'),
30 (0, 'No connected'),
29 (1, 'Connected'),
31 (1, 'Connected'),
30 (2, 'Configured'),
32 (2, 'Configured'),
31 (3, 'Running'),
33 (3, 'Running'),
32 (4, 'Unknown'),
34 (4, 'Unknown'),
33 )
35 )
34
36
35 DEV_TYPES = (
37 DEV_TYPES = (
36 ('', 'Select a device type'),
38 ('', 'Select a device type'),
37 ('rc', 'Radar Controller'),
39 ('rc', 'Radar Controller'),
38 ('dds', 'Direct Digital Synthesizer'),
40 ('dds', 'Direct Digital Synthesizer'),
39 ('jars', 'Jicamarca Radar Acquisition System'),
41 ('jars', 'Jicamarca Radar Acquisition System'),
40 ('usrp', 'Universal Software Radio Peripheral'),
42 ('usrp', 'Universal Software Radio Peripheral'),
41 ('cgs', 'Clock Generator System'),
43 ('cgs', 'Clock Generator System'),
42 ('abs', 'Automatic Beam Switching'),
44 ('abs', 'Automatic Beam Switching'),
43 )
45 )
44
46
45 DEV_PORTS = {
47 DEV_PORTS = {
46 'rc' : 2000,
48 'rc' : 2000,
47 'dds' : 2000,
49 'dds' : 2000,
48 'jars' : 2000,
50 'jars' : 2000,
49 'usrp' : 2000,
51 'usrp' : 2000,
50 'cgs' : 8080,
52 'cgs' : 8080,
51 'abs' : 8080
53 'abs' : 8080
52 }
54 }
53
55
54 RADAR_STATES = (
56 RADAR_STATES = (
55 (0, 'No connected'),
57 (0, 'No connected'),
56 (1, 'Connected'),
58 (1, 'Connected'),
57 (2, 'Configured'),
59 (2, 'Configured'),
58 (3, 'Running'),
60 (3, 'Running'),
59 (4, 'Scheduled'),
61 (4, 'Scheduled'),
60 )
62 )
61
63
62
64
63 class Location(models.Model):
65 class Location(models.Model):
64
66
65 name = models.CharField(max_length = 30)
67 name = models.CharField(max_length = 30)
66 description = models.TextField(blank=True, null=True)
68 description = models.TextField(blank=True, null=True)
67
69
68 class Meta:
70 class Meta:
69 db_table = 'db_location'
71 db_table = 'db_location'
70
72
71 def __str__(self):
73 def __str__(self):
72 return u'%s' % self.name
74 return u'%s' % self.name
73
75
74 def get_absolute_url(self):
76 def get_absolute_url(self):
75 return reverse('url_location', args=[str(self.id)])
77 return reverse('url_location', args=[str(self.id)])
76
78
77
79
78 class DeviceType(models.Model):
80 class DeviceType(models.Model):
79
81
80 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
82 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
81 sequence = models.PositiveSmallIntegerField(default=1000)
83 sequence = models.PositiveSmallIntegerField(default=1000)
82 description = models.TextField(blank=True, null=True)
84 description = models.TextField(blank=True, null=True)
83
85
84 class Meta:
86 class Meta:
85 db_table = 'db_device_types'
87 db_table = 'db_device_types'
86
88
87 def __str__(self):
89 def __str__(self):
88 return u'%s' % self.get_name_display()
90 return u'%s' % self.get_name_display()
89
91
90 class Device(models.Model):
92 class Device(models.Model):
91
93
92 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
94 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
93 location = models.ForeignKey(Location, on_delete=models.CASCADE)
95 location = models.ForeignKey(Location, on_delete=models.CASCADE)
94
96
95 name = models.CharField(max_length=40, default='')
97 name = models.CharField(max_length=40, default='')
96 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
98 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
97 port_address = models.PositiveSmallIntegerField(default=2000)
99 port_address = models.PositiveSmallIntegerField(default=2000)
98 description = models.TextField(blank=True, null=True)
100 description = models.TextField(blank=True, null=True)
99 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
101 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
100
102
101 class Meta:
103 class Meta:
102 db_table = 'db_devices'
104 db_table = 'db_devices'
103
105
104 def __str__(self):
106 def __str__(self):
105 return u'[{}]: {}'.format(self.device_type.name.upper(),
107 return u'[{}]: {}'.format(self.device_type.name.upper(),
106 self.name)
108 self.name)
107
109
108 def get_status(self):
110 def get_status(self):
109 return self.status
111 return self.status
110
112
111 @property
113 @property
112 def status_color(self):
114 def status_color(self):
113 color = 'muted'
115 color = 'muted'
114 if self.status == 0:
116 if self.status == 0:
115 color = "danger"
117 color = "danger"
116 elif self.status == 1:
118 elif self.status == 1:
117 color = "warning"
119 color = "warning"
118 elif self.status == 2:
120 elif self.status == 2:
119 color = "info"
121 color = "info"
120 elif self.status == 3:
122 elif self.status == 3:
121 color = "success"
123 color = "success"
122
124
123 return color
125 return color
124
126
125 def url(self, path=None):
127 def url(self, path=None):
126
128
127 if path:
129 if path:
128 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
130 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
129 else:
131 else:
130 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
132 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
131
133
132 def get_absolute_url(self):
134 def get_absolute_url(self):
133
135
134 return reverse('url_device', args=[str(self.id)])
136 return reverse('url_device', args=[str(self.id)])
135
137
138 def change_ip(self, ip_address, mask, gateway, **kwargs):
139
140 if self.device_type.name=='dds':
141 try:
142 #if True:
143 answer = dds_api.change_ip(ip = self.ip_address,
144 port = self.port_address,
145 new_ip = ip_address,
146 mask = mask,
147 gateway = gateway)
148 if answer[0]=='1':
149 self.message = 'DDS - {}'.format(answer)
150 self.ip_address = ip_address
151 self.save()
152 else:
153 self.message = 'DDS - {}'.format(answer)
154 return False
155 except Exception as e:
156 self.message = str(e)
157 return False
158 else:
159 self.message = 'Not implemented'
160 return False
161
162 return True
163
136
164
137 class Campaign(models.Model):
165 class Campaign(models.Model):
138
166
139 template = models.BooleanField(default=False)
167 template = models.BooleanField(default=False)
140 name = models.CharField(max_length=60, unique=True)
168 name = models.CharField(max_length=60, unique=True)
141 start_date = models.DateTimeField(blank=True, null=True)
169 start_date = models.DateTimeField(blank=True, null=True)
142 end_date = models.DateTimeField(blank=True, null=True)
170 end_date = models.DateTimeField(blank=True, null=True)
143 tags = models.CharField(max_length=40)
171 tags = models.CharField(max_length=40)
144 description = models.TextField(blank=True, null=True)
172 description = models.TextField(blank=True, null=True)
145 experiments = models.ManyToManyField('Experiment', blank=True)
173 experiments = models.ManyToManyField('Experiment', blank=True)
146
174
147 class Meta:
175 class Meta:
148 db_table = 'db_campaigns'
176 db_table = 'db_campaigns'
149 ordering = ('name',)
177 ordering = ('name',)
150
178
151 def __str__(self):
179 def __str__(self):
152 if self.template:
180 if self.template:
153 return u'{} (template)'.format(self.name)
181 return u'{} (template)'.format(self.name)
154 else:
182 else:
155 return u'{}'.format(self.name)
183 return u'{}'.format(self.name)
156
184
157 def parms_to_dict(self):
185 def parms_to_dict(self):
158
186
159 import json
187 import json
160
188
161 parameters = {}
189 parameters = {}
162 exp_parameters = {}
190 exp_parameters = {}
163 experiments = Experiment.objects.filter(campaign = self)
191 experiments = Experiment.objects.filter(campaign = self)
164
192
165 i=1
193 i=1
166 for experiment in experiments:
194 for experiment in experiments:
167 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
195 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
168 i += 1
196 i += 1
169
197
170
198
171 parameters['experiments'] = exp_parameters
199 parameters['experiments'] = exp_parameters
172 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
200 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
173 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
201 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
174 parameters['campaign'] = self.__str__()
202 parameters['campaign'] = self.__str__()
175 parameters['tags'] =self.tags
203 parameters['tags'] =self.tags
176
204
177 parameters = json.dumps(parameters, indent=2, sort_keys=False)
205 parameters = json.dumps(parameters, indent=2, sort_keys=False)
178
206
179 return parameters
207 return parameters
180
208
181 def import_from_file(self, fp):
209 def import_from_file(self, fp):
182
210
183 import os, json
211 import os, json
184
212
185 parms = {}
213 parms = {}
186
214
187 path, ext = os.path.splitext(fp.name)
215 path, ext = os.path.splitext(fp.name)
188
216
189 if ext == '.json':
217 if ext == '.json':
190 parms = json.loads(fp.read())
218 parms = json.loads(fp.read())
191
219
192 return parms
220 return parms
193
221
194 def dict_to_parms(self, parms, CONF_MODELS):
222 def dict_to_parms(self, parms, CONF_MODELS):
195
223
196 experiments = Experiment.objects.filter(campaign = self)
224 experiments = Experiment.objects.filter(campaign = self)
197 configurations = Configuration.objects.filter(experiment = experiments)
225 configurations = Configuration.objects.filter(experiment = experiments)
198
226
199 if configurations:
227 if configurations:
200 for configuration in configurations:
228 for configuration in configurations:
201 configuration.delete()
229 configuration.delete()
202
230
203 if experiments:
231 if experiments:
204 for experiment in experiments:
232 for experiment in experiments:
205 experiment.delete()
233 experiment.delete()
206
234
207 for parms_exp in parms['experiments']:
235 for parms_exp in parms['experiments']:
208 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
236 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
209 new_exp = Experiment(
237 new_exp = Experiment(
210 name = parms['experiments'][parms_exp]['experiment'],
238 name = parms['experiments'][parms_exp]['experiment'],
211 location = location,
239 location = location,
212 start_time = parms['experiments'][parms_exp]['start_time'],
240 start_time = parms['experiments'][parms_exp]['start_time'],
213 end_time = parms['experiments'][parms_exp]['end_time'],
241 end_time = parms['experiments'][parms_exp]['end_time'],
214 )
242 )
215 new_exp.save()
243 new_exp.save()
216 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
244 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
217 new_exp.save()
245 new_exp.save()
218
246
219 self.name = parms['campaign']
247 self.name = parms['campaign']
220 self.start_date = parms['start_date']
248 self.start_date = parms['start_date']
221 self.end_date = parms['end_date']
249 self.end_date = parms['end_date']
222 self.tags = parms['tags']
250 self.tags = parms['tags']
223 self.experiments.add(new_exp)
251 self.experiments.add(new_exp)
224 self.save()
252 self.save()
225
253
226 return self
254 return self
227
255
228 def get_experiments_by_radar(self, radar=None):
256 def get_experiments_by_radar(self, radar=None):
229
257
230 ret = []
258 ret = []
231 if radar:
259 if radar:
232 locations = Location.objects.filter(pk=radar)
260 locations = Location.objects.filter(pk=radar)
233 else:
261 else:
234 locations = set([e.location for e in self.experiments.all()])
262 locations = set([e.location for e in self.experiments.all()])
235
263
236 for loc in locations:
264 for loc in locations:
237 dum = {}
265 dum = {}
238 dum['name'] = loc.name
266 dum['name'] = loc.name
239 dum['id'] = loc.pk
267 dum['id'] = loc.pk
240 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
268 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
241 ret.append(dum)
269 ret.append(dum)
242
270
243 return ret
271 return ret
244
272
245 def get_absolute_url(self):
273 def get_absolute_url(self):
246 return reverse('url_campaign', args=[str(self.id)])
274 return reverse('url_campaign', args=[str(self.id)])
247
275
248 def get_absolute_url_edit(self):
276 def get_absolute_url_edit(self):
249 return reverse('url_edit_campaign', args=[str(self.id)])
277 return reverse('url_edit_campaign', args=[str(self.id)])
250
278
251 def get_absolute_url_export(self):
279 def get_absolute_url_export(self):
252 return reverse('url_export_campaign', args=[str(self.id)])
280 return reverse('url_export_campaign', args=[str(self.id)])
253
281
254 def get_absolute_url_import(self):
282 def get_absolute_url_import(self):
255 return reverse('url_import_campaign', args=[str(self.id)])
283 return reverse('url_import_campaign', args=[str(self.id)])
256
284
257
285
258
286
259 class RunningExperiment(models.Model):
287 class RunningExperiment(models.Model):
260 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
288 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
261 running_experiment = models.ManyToManyField('Experiment', blank = True)
289 running_experiment = models.ManyToManyField('Experiment', blank = True)
262 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
290 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
263
291
264
292
265 class Experiment(models.Model):
293 class Experiment(models.Model):
266
294
267 template = models.BooleanField(default=False)
295 template = models.BooleanField(default=False)
268 name = models.CharField(max_length=40, default='', unique=True)
296 name = models.CharField(max_length=40, default='', unique=True)
269 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
297 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
270 start_time = models.TimeField(default='00:00:00')
298 start_time = models.TimeField(default='00:00:00')
271 end_time = models.TimeField(default='23:59:59')
299 end_time = models.TimeField(default='23:59:59')
272 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
300 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
273
301
274 class Meta:
302 class Meta:
275 db_table = 'db_experiments'
303 db_table = 'db_experiments'
276 ordering = ('template', 'name')
304 ordering = ('template', 'name')
277
305
278 def __str__(self):
306 def __str__(self):
279 if self.template:
307 if self.template:
280 return u'%s (template)' % (self.name)
308 return u'%s (template)' % (self.name)
281 else:
309 else:
282 return u'%s' % (self.name)
310 return u'%s' % (self.name)
283
311
284 @property
312 @property
285 def radar_system(self):
313 def radar_system(self):
286 return self.location
314 return self.location
287
315
288 def clone(self, **kwargs):
316 def clone(self, **kwargs):
289
317
290 confs = Configuration.objects.filter(experiment=self, type=0)
318 confs = Configuration.objects.filter(experiment=self, type=0)
291 self.pk = None
319 self.pk = None
292 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
320 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
293 for attr, value in kwargs.items():
321 for attr, value in kwargs.items():
294 setattr(self, attr, value)
322 setattr(self, attr, value)
295
323
296 self.save()
324 self.save()
297
325
298 for conf in confs:
326 for conf in confs:
299 conf.clone(experiment=self, template=False)
327 conf.clone(experiment=self, template=False)
300
328
301 return self
329 return self
302
330
303 def start(self):
331 def start(self):
304 '''
332 '''
305 Configure and start experiments's devices
333 Configure and start experiments's devices
306 '''
334 '''
307
335
308 result = 2
336 result = 2
309
337
310 confs = Configuration.objects.filter(experiment=self).order_by('device__device_type__sequence')
338 confs = Configuration.objects.filter(experiment=self).order_by('device__device_type__sequence')
311 for conf in confs:
339 for conf in confs:
312 if conf.write_device():
340 if conf.write_device():
313 if conf.start_device():
341 if conf.start_device():
314 result &= 2
342 result &= 2
315 else:
343 else:
316 result &= 0
344 result &= 0
317 else:
345 else:
318 result &= 0
346 result &= 0
319
347
320 return result
348 return result
321
349
322 def stop(self):
350 def stop(self):
323 '''
351 '''
324 Stop experiments's devices
352 Stop experiments's devices
325 '''
353 '''
326
354
327 result = 1
355 result = 1
328
356
329 confs = Configuration.objects.filter(experiment=self).order_by('-device__device_type__sequence')
357 confs = Configuration.objects.filter(experiment=self).order_by('-device__device_type__sequence')
330 for conf in confs:
358 for conf in confs:
331 if conf.stop_device():
359 if conf.stop_device():
332 result &= 1
360 result &= 1
333 else:
361 else:
334 result &= 0
362 result &= 0
335
363
336 return result
364 return result
337
365
338 def get_status(self):
366 def get_status(self):
339
367
340 confs = Configuration.objects.filter(experiment=self)
368 confs = Configuration.objects.filter(experiment=self)
341
369
342 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
370 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
343
371
344 if total==2*confs.count():
372 if total==2*confs.count():
345 status = 1
373 status = 1
346 elif total == 3*confs.count():
374 elif total == 3*confs.count():
347 status = 2
375 status = 2
348 else:
376 else:
349 status = 0
377 status = 0
350
378
351 if self.status<>3:
379 if self.status<>3:
352 self.status = status
380 self.status = status
353 self.save()
381 self.save()
354
382
355 def status_color(self):
383 def status_color(self):
356 color = 'muted'
384 color = 'muted'
357 if self.status == 0:
385 if self.status == 0:
358 color = "danger"
386 color = "danger"
359 elif self.status == 1:
387 elif self.status == 1:
360 color = "info"
388 color = "info"
361 elif self.status == 2:
389 elif self.status == 2:
362 color = "success"
390 color = "success"
363 elif self.status == 3:
391 elif self.status == 3:
364 color = "warning"
392 color = "warning"
365
393
366 return color
394 return color
367
395
368 def parms_to_dict(self):
396 def parms_to_dict(self):
369
397
370 import json
398 import json
371
399
372 configurations = Configuration.objects.filter(experiment=self)
400 configurations = Configuration.objects.filter(experiment=self)
373 conf_parameters = {}
401 conf_parameters = {}
374 parameters={}
402 parameters={}
375
403
376 for configuration in configurations:
404 for configuration in configurations:
377 if 'cgs' in configuration.device.device_type.name:
405 if 'cgs' in configuration.device.device_type.name:
378 conf_parameters['cgs'] = configuration.parms_to_dict()
406 conf_parameters['cgs'] = configuration.parms_to_dict()
379 if 'dds' in configuration.device.device_type.name:
407 if 'dds' in configuration.device.device_type.name:
380 conf_parameters['dds'] = configuration.parms_to_dict()
408 conf_parameters['dds'] = configuration.parms_to_dict()
381 if 'rc' in configuration.device.device_type.name:
409 if 'rc' in configuration.device.device_type.name:
382 conf_parameters['rc'] = configuration.parms_to_dict()
410 conf_parameters['rc'] = configuration.parms_to_dict()
383 if 'jars' in configuration.device.device_type.name:
411 if 'jars' in configuration.device.device_type.name:
384 conf_parameters['jars'] = configuration.parms_to_dict()
412 conf_parameters['jars'] = configuration.parms_to_dict()
385 if 'usrp' in configuration.device.device_type.name:
413 if 'usrp' in configuration.device.device_type.name:
386 conf_parameters['usrp'] = configuration.parms_to_dict()
414 conf_parameters['usrp'] = configuration.parms_to_dict()
387 if 'abs' in configuration.device.device_type.name:
415 if 'abs' in configuration.device.device_type.name:
388 conf_parameters['abs'] = configuration.parms_to_dict()
416 conf_parameters['abs'] = configuration.parms_to_dict()
389
417
390 parameters['configurations'] = conf_parameters
418 parameters['configurations'] = conf_parameters
391 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
419 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
392 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
420 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
393 parameters['radar'] = self.radar_system.name
421 parameters['radar'] = self.radar_system.name
394 parameters['experiment'] = self.name
422 parameters['experiment'] = self.name
395 parameters = json.dumps(parameters, indent=2)
423 parameters = json.dumps(parameters, indent=2)
396
424
397 return parameters
425 return parameters
398
426
399 def import_from_file(self, fp):
427 def import_from_file(self, fp):
400
428
401 import os, json
429 import os, json
402
430
403 parms = {}
431 parms = {}
404
432
405 path, ext = os.path.splitext(fp.name)
433 path, ext = os.path.splitext(fp.name)
406
434
407 if ext == '.json':
435 if ext == '.json':
408 parms = json.loads(fp.read().decode('utf-8'))
436 parms = json.loads(fp.read().decode('utf-8'))
409
437
410 return parms
438 return parms
411
439
412 def dict_to_parms(self, parms, CONF_MODELS):
440 def dict_to_parms(self, parms, CONF_MODELS):
413
441
414 configurations = Configuration.objects.filter(experiment=self)
442 configurations = Configuration.objects.filter(experiment=self)
415
443
416 if configurations:
444 if configurations:
417 for configuration in configurations:
445 for configuration in configurations:
418 configuration.delete()
446 configuration.delete()
419
447
420 for conf_type in parms['configurations']:
448 for conf_type in parms['configurations']:
421 #--For ABS Device:
449 #--For ABS Device:
422 #--For USRP Device:
450 #--For USRP Device:
423 #--For JARS Device:
451 #--For JARS Device:
424 if conf_type == 'jars':
452 if conf_type == 'jars':
425 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
453 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
426 DevConfModel = CONF_MODELS[conf_type]
454 DevConfModel = CONF_MODELS[conf_type]
427 confjars_form = DevConfModel(
455 confjars_form = DevConfModel(
428 experiment = self,
456 experiment = self,
429 name = 'JARS',
457 name = 'JARS',
430 device=device,
458 device=device,
431 )
459 )
432 confjars_form.dict_to_parms(parms['configurations']['jars'])
460 confjars_form.dict_to_parms(parms['configurations']['jars'])
433 confjars_form.save()
461 confjars_form.save()
434 #--For RC Device:
462 #--For RC Device:
435 if conf_type == 'rc':
463 if conf_type == 'rc':
436 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
464 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
437 DevConfModel = CONF_MODELS[conf_type]
465 DevConfModel = CONF_MODELS[conf_type]
438 confrc_form = DevConfModel(
466 confrc_form = DevConfModel(
439 experiment = self,
467 experiment = self,
440 name = 'RC',
468 name = 'RC',
441 device=device,
469 device=device,
442 )
470 )
443 confrc_form.dict_to_parms(parms['configurations']['rc'])
471 confrc_form.dict_to_parms(parms['configurations']['rc'])
444 confrc_form.save()
472 confrc_form.save()
445 #--For DDS Device:
473 #--For DDS Device:
446 if conf_type == 'dds':
474 if conf_type == 'dds':
447 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
475 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
448 DevConfModel = CONF_MODELS[conf_type]
476 DevConfModel = CONF_MODELS[conf_type]
449 confdds_form = DevConfModel(
477 confdds_form = DevConfModel(
450 experiment = self,
478 experiment = self,
451 name = 'DDS',
479 name = 'DDS',
452 device=device,
480 device=device,
453 )
481 )
454 confdds_form.dict_to_parms(parms['configurations']['dds'])
482 confdds_form.dict_to_parms(parms['configurations']['dds'])
455 confdds_form.save()
483 confdds_form.save()
456 #--For CGS Device:
484 #--For CGS Device:
457 if conf_type == 'cgs':
485 if conf_type == 'cgs':
458 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
486 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
459 DevConfModel = CONF_MODELS[conf_type]
487 DevConfModel = CONF_MODELS[conf_type]
460 confcgs_form = DevConfModel(
488 confcgs_form = DevConfModel(
461 experiment = self,
489 experiment = self,
462 name = 'CGS',
490 name = 'CGS',
463 device=device,
491 device=device,
464 )
492 )
465 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
493 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
466 confcgs_form.save()
494 confcgs_form.save()
467
495
468 location = Location.objects.get(name = parms['radar'])
496 location = Location.objects.get(name = parms['radar'])
469 self.name = parms['experiment']
497 self.name = parms['experiment']
470 self.location = location
498 self.location = location
471 self.start_time = parms['start_time']
499 self.start_time = parms['start_time']
472 self.end_time = parms['end_time']
500 self.end_time = parms['end_time']
473 self.save()
501 self.save()
474
502
475 return self
503 return self
476
504
477 def get_absolute_url(self):
505 def get_absolute_url(self):
478 return reverse('url_experiment', args=[str(self.id)])
506 return reverse('url_experiment', args=[str(self.id)])
479
507
480 def get_absolute_url_edit(self):
508 def get_absolute_url_edit(self):
481 return reverse('url_edit_experiment', args=[str(self.id)])
509 return reverse('url_edit_experiment', args=[str(self.id)])
482
510
483 def get_absolute_url_import(self):
511 def get_absolute_url_import(self):
484 return reverse('url_import_experiment', args=[str(self.id)])
512 return reverse('url_import_experiment', args=[str(self.id)])
485
513
486 def get_absolute_url_export(self):
514 def get_absolute_url_export(self):
487 return reverse('url_export_experiment', args=[str(self.id)])
515 return reverse('url_export_experiment', args=[str(self.id)])
488
516
489
517
490 class Configuration(PolymorphicModel):
518 class Configuration(PolymorphicModel):
491
519
492 template = models.BooleanField(default=False)
520 template = models.BooleanField(default=False)
493
521
494 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
522 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
495
523
496 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
524 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
497 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
525 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
498
526
499 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
527 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
500
528
501 created_date = models.DateTimeField(auto_now_add=True)
529 created_date = models.DateTimeField(auto_now_add=True)
502 programmed_date = models.DateTimeField(auto_now=True)
530 programmed_date = models.DateTimeField(auto_now=True)
503
531
504 parameters = models.TextField(default='{}')
532 parameters = models.TextField(default='{}')
505
533
506 message = ""
534 message = ""
507
535
508 class Meta:
536 class Meta:
509 db_table = 'db_configurations'
537 db_table = 'db_configurations'
510
538
511 def __str__(self):
539 def __str__(self):
512
540
513 device = '{}:'.format(self.device.device_type.name.upper())
541 device = '{}:'.format(self.device.device_type.name.upper())
514
542
515 if 'mix' in [f.name for f in self._meta.get_fields()]:
543 if 'mix' in [f.name for f in self._meta.get_fields()]:
516 if self.mix:
544 if self.mix:
517 device = '{} MIXED:'.format(self.device.device_type.name.upper())
545 device = '{} MIXED:'.format(self.device.device_type.name.upper())
518
546
519 if self.template:
547 if self.template:
520 return u'{} {} (template)'.format(device, self.name)
548 return u'{} {} (template)'.format(device, self.name)
521 else:
549 else:
522 return u'{} {}'.format(device, self.name)
550 return u'{} {}'.format(device, self.name)
523
551
524 def clone(self, **kwargs):
552 def clone(self, **kwargs):
525
553
526 self.pk = None
554 self.pk = None
527 self.id = None
555 self.id = None
528 for attr, value in kwargs.items():
556 for attr, value in kwargs.items():
529 setattr(self, attr, value)
557 setattr(self, attr, value)
530
558
531 self.save()
559 self.save()
532
560
533 return self
561 return self
534
562
535 def parms_to_dict(self):
563 def parms_to_dict(self):
536
564
537 parameters = {}
565 parameters = {}
538
566
539 for key in self.__dict__.keys():
567 for key in self.__dict__.keys():
540 parameters[key] = getattr(self, key)
568 parameters[key] = getattr(self, key)
541
569
542 return parameters
570 return parameters
543
571
544 def parms_to_text(self):
572 def parms_to_text(self):
545
573
546 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
574 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
547
575
548
576
549 def parms_to_binary(self):
577 def parms_to_binary(self):
550
578
551 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
579 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
552
580
553
581
554 def dict_to_parms(self, parameters):
582 def dict_to_parms(self, parameters):
555
583
556 if type(parameters) != type({}):
584 if type(parameters) != type({}):
557 return
585 return
558
586
559 for key in parameters.keys():
587 for key in parameters.keys():
560 setattr(self, key, parameters[key])
588 setattr(self, key, parameters[key])
561
589
562 def export_to_file(self, format="json"):
590 def export_to_file(self, format="json"):
563
591
564 import json
592 import json
565
593
566 content_type = ''
594 content_type = ''
567
595
568 if format == 'text':
596 if format == 'text':
569 content_type = 'text/plain'
597 content_type = 'text/plain'
570 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
598 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
571 content = self.parms_to_text()
599 content = self.parms_to_text()
572
600
573 if format == 'binary':
601 if format == 'binary':
574 content_type = 'application/octet-stream'
602 content_type = 'application/octet-stream'
575 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
603 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
576 content = self.parms_to_binary()
604 content = self.parms_to_binary()
577
605
578 if not content_type:
606 if not content_type:
579 content_type = 'application/json'
607 content_type = 'application/json'
580 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
608 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
581 content = json.dumps(self.parms_to_dict(), indent=2)
609 content = json.dumps(self.parms_to_dict(), indent=2)
582
610
583 fields = {'content_type':content_type,
611 fields = {'content_type':content_type,
584 'filename':filename,
612 'filename':filename,
585 'content':content
613 'content':content
586 }
614 }
587
615
588 return fields
616 return fields
589
617
590 def import_from_file(self, fp):
618 def import_from_file(self, fp):
591
619
592 import os, json
620 import os, json
593
621
594 parms = {}
622 parms = {}
595
623
596 path, ext = os.path.splitext(fp.name)
624 path, ext = os.path.splitext(fp.name)
597
625
598 if ext == '.json':
626 if ext == '.json':
599 parms = json.load(fp)
627 parms = json.load(fp)
600
628
601 return parms
629 return parms
602
630
603 def status_device(self):
631 def status_device(self):
604
632
605 self.message = 'Function not implemented'
633 self.message = 'Function not implemented'
606 return False
634 return False
607
635
608
636
609 def stop_device(self):
637 def stop_device(self):
610
638
611 self.message = 'Function not implemented'
639 self.message = 'Function not implemented'
612 return False
640 return False
613
641
614
642
615 def start_device(self):
643 def start_device(self):
616
644
617 self.message = 'Function not implemented'
645 self.message = 'Function not implemented'
618 return False
646 return False
619
647
620
648
621 def write_device(self, parms):
649 def write_device(self, parms):
622
650
623 self.message = 'Function not implemented'
651 self.message = 'Function not implemented'
624 return False
652 return False
625
653
626
654
627 def read_device(self):
655 def read_device(self):
628
656
629 self.message = 'Function not implemented'
657 self.message = 'Function not implemented'
630 return False
658 return False
631
659
632
660
633 def get_absolute_url(self):
661 def get_absolute_url(self):
634 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
662 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
635
663
636 def get_absolute_url_edit(self):
664 def get_absolute_url_edit(self):
637 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
665 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
638
666
639 def get_absolute_url_import(self):
667 def get_absolute_url_import(self):
640 return reverse('url_import_dev_conf', args=[str(self.id)])
668 return reverse('url_import_dev_conf', args=[str(self.id)])
641
669
642 def get_absolute_url_export(self):
670 def get_absolute_url_export(self):
643 return reverse('url_export_dev_conf', args=[str(self.id)])
671 return reverse('url_export_dev_conf', args=[str(self.id)])
644
672
645 def get_absolute_url_write(self):
673 def get_absolute_url_write(self):
646 return reverse('url_write_dev_conf', args=[str(self.id)])
674 return reverse('url_write_dev_conf', args=[str(self.id)])
647
675
648 def get_absolute_url_read(self):
676 def get_absolute_url_read(self):
649 return reverse('url_read_dev_conf', args=[str(self.id)])
677 return reverse('url_read_dev_conf', args=[str(self.id)])
650
678
651 def get_absolute_url_start(self):
679 def get_absolute_url_start(self):
652 return reverse('url_start_dev_conf', args=[str(self.id)])
680 return reverse('url_start_dev_conf', args=[str(self.id)])
653
681
654 def get_absolute_url_stop(self):
682 def get_absolute_url_stop(self):
655 return reverse('url_stop_dev_conf', args=[str(self.id)])
683 return reverse('url_stop_dev_conf', args=[str(self.id)])
656
684
657 def get_absolute_url_status(self):
685 def get_absolute_url_status(self):
658 return reverse('url_status_dev_conf', args=[str(self.id)])
686 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,26 +1,34
1 {% extends 'base.html' %}
1 {% extends 'base.html' %}
2 {% load bootstrap3 %}
2
3
3 {% block content-title %}{{title}}{% endblock %}
4 {% block content-title %}{{title}}{% endblock %}
4 {% block content-suptitle %}{{suptitle}}{% endblock %}
5 {% block content-suptitle %}{{suptitle}}{% endblock %}
5
6
6 {% block content %}
7 {% block content %}
7
8
8 <form action="" method="post" class="form">{% csrf_token %}
9 <form action="" method="post" class="form">{% csrf_token %}
10 {% if form %}
11 {% bootstrap_form form layout='horizontal' size='medium' %}
12 <div style="clear: both;"></div>
13 {% endif %}
9 {% if delete %}
14 {% if delete %}
10 <h3>Are you sure you wish to delete: {{ object }}?</h3>
15 <h3>Are you sure you wish to delete: {{ object }}?</h3>
11 {% else %}
16 {% else %}
12 <h4>Are you sure you wish to proceed?</h4>
17 {% if message %}
13 {% endif %}
18 <p>{{ message }}</p>
14 {% if message %}<p>{{ message }}</p>{% endif %}
19 {% else %}
20 <h4>Are you sure you wish to proceed?</h4>
21 {% endif %}
22 {% endif %}
15 <br>
23 <br>
16 <div class="pull-right">
24 <div class="pull-right">
17 <button class="btn btn-primary" type="submit">
25 <button class="btn btn-primary" type="submit">
18 <span class="glyphicon glyphicon-ok" aria-hidden="true"></span> Yes
26 <span class="glyphicon glyphicon-ok" aria-hidden="true"></span> Yes
19 </button>
27 </button>
20 <button type="button" class="btn btn-primary" onclick="{% if previous %}window.location.replace('{{ previous }}');{% else %}history.go(-1);{% endif %}">
28 <button type="button" class="btn btn-primary" onclick="{% if previous %}window.location.replace('{{ previous }}');{% else %}history.go(-1);{% endif %}">
21 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> No
29 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> No
22 </button>
30 </button>
23 </div>
31 </div>
24 </form>
32 </form>
25
33
26 {% endblock %}
34 {% endblock %}
@@ -1,34 +1,41
1 {% extends "base.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap3 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5
5
6 {% block dev-active %}active{% endblock %}
6 {% block dev-active %}active{% endblock %}
7
7
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 <table class="table table-bordered">
12 <table class="table table-bordered">
13 {% for key in device_keys %}
13 {% for key in device_keys %}
14 <tr><th>{{key|title}}</th><td>{{device|attr:key}}</td></tr>
14 <tr><th>{{key|title}}</th><td>{{device|attr:key}}</td></tr>
15 {% endfor %}
15 {% endfor %}
16 </table>
16 </table>
17 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit_device">Edit</button>
17 <div class="btn-group pull-right" role="group">
18 <button type="button" class="btn btn-primary" id="bt_edit_device">Edit</button>
19 <button type="button" class="btn btn-primary" id="bt_change_ip_device">Change IP</button>
20 </div>
18 <br></br>
21 <br></br>
19 <br></br>
22 <br></br>
20 {% endblock %}
23 {% endblock %}
21
24
22 {% block sidebar%}
25 {% block sidebar%}
23 {% include "sidebar_devices.html" %}
26 {% include "sidebar_devices.html" %}
24 {% endblock %}
27 {% endblock %}
25
28
26 {% block extra-js%}
29 {% block extra-js%}
27 <script type="text/javascript">
30 <script type="text/javascript">
28
31
29 $("#bt_edit_device").click(function() {
32 $("#bt_edit_device").click(function() {
30 document.location = "{% url 'url_edit_device' device.id%}";
33 document.location = "{% url 'url_edit_device' device.id%}";
31 });
34 });
32
35
36 $("#bt_change_ip_device").click(function() {
37 document.location = "{% url 'url_change_ip_device' device.id%}";
38 });
39
33 </script>
40 </script>
34 {% endblock %} No newline at end of file
41 {% endblock %}
@@ -1,59 +1,60
1 from django.conf.urls import url
1 from django.conf.urls import url
2
2
3 from apps.main import views
3 from apps.main import views
4
4
5 urlpatterns = (
5 urlpatterns = (
6 url(r'^$', views.index, name='index'),
6 url(r'^$', views.index, name='index'),
7 url(r'^location/new/$', views.location_new, name='url_add_location'),
7 url(r'^location/new/$', views.location_new, name='url_add_location'),
8 url(r'^location/$', views.locations, name='url_locations'),
8 url(r'^location/$', views.locations, name='url_locations'),
9 url(r'^location/(?P<id_loc>-?\d+)/$', views.location, name='url_location'),
9 url(r'^location/(?P<id_loc>-?\d+)/$', views.location, name='url_location'),
10 url(r'^location/(?P<id_loc>-?\d+)/edit/$', views.location_edit, name='url_edit_location'),
10 url(r'^location/(?P<id_loc>-?\d+)/edit/$', views.location_edit, name='url_edit_location'),
11 url(r'^location/(?P<id_loc>-?\d+)/delete/$', views.location_delete, name='url_delete_location'),
11 url(r'^location/(?P<id_loc>-?\d+)/delete/$', views.location_delete, name='url_delete_location'),
12
12
13 url(r'^device/new/$', views.device_new, name='url_add_device'),
13 url(r'^device/new/$', views.device_new, name='url_add_device'),
14 url(r'^device/$', views.devices, name='url_devices'),
14 url(r'^device/$', views.devices, name='url_devices'),
15 url(r'^device/(?P<id_dev>-?\d+)/$', views.device, name='url_device'),
15 url(r'^device/(?P<id_dev>-?\d+)/$', views.device, name='url_device'),
16 url(r'^device/(?P<id_dev>-?\d+)/edit/$', views.device_edit, name='url_edit_device'),
16 url(r'^device/(?P<id_dev>-?\d+)/edit/$', views.device_edit, name='url_edit_device'),
17 url(r'^device/(?P<id_dev>-?\d+)/delete/$', views.device_delete, name='url_delete_device'),
17 url(r'^device/(?P<id_dev>-?\d+)/delete/$', views.device_delete, name='url_delete_device'),
18 url(r'^device/(?P<id_dev>-?\d+)/change_ip/$', views.device_change_ip, name='url_change_ip_device'),
18
19
19 url(r'^campaign/new/$', views.campaign_new, name='url_add_campaign'),
20 url(r'^campaign/new/$', views.campaign_new, name='url_add_campaign'),
20 url(r'^campaign/$', views.campaigns, name='url_campaigns'),
21 url(r'^campaign/$', views.campaigns, name='url_campaigns'),
21 url(r'^campaign/(?P<id_camp>-?\d+)/$', views.campaign, name='url_campaign'),
22 url(r'^campaign/(?P<id_camp>-?\d+)/$', views.campaign, name='url_campaign'),
22 url(r'^campaign/(?P<id_camp>-?\d+)/edit/$', views.campaign_edit, name='url_edit_campaign'),
23 url(r'^campaign/(?P<id_camp>-?\d+)/edit/$', views.campaign_edit, name='url_edit_campaign'),
23 url(r'^campaign/(?P<id_camp>-?\d+)/delete/$', views.campaign_delete, name='url_delete_campaign'),
24 url(r'^campaign/(?P<id_camp>-?\d+)/delete/$', views.campaign_delete, name='url_delete_campaign'),
24 url(r'^campaign/(?P<id_camp>-?\d+)/export/$', views.campaign_export, name='url_export_campaign'),
25 url(r'^campaign/(?P<id_camp>-?\d+)/export/$', views.campaign_export, name='url_export_campaign'),
25 url(r'^campaign/(?P<id_camp>-?\d+)/import/$', views.campaign_import, name='url_import_campaign'),
26 url(r'^campaign/(?P<id_camp>-?\d+)/import/$', views.campaign_import, name='url_import_campaign'),
26
27
27 url(r'^experiment/new/$', views.experiment_new, name='url_add_experiment'),
28 url(r'^experiment/new/$', views.experiment_new, name='url_add_experiment'),
28 url(r'^experiment/$', views.experiments, name='url_experiments'),
29 url(r'^experiment/$', views.experiments, name='url_experiments'),
29 url(r'^experiment/(?P<id_exp>-?\d+)/$', views.experiment, name='url_experiment'),
30 url(r'^experiment/(?P<id_exp>-?\d+)/$', views.experiment, name='url_experiment'),
30 url(r'^experiment/(?P<id_exp>-?\d+)/edit/$', views.experiment_edit, name='url_edit_experiment'),
31 url(r'^experiment/(?P<id_exp>-?\d+)/edit/$', views.experiment_edit, name='url_edit_experiment'),
31 url(r'^experiment/(?P<id_exp>-?\d+)/delete/$', views.experiment_delete, name='url_delete_experiment'),
32 url(r'^experiment/(?P<id_exp>-?\d+)/delete/$', views.experiment_delete, name='url_delete_experiment'),
32 url(r'^experiment/(?P<id_exp>-?\d+)/export/$', views.experiment_export, name='url_export_experiment'),
33 url(r'^experiment/(?P<id_exp>-?\d+)/export/$', views.experiment_export, name='url_export_experiment'),
33 url(r'^experiment/(?P<id_exp>-?\d+)/import/$', views.experiment_import, name='url_import_experiment'),
34 url(r'^experiment/(?P<id_exp>-?\d+)/import/$', views.experiment_import, name='url_import_experiment'),
34 url(r'^experiment/(?P<id_exp>-?\d+)/mix/$', views.experiment_mix, name='url_mix_experiment'),
35 url(r'^experiment/(?P<id_exp>-?\d+)/mix/$', views.experiment_mix, name='url_mix_experiment'),
35 url(r'^experiment/(?P<id_exp>-?\d+)/mix/delete/$', views.experiment_mix_delete, name='url_delete_mix_experiment'),
36 url(r'^experiment/(?P<id_exp>-?\d+)/mix/delete/$', views.experiment_mix_delete, name='url_delete_mix_experiment'),
36 url(r'^experiment/(?P<id_exp>-?\d+)/summary/$', views.experiment_summary, name='url_sum_experiment'),
37 url(r'^experiment/(?P<id_exp>-?\d+)/summary/$', views.experiment_summary, name='url_sum_experiment'),
37 url(r'^experiment/(?P<id_exp>-?\d+)/verify/$', views.experiment_verify, name='url_verify_experiment'),
38 url(r'^experiment/(?P<id_exp>-?\d+)/verify/$', views.experiment_verify, name='url_verify_experiment'),
38
39
39 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/$', views.dev_conf_new, name='url_add_dev_conf'),
40 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/$', views.dev_conf_new, name='url_add_dev_conf'),
40 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/(?P<id_dev>-?\d+)/$', views.dev_conf_new, name='url_add_dev_conf'),
41 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/(?P<id_dev>-?\d+)/$', views.dev_conf_new, name='url_add_dev_conf'),
41 url(r'^dev_conf/$', views.dev_confs, name='url_dev_confs'),
42 url(r'^dev_conf/$', views.dev_confs, name='url_dev_confs'),
42 url(r'^dev_conf/(?P<id_conf>-?\d+)/$', views.dev_conf, name='url_dev_conf'),
43 url(r'^dev_conf/(?P<id_conf>-?\d+)/$', views.dev_conf, name='url_dev_conf'),
43 url(r'^dev_conf/(?P<id_conf>-?\d+)/edit/$', views.dev_conf_edit, name='url_edit_dev_conf'),
44 url(r'^dev_conf/(?P<id_conf>-?\d+)/edit/$', views.dev_conf_edit, name='url_edit_dev_conf'),
44 url(r'^dev_conf/(?P<id_conf>-?\d+)/delete/$', views.dev_conf_delete, name='url_delete_dev_conf'),
45 url(r'^dev_conf/(?P<id_conf>-?\d+)/delete/$', views.dev_conf_delete, name='url_delete_dev_conf'),
45
46
46 url(r'^dev_conf/(?P<id_conf>-?\d+)/write/$', views.dev_conf_write, name='url_write_dev_conf'),
47 url(r'^dev_conf/(?P<id_conf>-?\d+)/write/$', views.dev_conf_write, name='url_write_dev_conf'),
47 url(r'^dev_conf/(?P<id_conf>-?\d+)/read/$', views.dev_conf_read, name='url_read_dev_conf'),
48 url(r'^dev_conf/(?P<id_conf>-?\d+)/read/$', views.dev_conf_read, name='url_read_dev_conf'),
48 url(r'^dev_conf/(?P<id_conf>-?\d+)/import/$', views.dev_conf_import, name='url_import_dev_conf'),
49 url(r'^dev_conf/(?P<id_conf>-?\d+)/import/$', views.dev_conf_import, name='url_import_dev_conf'),
49 url(r'^dev_conf/(?P<id_conf>-?\d+)/export/$', views.dev_conf_export, name='url_export_dev_conf'),
50 url(r'^dev_conf/(?P<id_conf>-?\d+)/export/$', views.dev_conf_export, name='url_export_dev_conf'),
50 url(r'^dev_conf/(?P<id_conf>-?\d+)/start/$', views.dev_conf_start, name='url_start_dev_conf'),
51 url(r'^dev_conf/(?P<id_conf>-?\d+)/start/$', views.dev_conf_start, name='url_start_dev_conf'),
51 url(r'^dev_conf/(?P<id_conf>-?\d+)/stop/$', views.dev_conf_stop, name='url_stop_dev_conf'),
52 url(r'^dev_conf/(?P<id_conf>-?\d+)/stop/$', views.dev_conf_stop, name='url_stop_dev_conf'),
52 url(r'^dev_conf/(?P<id_conf>-?\d+)/status/$', views.dev_conf_status, name='url_status_dev_conf'),
53 url(r'^dev_conf/(?P<id_conf>-?\d+)/status/$', views.dev_conf_status, name='url_status_dev_conf'),
53
54
54 url(r'^operation/$', views.operation, name='url_operation'),
55 url(r'^operation/$', views.operation, name='url_operation'),
55 url(r'^operation/(?P<id_camp>-?\d+)/$', views.operation, name='url_operation'),
56 url(r'^operation/(?P<id_camp>-?\d+)/$', views.operation, name='url_operation'),
56 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/start/$', views.radar_start, name='url_radar_start'),
57 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/start/$', views.radar_start, name='url_radar_start'),
57 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/stop/$', views.radar_stop, name='url_radar_stop'),
58 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/stop/$', views.radar_stop, name='url_radar_stop'),
58 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/refresh/$', views.radar_refresh, name='url_radar_refresh'),
59 url(r'^operation/(?P<id_camp>-?\d+)/radar/(?P<id_radar>-?\d+)/refresh/$', views.radar_refresh, name='url_radar_refresh'),
59 )
60 )
@@ -1,1535 +1,1561
1 from datetime import datetime
1 from datetime import datetime
2
2
3 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
3 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
4 from django.utils.safestring import mark_safe
4 from django.utils.safestring import mark_safe
5 from django.http import HttpResponseRedirect
5 from django.http import HttpResponseRedirect
6 from django.core.urlresolvers import reverse
6 from django.core.urlresolvers import reverse
7 from django.db.models import Q
7 from django.db.models import Q
8 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
8 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
9 from django.contrib import messages
9 from django.contrib import messages
10 from django.http.request import QueryDict
10 from django.http.request import QueryDict
11
11
12 try:
12 try:
13 from urllib.parse import urlencode
13 from urllib.parse import urlencode
14 except ImportError:
14 except ImportError:
15 from urllib import urlencode
15 from urllib import urlencode
16
16
17 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
17 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
18 from .forms import OperationSearchForm, FilterForm
18 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
19
19
20 from .tasks import task_start, task_stop
20 from .tasks import task_start, task_stop
21
21
22 from apps.rc.forms import RCConfigurationForm
22 from apps.rc.forms import RCConfigurationForm
23 from apps.dds.forms import DDSConfigurationForm
23 from apps.dds.forms import DDSConfigurationForm
24 from apps.jars.forms import JARSConfigurationForm
24 from apps.jars.forms import JARSConfigurationForm
25 from apps.cgs.forms import CGSConfigurationForm
25 from apps.cgs.forms import CGSConfigurationForm
26 from apps.abs.forms import ABSConfigurationForm
26 from apps.abs.forms import ABSConfigurationForm
27 from apps.usrp.forms import USRPConfigurationForm
27 from apps.usrp.forms import USRPConfigurationForm
28
28
29 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
29 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
30 from apps.cgs.models import CGSConfiguration
30 from apps.cgs.models import CGSConfiguration
31 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
31 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
32 from apps.usrp.models import USRPConfiguration
32 from apps.usrp.models import USRPConfiguration
33 from apps.abs.models import ABSConfiguration
33 from apps.abs.models import ABSConfiguration
34 from apps.rc.models import RCConfiguration, RCLine, RCLineType
34 from apps.rc.models import RCConfiguration, RCLine, RCLineType
35 from apps.dds.models import DDSConfiguration
35 from apps.dds.models import DDSConfiguration
36
36
37 from django.contrib.auth.decorators import login_required
37 from django.contrib.auth.decorators import login_required
38 from django.contrib.auth.decorators import user_passes_test
38 from django.contrib.auth.decorators import user_passes_test
39 from django.contrib.admin.views.decorators import staff_member_required
39 from django.contrib.admin.views.decorators import staff_member_required
40
40
41
41
42
42
43 CONF_FORMS = {
43 CONF_FORMS = {
44 'rc': RCConfigurationForm,
44 'rc': RCConfigurationForm,
45 'dds': DDSConfigurationForm,
45 'dds': DDSConfigurationForm,
46 'jars': JARSConfigurationForm,
46 'jars': JARSConfigurationForm,
47 'cgs': CGSConfigurationForm,
47 'cgs': CGSConfigurationForm,
48 'abs': ABSConfigurationForm,
48 'abs': ABSConfigurationForm,
49 'usrp': USRPConfigurationForm,
49 'usrp': USRPConfigurationForm,
50 }
50 }
51
51
52 CONF_MODELS = {
52 CONF_MODELS = {
53 'rc': RCConfiguration,
53 'rc': RCConfiguration,
54 'dds': DDSConfiguration,
54 'dds': DDSConfiguration,
55 'jars': JARSConfiguration,
55 'jars': JARSConfiguration,
56 'cgs': CGSConfiguration,
56 'cgs': CGSConfiguration,
57 'abs': ABSConfiguration,
57 'abs': ABSConfiguration,
58 'usrp': USRPConfiguration,
58 'usrp': USRPConfiguration,
59 }
59 }
60
60
61 MIX_MODES = {
61 MIX_MODES = {
62 '0': 'P',
62 '0': 'P',
63 '1': 'S',
63 '1': 'S',
64 }
64 }
65
65
66 MIX_OPERATIONS = {
66 MIX_OPERATIONS = {
67 '0': 'OR',
67 '0': 'OR',
68 '1': 'XOR',
68 '1': 'XOR',
69 '2': 'AND',
69 '2': 'AND',
70 '3': 'NAND',
70 '3': 'NAND',
71 }
71 }
72
72
73
73
74 def index(request):
74 def index(request):
75 kwargs = {'no_sidebar':True}
75 kwargs = {'no_sidebar':True}
76
76
77 return render(request, 'index.html', kwargs)
77 return render(request, 'index.html', kwargs)
78
78
79
79
80 def locations(request):
80 def locations(request):
81
81
82 page = request.GET.get('page')
82 page = request.GET.get('page')
83 order = ('name',)
83 order = ('name',)
84
84
85 kwargs = get_paginator(Location, page, order)
85 kwargs = get_paginator(Location, page, order)
86
86
87 kwargs['keys'] = ['name', 'description']
87 kwargs['keys'] = ['name', 'description']
88 kwargs['title'] = 'Radar System'
88 kwargs['title'] = 'Radar System'
89 kwargs['suptitle'] = 'List'
89 kwargs['suptitle'] = 'List'
90 kwargs['no_sidebar'] = True
90 kwargs['no_sidebar'] = True
91
91
92 return render(request, 'base_list.html', kwargs)
92 return render(request, 'base_list.html', kwargs)
93
93
94
94
95 def location(request, id_loc):
95 def location(request, id_loc):
96
96
97 location = get_object_or_404(Location, pk=id_loc)
97 location = get_object_or_404(Location, pk=id_loc)
98
98
99 kwargs = {}
99 kwargs = {}
100 kwargs['location'] = location
100 kwargs['location'] = location
101 kwargs['location_keys'] = ['name', 'description']
101 kwargs['location_keys'] = ['name', 'description']
102
102
103 kwargs['title'] = 'Location'
103 kwargs['title'] = 'Location'
104 kwargs['suptitle'] = 'Details'
104 kwargs['suptitle'] = 'Details'
105
105
106 return render(request, 'location.html', kwargs)
106 return render(request, 'location.html', kwargs)
107
107
108
108
109 @user_passes_test(lambda u:u.is_staff)
109 @user_passes_test(lambda u:u.is_staff)
110 def location_new(request):
110 def location_new(request):
111
111
112 if request.method == 'GET':
112 if request.method == 'GET':
113 form = LocationForm()
113 form = LocationForm()
114
114
115 if request.method == 'POST':
115 if request.method == 'POST':
116 form = LocationForm(request.POST)
116 form = LocationForm(request.POST)
117
117
118 if form.is_valid():
118 if form.is_valid():
119 form.save()
119 form.save()
120 return redirect('url_locations')
120 return redirect('url_locations')
121
121
122 kwargs = {}
122 kwargs = {}
123 kwargs['form'] = form
123 kwargs['form'] = form
124 kwargs['title'] = 'Radar System'
124 kwargs['title'] = 'Radar System'
125 kwargs['suptitle'] = 'New'
125 kwargs['suptitle'] = 'New'
126 kwargs['button'] = 'Create'
126 kwargs['button'] = 'Create'
127
127
128 return render(request, 'base_edit.html', kwargs)
128 return render(request, 'base_edit.html', kwargs)
129
129
130
130
131 @user_passes_test(lambda u:u.is_staff)
131 @user_passes_test(lambda u:u.is_staff)
132 def location_edit(request, id_loc):
132 def location_edit(request, id_loc):
133
133
134 location = get_object_or_404(Location, pk=id_loc)
134 location = get_object_or_404(Location, pk=id_loc)
135
135
136 if request.method=='GET':
136 if request.method=='GET':
137 form = LocationForm(instance=location)
137 form = LocationForm(instance=location)
138
138
139 if request.method=='POST':
139 if request.method=='POST':
140 form = LocationForm(request.POST, instance=location)
140 form = LocationForm(request.POST, instance=location)
141
141
142 if form.is_valid():
142 if form.is_valid():
143 form.save()
143 form.save()
144 return redirect('url_locations')
144 return redirect('url_locations')
145
145
146 kwargs = {}
146 kwargs = {}
147 kwargs['form'] = form
147 kwargs['form'] = form
148 kwargs['title'] = 'Location'
148 kwargs['title'] = 'Location'
149 kwargs['suptitle'] = 'Edit'
149 kwargs['suptitle'] = 'Edit'
150 kwargs['button'] = 'Update'
150 kwargs['button'] = 'Update'
151
151
152 return render(request, 'base_edit.html', kwargs)
152 return render(request, 'base_edit.html', kwargs)
153
153
154
154
155 @user_passes_test(lambda u:u.is_staff)
155 @user_passes_test(lambda u:u.is_staff)
156 def location_delete(request, id_loc):
156 def location_delete(request, id_loc):
157
157
158 location = get_object_or_404(Location, pk=id_loc)
158 location = get_object_or_404(Location, pk=id_loc)
159
159
160 if request.method=='POST':
160 if request.method=='POST':
161
161
162 if request.user.is_staff:
162 if request.user.is_staff:
163 location.delete()
163 location.delete()
164 return redirect('url_locations')
164 return redirect('url_locations')
165
165
166 messages.error(request, 'Not enough permission to delete this object')
166 messages.error(request, 'Not enough permission to delete this object')
167 return redirect(location.get_absolute_url())
167 return redirect(location.get_absolute_url())
168
168
169 kwargs = {
169 kwargs = {
170 'title': 'Delete',
170 'title': 'Delete',
171 'suptitle': 'Location',
171 'suptitle': 'Location',
172 'object': location,
172 'object': location,
173 'previous': location.get_absolute_url(),
173 'previous': location.get_absolute_url(),
174 'delete': True
174 'delete': True
175 }
175 }
176
176
177 return render(request, 'confirm.html', kwargs)
177 return render(request, 'confirm.html', kwargs)
178
178
179
179
180 def devices(request):
180 def devices(request):
181
181
182 page = request.GET.get('page')
182 page = request.GET.get('page')
183 order = ('device_type', 'name')
183 order = ('device_type', 'name')
184
184
185 kwargs = get_paginator(Device, page, order)
185 kwargs = get_paginator(Device, page, order)
186 kwargs['keys'] = ['name', 'ip_address', 'port_address', 'device_type']
186 kwargs['keys'] = ['name', 'ip_address', 'port_address', 'device_type']
187 kwargs['title'] = 'Device'
187 kwargs['title'] = 'Device'
188 kwargs['suptitle'] = 'List'
188 kwargs['suptitle'] = 'List'
189 kwargs['no_sidebar'] = True
189 kwargs['no_sidebar'] = True
190
190
191 return render(request, 'base_list.html', kwargs)
191 return render(request, 'base_list.html', kwargs)
192
192
193
193
194 def device(request, id_dev):
194 def device(request, id_dev):
195
195
196 device = get_object_or_404(Device, pk=id_dev)
196 device = get_object_or_404(Device, pk=id_dev)
197
197
198 kwargs = {}
198 kwargs = {}
199 kwargs['device'] = device
199 kwargs['device'] = device
200 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
200 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
201
201
202 kwargs['title'] = 'Device'
202 kwargs['title'] = 'Device'
203 kwargs['suptitle'] = 'Details'
203 kwargs['suptitle'] = 'Details'
204
204
205 return render(request, 'device.html', kwargs)
205 return render(request, 'device.html', kwargs)
206
206
207
207
208 @user_passes_test(lambda u:u.is_staff)
208 @user_passes_test(lambda u:u.is_staff)
209 def device_new(request):
209 def device_new(request):
210
210
211 if request.method == 'GET':
211 if request.method == 'GET':
212 form = DeviceForm()
212 form = DeviceForm()
213
213
214 if request.method == 'POST':
214 if request.method == 'POST':
215 form = DeviceForm(request.POST)
215 form = DeviceForm(request.POST)
216
216
217 if form.is_valid():
217 if form.is_valid():
218 form.save()
218 form.save()
219 return redirect('url_devices')
219 return redirect('url_devices')
220
220
221 kwargs = {}
221 kwargs = {}
222 kwargs['form'] = form
222 kwargs['form'] = form
223 kwargs['title'] = 'Device'
223 kwargs['title'] = 'Device'
224 kwargs['suptitle'] = 'New'
224 kwargs['suptitle'] = 'New'
225 kwargs['button'] = 'Create'
225 kwargs['button'] = 'Create'
226
226
227 return render(request, 'base_edit.html', kwargs)
227 return render(request, 'base_edit.html', kwargs)
228
228
229
229
230 @user_passes_test(lambda u:u.is_staff)
230 @user_passes_test(lambda u:u.is_staff)
231 def device_edit(request, id_dev):
231 def device_edit(request, id_dev):
232
232
233 device = get_object_or_404(Device, pk=id_dev)
233 device = get_object_or_404(Device, pk=id_dev)
234
234
235 if request.method=='GET':
235 if request.method=='GET':
236 form = DeviceForm(instance=device)
236 form = DeviceForm(instance=device)
237
237
238 if request.method=='POST':
238 if request.method=='POST':
239 form = DeviceForm(request.POST, instance=device)
239 form = DeviceForm(request.POST, instance=device)
240
240
241 if form.is_valid():
241 if form.is_valid():
242 form.save()
242 form.save()
243 return redirect(device.get_absolute_url())
243 return redirect(device.get_absolute_url())
244
244
245 kwargs = {}
245 kwargs = {}
246 kwargs['form'] = form
246 kwargs['form'] = form
247 kwargs['title'] = 'Device'
247 kwargs['title'] = 'Device'
248 kwargs['suptitle'] = 'Edit'
248 kwargs['suptitle'] = 'Edit'
249 kwargs['button'] = 'Update'
249 kwargs['button'] = 'Update'
250
250
251 return render(request, 'base_edit.html', kwargs)
251 return render(request, 'base_edit.html', kwargs)
252
252
253
253
254 @user_passes_test(lambda u:u.is_staff)
254 @user_passes_test(lambda u:u.is_staff)
255 def device_delete(request, id_dev):
255 def device_delete(request, id_dev):
256
256
257 device = get_object_or_404(Device, pk=id_dev)
257 device = get_object_or_404(Device, pk=id_dev)
258
258
259 if request.method=='POST':
259 if request.method=='POST':
260
260
261 if request.user.is_staff:
261 if request.user.is_staff:
262 device.delete()
262 device.delete()
263 return redirect('url_devices')
263 return redirect('url_devices')
264
264
265 messages.error(request, 'Not enough permission to delete this object')
265 messages.error(request, 'Not enough permission to delete this object')
266 return redirect(device.get_absolute_url())
266 return redirect(device.get_absolute_url())
267
267
268 kwargs = {
268 kwargs = {
269 'title': 'Delete',
269 'title': 'Delete',
270 'suptitle': 'Device',
270 'suptitle': 'Device',
271 'object': device,
271 'object': device,
272 'previous': device.get_absolute_url(),
272 'previous': device.get_absolute_url(),
273 'delete': True
273 'delete': True
274 }
274 }
275
275
276 return render(request, 'confirm.html', kwargs)
276 return render(request, 'confirm.html', kwargs)
277
277
278
278
279 @user_passes_test(lambda u:u.is_staff)
280 def device_change_ip(request, id_dev):
281
282 device = get_object_or_404(Device, pk=id_dev)
283
284 if request.method=='POST':
285
286 if request.user.is_staff:
287 device.change_ip(**request.POST.dict())
288 messages.success(request, device.message)
289 else:
290 messages.error(request, 'Not enough permission to delete this object')
291 return redirect(device.get_absolute_url())
292
293 kwargs = {
294 'title': 'Device',
295 'suptitle': 'Change IP',
296 'object': device,
297 'previous': device.get_absolute_url(),
298 'form': ChangeIpForm(initial={'ip_address':device.ip_address}),
299 'message' : ' ',
300 }
301
302 return render(request, 'confirm.html', kwargs)
303
304
279 def campaigns(request):
305 def campaigns(request):
280
306
281 page = request.GET.get('page')
307 page = request.GET.get('page')
282 order = ('start_date',)
308 order = ('start_date',)
283 filters = request.GET.copy()
309 filters = request.GET.copy()
284
310
285 kwargs = get_paginator(Campaign, page, order, filters)
311 kwargs = get_paginator(Campaign, page, order, filters)
286
312
287 form = FilterForm(initial=request.GET, extra_fields=['range_date', 'tags','template'])
313 form = FilterForm(initial=request.GET, extra_fields=['range_date', 'tags','template'])
288 kwargs['keys'] = ['name', 'start_date', 'end_date']
314 kwargs['keys'] = ['name', 'start_date', 'end_date']
289 kwargs['title'] = 'Campaign'
315 kwargs['title'] = 'Campaign'
290 kwargs['suptitle'] = 'List'
316 kwargs['suptitle'] = 'List'
291 kwargs['no_sidebar'] = True
317 kwargs['no_sidebar'] = True
292 kwargs['form'] = form
318 kwargs['form'] = form
293 filters.pop('page', None)
319 filters.pop('page', None)
294 kwargs['q'] = urlencode(filters)
320 kwargs['q'] = urlencode(filters)
295
321
296 return render(request, 'base_list.html', kwargs)
322 return render(request, 'base_list.html', kwargs)
297
323
298
324
299 def campaign(request, id_camp):
325 def campaign(request, id_camp):
300
326
301 campaign = get_object_or_404(Campaign, pk=id_camp)
327 campaign = get_object_or_404(Campaign, pk=id_camp)
302 experiments = Experiment.objects.filter(campaign=campaign)
328 experiments = Experiment.objects.filter(campaign=campaign)
303
329
304 form = CampaignForm(instance=campaign)
330 form = CampaignForm(instance=campaign)
305
331
306 kwargs = {}
332 kwargs = {}
307 kwargs['campaign'] = campaign
333 kwargs['campaign'] = campaign
308 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
334 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
309
335
310 kwargs['experiments'] = experiments
336 kwargs['experiments'] = experiments
311 kwargs['experiment_keys'] = ['name', 'radar_system', 'start_time', 'end_time']
337 kwargs['experiment_keys'] = ['name', 'radar_system', 'start_time', 'end_time']
312
338
313 kwargs['title'] = 'Campaign'
339 kwargs['title'] = 'Campaign'
314 kwargs['suptitle'] = 'Details'
340 kwargs['suptitle'] = 'Details'
315
341
316 kwargs['form'] = form
342 kwargs['form'] = form
317 kwargs['button'] = 'Add Experiment'
343 kwargs['button'] = 'Add Experiment'
318
344
319 return render(request, 'campaign.html', kwargs)
345 return render(request, 'campaign.html', kwargs)
320
346
321
347
322 @user_passes_test(lambda u:u.is_staff)
348 @user_passes_test(lambda u:u.is_staff)
323 def campaign_new(request):
349 def campaign_new(request):
324
350
325 kwargs = {}
351 kwargs = {}
326
352
327 if request.method == 'GET':
353 if request.method == 'GET':
328
354
329 if 'template' in request.GET:
355 if 'template' in request.GET:
330 if request.GET['template']=='0':
356 if request.GET['template']=='0':
331 form = NewForm(initial={'create_from':2},
357 form = NewForm(initial={'create_from':2},
332 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
358 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
333 else:
359 else:
334 kwargs['button'] = 'Create'
360 kwargs['button'] = 'Create'
335 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
361 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
336 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
362 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
337 camp = Campaign.objects.get(pk=request.GET['template'])
363 camp = Campaign.objects.get(pk=request.GET['template'])
338 form = CampaignForm(instance=camp,
364 form = CampaignForm(instance=camp,
339 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
365 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
340 'template':False})
366 'template':False})
341 elif 'blank' in request.GET:
367 elif 'blank' in request.GET:
342 kwargs['button'] = 'Create'
368 kwargs['button'] = 'Create'
343 form = CampaignForm()
369 form = CampaignForm()
344 else:
370 else:
345 form = NewForm()
371 form = NewForm()
346
372
347 if request.method == 'POST':
373 if request.method == 'POST':
348 kwargs['button'] = 'Create'
374 kwargs['button'] = 'Create'
349 post = request.POST.copy()
375 post = request.POST.copy()
350 experiments = []
376 experiments = []
351
377
352 for id_exp in post.getlist('experiments'):
378 for id_exp in post.getlist('experiments'):
353 exp = Experiment.objects.get(pk=id_exp)
379 exp = Experiment.objects.get(pk=id_exp)
354 new_exp = exp.clone(template=False)
380 new_exp = exp.clone(template=False)
355 experiments.append(new_exp)
381 experiments.append(new_exp)
356
382
357 post.setlist('experiments', [])
383 post.setlist('experiments', [])
358
384
359 form = CampaignForm(post)
385 form = CampaignForm(post)
360
386
361 if form.is_valid():
387 if form.is_valid():
362 campaign = form.save()
388 campaign = form.save()
363 for exp in experiments:
389 for exp in experiments:
364 campaign.experiments.add(exp)
390 campaign.experiments.add(exp)
365 campaign.save()
391 campaign.save()
366 return redirect('url_campaign', id_camp=campaign.id)
392 return redirect('url_campaign', id_camp=campaign.id)
367
393
368 kwargs['form'] = form
394 kwargs['form'] = form
369 kwargs['title'] = 'Campaign'
395 kwargs['title'] = 'Campaign'
370 kwargs['suptitle'] = 'New'
396 kwargs['suptitle'] = 'New'
371
397
372 return render(request, 'campaign_edit.html', kwargs)
398 return render(request, 'campaign_edit.html', kwargs)
373
399
374
400
375 @user_passes_test(lambda u:u.is_staff)
401 @user_passes_test(lambda u:u.is_staff)
376 def campaign_edit(request, id_camp):
402 def campaign_edit(request, id_camp):
377
403
378 campaign = get_object_or_404(Campaign, pk=id_camp)
404 campaign = get_object_or_404(Campaign, pk=id_camp)
379
405
380 if request.method=='GET':
406 if request.method=='GET':
381 form = CampaignForm(instance=campaign)
407 form = CampaignForm(instance=campaign)
382
408
383 if request.method=='POST':
409 if request.method=='POST':
384 exps = campaign.experiments.all().values_list('pk', flat=True)
410 exps = campaign.experiments.all().values_list('pk', flat=True)
385 post = request.POST.copy()
411 post = request.POST.copy()
386 new_exps = post.getlist('experiments')
412 new_exps = post.getlist('experiments')
387 post.setlist('experiments', [])
413 post.setlist('experiments', [])
388 form = CampaignForm(post, instance=campaign)
414 form = CampaignForm(post, instance=campaign)
389
415
390 if form.is_valid():
416 if form.is_valid():
391 camp = form.save()
417 camp = form.save()
392 for id_exp in new_exps:
418 for id_exp in new_exps:
393 if int(id_exp) in exps:
419 if int(id_exp) in exps:
394 exps.pop(id_exp)
420 exps.pop(id_exp)
395 else:
421 else:
396 exp = Experiment.objects.get(pk=id_exp)
422 exp = Experiment.objects.get(pk=id_exp)
397 if exp.template:
423 if exp.template:
398 camp.experiments.add(exp.clone(template=False))
424 camp.experiments.add(exp.clone(template=False))
399 else:
425 else:
400 camp.experiments.add(exp)
426 camp.experiments.add(exp)
401
427
402 for id_exp in exps:
428 for id_exp in exps:
403 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
429 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
404
430
405 return redirect('url_campaign', id_camp=id_camp)
431 return redirect('url_campaign', id_camp=id_camp)
406
432
407 kwargs = {}
433 kwargs = {}
408 kwargs['form'] = form
434 kwargs['form'] = form
409 kwargs['title'] = 'Campaign'
435 kwargs['title'] = 'Campaign'
410 kwargs['suptitle'] = 'Edit'
436 kwargs['suptitle'] = 'Edit'
411 kwargs['button'] = 'Update'
437 kwargs['button'] = 'Update'
412
438
413 return render(request, 'campaign_edit.html', kwargs)
439 return render(request, 'campaign_edit.html', kwargs)
414
440
415
441
416 @user_passes_test(lambda u:u.is_staff)
442 @user_passes_test(lambda u:u.is_staff)
417 def campaign_delete(request, id_camp):
443 def campaign_delete(request, id_camp):
418
444
419 campaign = get_object_or_404(Campaign, pk=id_camp)
445 campaign = get_object_or_404(Campaign, pk=id_camp)
420
446
421 if request.method=='POST':
447 if request.method=='POST':
422 if request.user.is_staff:
448 if request.user.is_staff:
423
449
424 for exp in campaign.experiments.all():
450 for exp in campaign.experiments.all():
425 for conf in Configuration.objects.filter(experiment=exp):
451 for conf in Configuration.objects.filter(experiment=exp):
426 conf.delete()
452 conf.delete()
427 exp.delete()
453 exp.delete()
428 campaign.delete()
454 campaign.delete()
429
455
430 return redirect('url_campaigns')
456 return redirect('url_campaigns')
431
457
432 messages.error(request, 'Not enough permission to delete this object')
458 messages.error(request, 'Not enough permission to delete this object')
433 return redirect(campaign.get_absolute_url())
459 return redirect(campaign.get_absolute_url())
434
460
435 kwargs = {
461 kwargs = {
436 'title': 'Delete',
462 'title': 'Delete',
437 'suptitle': 'Campaign',
463 'suptitle': 'Campaign',
438 'object': campaign,
464 'object': campaign,
439 'previous': campaign.get_absolute_url(),
465 'previous': campaign.get_absolute_url(),
440 'delete': True
466 'delete': True
441 }
467 }
442
468
443 return render(request, 'confirm.html', kwargs)
469 return render(request, 'confirm.html', kwargs)
444
470
445
471
446 @user_passes_test(lambda u:u.is_staff)
472 @user_passes_test(lambda u:u.is_staff)
447 def campaign_export(request, id_camp):
473 def campaign_export(request, id_camp):
448
474
449 campaign = get_object_or_404(Campaign, pk=id_camp)
475 campaign = get_object_or_404(Campaign, pk=id_camp)
450 content = campaign.parms_to_dict()
476 content = campaign.parms_to_dict()
451 content_type = 'application/json'
477 content_type = 'application/json'
452 filename = '%s_%s.json' %(campaign.name, campaign.id)
478 filename = '%s_%s.json' %(campaign.name, campaign.id)
453
479
454 response = HttpResponse(content_type=content_type)
480 response = HttpResponse(content_type=content_type)
455 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
481 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
456 response.write(content)
482 response.write(content)
457
483
458 return response
484 return response
459
485
460
486
461 @user_passes_test(lambda u:u.is_staff)
487 @user_passes_test(lambda u:u.is_staff)
462 def campaign_import(request, id_camp):
488 def campaign_import(request, id_camp):
463
489
464 campaign = get_object_or_404(Campaign, pk=id_camp)
490 campaign = get_object_or_404(Campaign, pk=id_camp)
465
491
466 if request.method == 'GET':
492 if request.method == 'GET':
467 file_form = UploadFileForm()
493 file_form = UploadFileForm()
468
494
469 if request.method == 'POST':
495 if request.method == 'POST':
470 file_form = UploadFileForm(request.POST, request.FILES)
496 file_form = UploadFileForm(request.POST, request.FILES)
471
497
472 if file_form.is_valid():
498 if file_form.is_valid():
473
499
474 parms = campaign.import_from_file(request.FILES['file'])
500 parms = campaign.import_from_file(request.FILES['file'])
475
501
476 if parms:
502 if parms:
477 parms['name'] = parms['campaign']
503 parms['name'] = parms['campaign']
478
504
479 new_camp = campaign.dict_to_parms(parms, CONF_MODELS)
505 new_camp = campaign.dict_to_parms(parms, CONF_MODELS)
480
506
481 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
507 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
482
508
483 return redirect(new_camp.get_absolute_url_edit())
509 return redirect(new_camp.get_absolute_url_edit())
484
510
485 messages.error(request, "Could not import parameters from file")
511 messages.error(request, "Could not import parameters from file")
486
512
487 kwargs = {}
513 kwargs = {}
488 kwargs['title'] = 'Campaign'
514 kwargs['title'] = 'Campaign'
489 kwargs['form'] = file_form
515 kwargs['form'] = file_form
490 kwargs['suptitle'] = 'Importing file'
516 kwargs['suptitle'] = 'Importing file'
491 kwargs['button'] = 'Import'
517 kwargs['button'] = 'Import'
492
518
493 return render(request, 'campaign_import.html', kwargs)
519 return render(request, 'campaign_import.html', kwargs)
494
520
495
521
496 def experiments(request):
522 def experiments(request):
497
523
498 page = request.GET.get('page')
524 page = request.GET.get('page')
499 order = ('location',)
525 order = ('location',)
500 filters = request.GET.copy()
526 filters = request.GET.copy()
501
527
502 kwargs = get_paginator(Experiment, page, order, filters)
528 kwargs = get_paginator(Experiment, page, order, filters)
503
529
504 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
530 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
505
531
506 kwargs['keys'] = ['name', 'radar_system', 'start_time', 'end_time']
532 kwargs['keys'] = ['name', 'radar_system', 'start_time', 'end_time']
507 kwargs['title'] = 'Experiment'
533 kwargs['title'] = 'Experiment'
508 kwargs['suptitle'] = 'List'
534 kwargs['suptitle'] = 'List'
509 kwargs['no_sidebar'] = True
535 kwargs['no_sidebar'] = True
510 kwargs['form'] = form
536 kwargs['form'] = form
511 filters.pop('page', None)
537 filters.pop('page', None)
512 kwargs['q'] = urlencode(filters)
538 kwargs['q'] = urlencode(filters)
513
539
514 return render(request, 'base_list.html', kwargs)
540 return render(request, 'base_list.html', kwargs)
515
541
516
542
517 def experiment(request, id_exp):
543 def experiment(request, id_exp):
518
544
519 experiment = get_object_or_404(Experiment, pk=id_exp)
545 experiment = get_object_or_404(Experiment, pk=id_exp)
520
546
521 configurations = Configuration.objects.filter(experiment=experiment, type=0)
547 configurations = Configuration.objects.filter(experiment=experiment, type=0)
522
548
523 kwargs = {}
549 kwargs = {}
524
550
525 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
551 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
526 kwargs['experiment'] = experiment
552 kwargs['experiment'] = experiment
527
553
528 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
554 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
529 kwargs['configurations'] = configurations
555 kwargs['configurations'] = configurations
530
556
531 kwargs['title'] = 'Experiment'
557 kwargs['title'] = 'Experiment'
532 kwargs['suptitle'] = 'Details'
558 kwargs['suptitle'] = 'Details'
533
559
534 kwargs['button'] = 'Add Configuration'
560 kwargs['button'] = 'Add Configuration'
535
561
536 ###### SIDEBAR ######
562 ###### SIDEBAR ######
537 kwargs.update(sidebar(experiment=experiment))
563 kwargs.update(sidebar(experiment=experiment))
538
564
539 return render(request, 'experiment.html', kwargs)
565 return render(request, 'experiment.html', kwargs)
540
566
541
567
542 @user_passes_test(lambda u:u.is_staff)
568 @user_passes_test(lambda u:u.is_staff)
543 def experiment_new(request, id_camp=None):
569 def experiment_new(request, id_camp=None):
544
570
545 kwargs = {}
571 kwargs = {}
546
572
547 if request.method == 'GET':
573 if request.method == 'GET':
548 if 'template' in request.GET:
574 if 'template' in request.GET:
549 if request.GET['template']=='0':
575 if request.GET['template']=='0':
550 form = NewForm(initial={'create_from':2},
576 form = NewForm(initial={'create_from':2},
551 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
577 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
552 else:
578 else:
553 kwargs['button'] = 'Create'
579 kwargs['button'] = 'Create'
554 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
580 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
555 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
581 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
556 exp=Experiment.objects.get(pk=request.GET['template'])
582 exp=Experiment.objects.get(pk=request.GET['template'])
557 form = ExperimentForm(instance=exp,
583 form = ExperimentForm(instance=exp,
558 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
584 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
559 'template': False})
585 'template': False})
560 elif 'blank' in request.GET:
586 elif 'blank' in request.GET:
561 kwargs['button'] = 'Create'
587 kwargs['button'] = 'Create'
562 form = ExperimentForm()
588 form = ExperimentForm()
563 else:
589 else:
564 form = NewForm()
590 form = NewForm()
565
591
566 if request.method == 'POST':
592 if request.method == 'POST':
567 form = ExperimentForm(request.POST)
593 form = ExperimentForm(request.POST)
568 if form.is_valid():
594 if form.is_valid():
569 experiment = form.save()
595 experiment = form.save()
570
596
571 if 'template' in request.GET:
597 if 'template' in request.GET:
572 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
598 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
573 for conf in configurations:
599 for conf in configurations:
574 conf.clone(experiment=experiment, template=False)
600 conf.clone(experiment=experiment, template=False)
575
601
576 return redirect('url_experiment', id_exp=experiment.id)
602 return redirect('url_experiment', id_exp=experiment.id)
577
603
578 kwargs['form'] = form
604 kwargs['form'] = form
579 kwargs['title'] = 'Experiment'
605 kwargs['title'] = 'Experiment'
580 kwargs['suptitle'] = 'New'
606 kwargs['suptitle'] = 'New'
581
607
582 return render(request, 'experiment_edit.html', kwargs)
608 return render(request, 'experiment_edit.html', kwargs)
583
609
584
610
585 @user_passes_test(lambda u:u.is_staff)
611 @user_passes_test(lambda u:u.is_staff)
586 def experiment_edit(request, id_exp):
612 def experiment_edit(request, id_exp):
587
613
588 experiment = get_object_or_404(Experiment, pk=id_exp)
614 experiment = get_object_or_404(Experiment, pk=id_exp)
589
615
590 if request.method == 'GET':
616 if request.method == 'GET':
591 form = ExperimentForm(instance=experiment)
617 form = ExperimentForm(instance=experiment)
592
618
593 if request.method=='POST':
619 if request.method=='POST':
594 form = ExperimentForm(request.POST, instance=experiment)
620 form = ExperimentForm(request.POST, instance=experiment)
595
621
596 if form.is_valid():
622 if form.is_valid():
597 experiment = form.save()
623 experiment = form.save()
598 return redirect('url_experiment', id_exp=experiment.id)
624 return redirect('url_experiment', id_exp=experiment.id)
599
625
600 kwargs = {}
626 kwargs = {}
601 kwargs['form'] = form
627 kwargs['form'] = form
602 kwargs['title'] = 'Experiment'
628 kwargs['title'] = 'Experiment'
603 kwargs['suptitle'] = 'Edit'
629 kwargs['suptitle'] = 'Edit'
604 kwargs['button'] = 'Update'
630 kwargs['button'] = 'Update'
605
631
606 return render(request, 'experiment_edit.html', kwargs)
632 return render(request, 'experiment_edit.html', kwargs)
607
633
608
634
609 @user_passes_test(lambda u:u.is_staff)
635 @user_passes_test(lambda u:u.is_staff)
610 def experiment_delete(request, id_exp):
636 def experiment_delete(request, id_exp):
611
637
612 experiment = get_object_or_404(Experiment, pk=id_exp)
638 experiment = get_object_or_404(Experiment, pk=id_exp)
613
639
614 if request.method=='POST':
640 if request.method=='POST':
615 if request.user.is_staff:
641 if request.user.is_staff:
616 for conf in Configuration.objects.filter(experiment=experiment):
642 for conf in Configuration.objects.filter(experiment=experiment):
617 conf.delete()
643 conf.delete()
618 experiment.delete()
644 experiment.delete()
619 return redirect('url_experiments')
645 return redirect('url_experiments')
620
646
621 messages.error(request, 'Not enough permission to delete this object')
647 messages.error(request, 'Not enough permission to delete this object')
622 return redirect(experiment.get_absolute_url())
648 return redirect(experiment.get_absolute_url())
623
649
624 kwargs = {
650 kwargs = {
625 'title': 'Delete',
651 'title': 'Delete',
626 'suptitle': 'Experiment',
652 'suptitle': 'Experiment',
627 'object': experiment,
653 'object': experiment,
628 'previous': experiment.get_absolute_url(),
654 'previous': experiment.get_absolute_url(),
629 'delete': True
655 'delete': True
630 }
656 }
631
657
632 return render(request, 'confirm.html', kwargs)
658 return render(request, 'confirm.html', kwargs)
633
659
634
660
635 @user_passes_test(lambda u:u.is_staff)
661 @user_passes_test(lambda u:u.is_staff)
636 def experiment_export(request, id_exp):
662 def experiment_export(request, id_exp):
637
663
638 experiment = get_object_or_404(Experiment, pk=id_exp)
664 experiment = get_object_or_404(Experiment, pk=id_exp)
639 content = experiment.parms_to_dict()
665 content = experiment.parms_to_dict()
640 content_type = 'application/json'
666 content_type = 'application/json'
641 filename = '%s_%s.json' %(experiment.name, experiment.id)
667 filename = '%s_%s.json' %(experiment.name, experiment.id)
642
668
643 response = HttpResponse(content_type=content_type)
669 response = HttpResponse(content_type=content_type)
644 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
670 response['Content-Disposition'] = 'attachment; filename="%s"' %filename
645 response.write(content)
671 response.write(content)
646
672
647 return response
673 return response
648
674
649
675
650 @user_passes_test(lambda u:u.is_staff)
676 @user_passes_test(lambda u:u.is_staff)
651 def experiment_import(request, id_exp):
677 def experiment_import(request, id_exp):
652
678
653 experiment = get_object_or_404(Experiment, pk=id_exp)
679 experiment = get_object_or_404(Experiment, pk=id_exp)
654 configurations = Configuration.objects.filter(experiment=experiment)
680 configurations = Configuration.objects.filter(experiment=experiment)
655
681
656 if request.method == 'GET':
682 if request.method == 'GET':
657 file_form = UploadFileForm()
683 file_form = UploadFileForm()
658
684
659 if request.method == 'POST':
685 if request.method == 'POST':
660 file_form = UploadFileForm(request.POST, request.FILES)
686 file_form = UploadFileForm(request.POST, request.FILES)
661
687
662 if file_form.is_valid():
688 if file_form.is_valid():
663
689
664 parms = experiment.import_from_file(request.FILES['file'])
690 parms = experiment.import_from_file(request.FILES['file'])
665
691
666 if parms:
692 if parms:
667
693
668 new_exp = experiment.dict_to_parms(parms, CONF_MODELS)
694 new_exp = experiment.dict_to_parms(parms, CONF_MODELS)
669
695
670 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
696 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
671
697
672 return redirect(new_exp.get_absolute_url_edit())
698 return redirect(new_exp.get_absolute_url_edit())
673
699
674 messages.error(request, "Could not import parameters from file")
700 messages.error(request, "Could not import parameters from file")
675
701
676 kwargs = {}
702 kwargs = {}
677 kwargs['title'] = 'Experiment'
703 kwargs['title'] = 'Experiment'
678 kwargs['form'] = file_form
704 kwargs['form'] = file_form
679 kwargs['suptitle'] = 'Importing file'
705 kwargs['suptitle'] = 'Importing file'
680 kwargs['button'] = 'Import'
706 kwargs['button'] = 'Import'
681
707
682 kwargs.update(sidebar(experiment=experiment))
708 kwargs.update(sidebar(experiment=experiment))
683
709
684 return render(request, 'experiment_import.html', kwargs)
710 return render(request, 'experiment_import.html', kwargs)
685
711
686
712
687 @user_passes_test(lambda u:u.is_staff)
713 @user_passes_test(lambda u:u.is_staff)
688 def experiment_mix(request, id_exp):
714 def experiment_mix(request, id_exp):
689
715
690 experiment = get_object_or_404(Experiment, pk=id_exp)
716 experiment = get_object_or_404(Experiment, pk=id_exp)
691 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
717 rc_confs = [conf for conf in RCConfiguration.objects.filter(experiment=id_exp,
692 mix=False)]
718 mix=False)]
693
719
694 if len(rc_confs)<2:
720 if len(rc_confs)<2:
695 messages.warning(request, 'You need at least two RC Configurations to make a mix')
721 messages.warning(request, 'You need at least two RC Configurations to make a mix')
696 return redirect(experiment.get_absolute_url())
722 return redirect(experiment.get_absolute_url())
697
723
698 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
724 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True)
699
725
700 if mix_confs:
726 if mix_confs:
701 mix = mix_confs[0]
727 mix = mix_confs[0]
702 else:
728 else:
703 mix = RCConfiguration(experiment=experiment,
729 mix = RCConfiguration(experiment=experiment,
704 device=rc_confs[0].device,
730 device=rc_confs[0].device,
705 ipp=rc_confs[0].ipp,
731 ipp=rc_confs[0].ipp,
706 clock_in=rc_confs[0].clock_in,
732 clock_in=rc_confs[0].clock_in,
707 clock_divider=rc_confs[0].clock_divider,
733 clock_divider=rc_confs[0].clock_divider,
708 mix=True,
734 mix=True,
709 parameters='')
735 parameters='')
710 mix.save()
736 mix.save()
711
737
712 line_type = RCLineType.objects.get(name='mix')
738 line_type = RCLineType.objects.get(name='mix')
713 for i in range(len(rc_confs[0].get_lines())):
739 for i in range(len(rc_confs[0].get_lines())):
714 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
740 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
715 line.save()
741 line.save()
716
742
717 initial = {'name': mix.name,
743 initial = {'name': mix.name,
718 'result': parse_mix_result(mix.parameters),
744 'result': parse_mix_result(mix.parameters),
719 'delay': 0,
745 'delay': 0,
720 'mask': [0,1,2,3,4,5,6,7]
746 'mask': [0,1,2,3,4,5,6,7]
721 }
747 }
722
748
723 if request.method=='GET':
749 if request.method=='GET':
724 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
750 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
725
751
726 if request.method=='POST':
752 if request.method=='POST':
727 result = mix.parameters
753 result = mix.parameters
728
754
729 if '{}|'.format(request.POST['experiment']) in result:
755 if '{}|'.format(request.POST['experiment']) in result:
730 messages.error(request, 'Configuration already added')
756 messages.error(request, 'Configuration already added')
731 else:
757 else:
732 if 'operation' in request.POST:
758 if 'operation' in request.POST:
733 operation = MIX_OPERATIONS[request.POST['operation']]
759 operation = MIX_OPERATIONS[request.POST['operation']]
734 else:
760 else:
735 operation = ' '
761 operation = ' '
736
762
737 mode = MIX_MODES[request.POST['mode']]
763 mode = MIX_MODES[request.POST['mode']]
738
764
739 if result:
765 if result:
740 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
766 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
741 request.POST['experiment'],
767 request.POST['experiment'],
742 mode,
768 mode,
743 operation,
769 operation,
744 float(request.POST['delay']),
770 float(request.POST['delay']),
745 parse_mask(request.POST.getlist('mask'))
771 parse_mask(request.POST.getlist('mask'))
746 )
772 )
747 else:
773 else:
748 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
774 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
749 mode,
775 mode,
750 operation,
776 operation,
751 float(request.POST['delay']),
777 float(request.POST['delay']),
752 parse_mask(request.POST.getlist('mask'))
778 parse_mask(request.POST.getlist('mask'))
753 )
779 )
754
780
755 mix.parameters = result
781 mix.parameters = result
756 mix.name = request.POST['name']
782 mix.name = request.POST['name']
757 mix.save()
783 mix.save()
758 mix.update_pulses()
784 mix.update_pulses()
759
785
760 initial['result'] = parse_mix_result(result)
786 initial['result'] = parse_mix_result(result)
761 initial['name'] = mix.name
787 initial['name'] = mix.name
762
788
763 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
789 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
764
790
765
791
766 kwargs = {
792 kwargs = {
767 'title': 'Experiment',
793 'title': 'Experiment',
768 'suptitle': 'Mix Configurations',
794 'suptitle': 'Mix Configurations',
769 'form' : form,
795 'form' : form,
770 'extra_button': 'Delete',
796 'extra_button': 'Delete',
771 'button': 'Add',
797 'button': 'Add',
772 'cancel': 'Back',
798 'cancel': 'Back',
773 'previous': experiment.get_absolute_url(),
799 'previous': experiment.get_absolute_url(),
774 'id_exp':id_exp,
800 'id_exp':id_exp,
775
801
776 }
802 }
777
803
778 return render(request, 'experiment_mix.html', kwargs)
804 return render(request, 'experiment_mix.html', kwargs)
779
805
780
806
781 @user_passes_test(lambda u:u.is_staff)
807 @user_passes_test(lambda u:u.is_staff)
782 def experiment_mix_delete(request, id_exp):
808 def experiment_mix_delete(request, id_exp):
783
809
784 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
810 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True)
785 values = conf.parameters.split('-')
811 values = conf.parameters.split('-')
786 conf.parameters = '-'.join(values[:-1])
812 conf.parameters = '-'.join(values[:-1])
787 conf.save()
813 conf.save()
788
814
789 return redirect('url_mix_experiment', id_exp=id_exp)
815 return redirect('url_mix_experiment', id_exp=id_exp)
790
816
791
817
792
818
793 def experiment_summary(request, id_exp):
819 def experiment_summary(request, id_exp):
794
820
795 import json
821 import json
796 import ast
822 import ast
797
823
798 experiment = get_object_or_404(Experiment, pk=id_exp)
824 experiment = get_object_or_404(Experiment, pk=id_exp)
799 experiment_data = json.loads(experiment.parms_to_dict())
825 experiment_data = json.loads(experiment.parms_to_dict())
800 configurations = Configuration.objects.filter(experiment=experiment, type=0)
826 configurations = Configuration.objects.filter(experiment=experiment, type=0)
801
827
802 kwargs = {}
828 kwargs = {}
803
829
804 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
830 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
805 kwargs['experiment'] = experiment
831 kwargs['experiment'] = experiment
806
832
807 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
833 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
808 kwargs['configurations'] = configurations
834 kwargs['configurations'] = configurations
809 kwargs['experiment_data'] = experiment_data
835 kwargs['experiment_data'] = experiment_data
810
836
811 kwargs['title'] = 'Experiment Summary'
837 kwargs['title'] = 'Experiment Summary'
812 kwargs['suptitle'] = 'Details'
838 kwargs['suptitle'] = 'Details'
813
839
814 kwargs['button'] = 'Verify Parameters'
840 kwargs['button'] = 'Verify Parameters'
815
841
816 jars_conf = False
842 jars_conf = False
817 rc_conf = False
843 rc_conf = False
818
844
819 for configuration in configurations:
845 for configuration in configurations:
820 #-------------------- JARS -----------------------:
846 #-------------------- JARS -----------------------:
821 if configuration.device.device_type.name == 'jars':
847 if configuration.device.device_type.name == 'jars':
822 jars_conf = True
848 jars_conf = True
823 kwargs['jars_conf'] = jars_conf
849 kwargs['jars_conf'] = jars_conf
824 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
850 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
825 channels_number = configuration.channels_number
851 channels_number = configuration.channels_number
826 exp_type = configuration.exp_type
852 exp_type = configuration.exp_type
827 fftpoints = configuration.fftpoints
853 fftpoints = configuration.fftpoints
828 filter_parms = configuration.filter_parms
854 filter_parms = configuration.filter_parms
829 filter_parms = ast.literal_eval(filter_parms)
855 filter_parms = ast.literal_eval(filter_parms)
830 spectral_number = configuration.spectral_number
856 spectral_number = configuration.spectral_number
831
857
832 #--------------------- RC ----------------------:
858 #--------------------- RC ----------------------:
833 if configuration.device.device_type.name == 'rc':
859 if configuration.device.device_type.name == 'rc':
834 rc_conf = True
860 rc_conf = True
835 kwargs['rc_conf'] = rc_conf
861 kwargs['rc_conf'] = rc_conf
836 rc_lines = experiment_data['configurations']['rc']['lines']
862 rc_lines = experiment_data['configurations']['rc']['lines']
837 ipp = configuration.ipp
863 ipp = configuration.ipp
838 if experiment_data['configurations']['rc']['mix'] == 'True':
864 if experiment_data['configurations']['rc']['mix'] == 'True':
839 tx = ''
865 tx = ''
840 code = ''
866 code = ''
841 window = ''
867 window = ''
842 else:
868 else:
843 code = rc_lines[3]['code']
869 code = rc_lines[3]['code']
844
870
845 window_data = rc_lines[6]['params'][0]
871 window_data = rc_lines[6]['params'][0]
846 h0 = str(window_data['first_height'])
872 h0 = str(window_data['first_height'])
847 dh = str(window_data['resolution'])
873 dh = str(window_data['resolution'])
848 nsa = str(window_data['number_of_samples'])
874 nsa = str(window_data['number_of_samples'])
849 window = 'Ho='+h0+'km\nDH='+dh+'km\nNSA='+nsa
875 window = 'Ho='+h0+'km\nDH='+dh+'km\nNSA='+nsa
850
876
851 tx = ''
877 tx = ''
852 if float(rc_lines[1]['delays']) == 0:
878 if float(rc_lines[1]['delays']) == 0:
853 tx = rc_lines[2]['pulse_width']
879 tx = rc_lines[2]['pulse_width']
854 elif float(rc_lines[2]['delays']) == 0:
880 elif float(rc_lines[2]['delays']) == 0:
855 tx = rc_lines[1]['pulse_width']
881 tx = rc_lines[1]['pulse_width']
856 else:
882 else:
857 tx = rc_lines[1]['pulse_width']+' | '+rc_lines[2]['pulse_width']
883 tx = rc_lines[1]['pulse_width']+' | '+rc_lines[2]['pulse_width']
858
884
859 kwargs['tx'] = tx
885 kwargs['tx'] = tx
860 kwargs['code'] = code
886 kwargs['code'] = code
861 kwargs['window'] = window
887 kwargs['window'] = window
862
888
863 #-------------------- DDS -----------------------:
889 #-------------------- DDS -----------------------:
864 if configuration.device.device_type.name == 'dds':
890 if configuration.device.device_type.name == 'dds':
865 dds_conf = True
891 dds_conf = True
866 kwargs['dds_conf'] = dds_conf
892 kwargs['dds_conf'] = dds_conf
867
893
868 #------ RC & JARS ------:
894 #------ RC & JARS ------:
869 ipp = 937.5 #
895 ipp = 937.5 #
870 nsa = 200#
896 nsa = 200#
871 dh = 1.5 #
897 dh = 1.5 #
872 channels_number = 5 #
898 channels_number = 5 #
873
899
874 if rc_conf and jars_conf:
900 if rc_conf and jars_conf:
875 if exp_type == 0: #Short
901 if exp_type == 0: #Short
876 bytes = 2
902 bytes = 2
877 b = nsa*2*bytes*channels_number
903 b = nsa*2*bytes*channels_number
878 else: #Float
904 else: #Float
879 bytes = 4
905 bytes = 4
880 channels = channels_number + spectral_number
906 channels = channels_number + spectral_number
881 b = nsa*2*bytes*fftpoints*channels
907 b = nsa*2*bytes*fftpoints*channels
882
908
883 ipps = (ipp*pow(10,-6))/0.15
909 ipps = (ipp*pow(10,-6))/0.15
884 GB = 1048576.0*1024.0
910 GB = 1048576.0*1024.0
885 Hour = 3600
911 Hour = 3600
886 rate = b/ipps
912 rate = b/ipps
887 rate = rate *(1/GB)*(Hour)
913 rate = rate *(1/GB)*(Hour)
888 kwargs['rate'] = str(rate)+" GB/h"
914 kwargs['rate'] = str(rate)+" GB/h"
889 else:
915 else:
890 kwargs['rate'] = ''
916 kwargs['rate'] = ''
891
917
892 ###### SIDEBAR ######
918 ###### SIDEBAR ######
893 kwargs.update(sidebar(experiment=experiment))
919 kwargs.update(sidebar(experiment=experiment))
894
920
895 return render(request, 'experiment_summary.html', kwargs)
921 return render(request, 'experiment_summary.html', kwargs)
896
922
897
923
898 @user_passes_test(lambda u:u.is_staff)
924 @user_passes_test(lambda u:u.is_staff)
899 def experiment_verify(request, id_exp):
925 def experiment_verify(request, id_exp):
900
926
901 import json
927 import json
902 import ast
928 import ast
903
929
904 experiment = get_object_or_404(Experiment, pk=id_exp)
930 experiment = get_object_or_404(Experiment, pk=id_exp)
905 experiment_data = json.loads(experiment.parms_to_dict())
931 experiment_data = json.loads(experiment.parms_to_dict())
906 configurations = Configuration.objects.filter(experiment=experiment, type=0)
932 configurations = Configuration.objects.filter(experiment=experiment, type=0)
907
933
908 kwargs = {}
934 kwargs = {}
909
935
910 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
936 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
911 kwargs['experiment'] = experiment
937 kwargs['experiment'] = experiment
912
938
913 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
939 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
914 kwargs['configurations'] = configurations
940 kwargs['configurations'] = configurations
915 kwargs['experiment_data'] = experiment_data
941 kwargs['experiment_data'] = experiment_data
916
942
917 kwargs['title'] = 'Verify Experiment'
943 kwargs['title'] = 'Verify Experiment'
918 kwargs['suptitle'] = 'Parameters'
944 kwargs['suptitle'] = 'Parameters'
919
945
920 kwargs['button'] = 'Update'
946 kwargs['button'] = 'Update'
921
947
922 jars_conf = False
948 jars_conf = False
923 rc_conf = False
949 rc_conf = False
924 dds_conf = False
950 dds_conf = False
925
951
926 for configuration in configurations:
952 for configuration in configurations:
927 #-------------------- JARS -----------------------:
953 #-------------------- JARS -----------------------:
928 if configuration.device.device_type.name == 'jars':
954 if configuration.device.device_type.name == 'jars':
929 jars_conf = True
955 jars_conf = True
930 kwargs['jars_conf'] = jars_conf
956 kwargs['jars_conf'] = jars_conf
931 filter_parms = configuration.filter_parms
957 filter_parms = configuration.filter_parms
932 filter_parms = ast.literal_eval(filter_parms)
958 filter_parms = ast.literal_eval(filter_parms)
933 kwargs['filter_parms'] = filter_parms
959 kwargs['filter_parms'] = filter_parms
934 #--Sampling Frequency
960 #--Sampling Frequency
935 clock = filter_parms['clock']
961 clock = filter_parms['clock']
936 filter_2 = filter_parms['filter_2']
962 filter_2 = filter_parms['filter_2']
937 filter_5 = filter_parms['filter_5']
963 filter_5 = filter_parms['filter_5']
938 filter_fir = filter_parms['filter_fir']
964 filter_fir = filter_parms['filter_fir']
939 samp_freq_jars = clock/filter_2/filter_5/filter_fir
965 samp_freq_jars = clock/filter_2/filter_5/filter_fir
940
966
941 kwargs['samp_freq_jars'] = samp_freq_jars
967 kwargs['samp_freq_jars'] = samp_freq_jars
942 kwargs['jars'] = configuration
968 kwargs['jars'] = configuration
943
969
944 #--------------------- RC ----------------------:
970 #--------------------- RC ----------------------:
945 if configuration.device.device_type.name == 'rc':
971 if configuration.device.device_type.name == 'rc':
946 rc_conf = True
972 rc_conf = True
947 rc_parms = configuration.parms_to_dict()
973 rc_parms = configuration.parms_to_dict()
948 if rc_parms['mix'] == 'True':
974 if rc_parms['mix'] == 'True':
949 pass
975 pass
950 else:
976 else:
951 rc_lines = rc_parms['lines']
977 rc_lines = rc_parms['lines']
952 dh = rc_lines[6]['params'][0]['resolution']
978 dh = rc_lines[6]['params'][0]['resolution']
953 #--Sampling Frequency
979 #--Sampling Frequency
954 samp_freq_rc = 0.15/dh
980 samp_freq_rc = 0.15/dh
955 kwargs['samp_freq_rc'] = samp_freq_rc
981 kwargs['samp_freq_rc'] = samp_freq_rc
956
982
957 kwargs['rc_conf'] = rc_conf
983 kwargs['rc_conf'] = rc_conf
958 kwargs['rc'] = configuration
984 kwargs['rc'] = configuration
959
985
960 #-------------------- DDS ----------------------:
986 #-------------------- DDS ----------------------:
961 if configuration.device.device_type.name == 'dds':
987 if configuration.device.device_type.name == 'dds':
962 dds_conf = True
988 dds_conf = True
963 dds_parms = configuration.parms_to_dict()
989 dds_parms = configuration.parms_to_dict()
964
990
965 kwargs['dds_conf'] = dds_conf
991 kwargs['dds_conf'] = dds_conf
966 kwargs['dds'] = configuration
992 kwargs['dds'] = configuration
967
993
968
994
969 #------------Validation------------:
995 #------------Validation------------:
970 #Clock
996 #Clock
971 if dds_conf and rc_conf and jars_conf:
997 if dds_conf and rc_conf and jars_conf:
972 if filter_parms['clock'] != rc_parms['clock_in'] and rc_parms['clock_in'] != dds_parms['clock']:
998 if filter_parms['clock'] != rc_parms['clock_in'] and rc_parms['clock_in'] != dds_parms['clock']:
973 messages.warning(request, "Devices don't have the same clock.")
999 messages.warning(request, "Devices don't have the same clock.")
974 elif rc_conf and jars_conf:
1000 elif rc_conf and jars_conf:
975 if filter_parms['clock'] != rc_parms['clock_in']:
1001 if filter_parms['clock'] != rc_parms['clock_in']:
976 messages.warning(request, "Devices don't have the same clock.")
1002 messages.warning(request, "Devices don't have the same clock.")
977 elif rc_conf and dds_conf:
1003 elif rc_conf and dds_conf:
978 if rc_parms['clock_in'] != dds_parms['clock']:
1004 if rc_parms['clock_in'] != dds_parms['clock']:
979 messages.warning(request, "Devices don't have the same clock.")
1005 messages.warning(request, "Devices don't have the same clock.")
980 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
1006 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
981 messages.warning(request, "Devices don't have the same Frequency A.")
1007 messages.warning(request, "Devices don't have the same Frequency A.")
982
1008
983
1009
984
1010
985 ###### SIDEBAR ######
1011 ###### SIDEBAR ######
986 kwargs.update(sidebar(experiment=experiment))
1012 kwargs.update(sidebar(experiment=experiment))
987
1013
988
1014
989
1015
990
1016
991
1017
992 return render(request, 'experiment_verify.html', kwargs)
1018 return render(request, 'experiment_verify.html', kwargs)
993
1019
994
1020
995 @user_passes_test(lambda u:u.is_staff)
1021 @user_passes_test(lambda u:u.is_staff)
996 def parse_mix_result(s):
1022 def parse_mix_result(s):
997
1023
998 values = s.split('-')
1024 values = s.split('-')
999 html = 'EXP MOD OPE DELAY MASK\r\n'
1025 html = 'EXP MOD OPE DELAY MASK\r\n'
1000
1026
1001 if not values or values[0] in ('', ' '):
1027 if not values or values[0] in ('', ' '):
1002 return mark_safe(html)
1028 return mark_safe(html)
1003
1029
1004 for i, value in enumerate(values):
1030 for i, value in enumerate(values):
1005 if not value:
1031 if not value:
1006 continue
1032 continue
1007 pk, mode, operation, delay, mask = value.split('|')
1033 pk, mode, operation, delay, mask = value.split('|')
1008 conf = RCConfiguration.objects.get(pk=pk)
1034 conf = RCConfiguration.objects.get(pk=pk)
1009 if i==0:
1035 if i==0:
1010 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1036 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1011 conf.name,
1037 conf.name,
1012 mode,
1038 mode,
1013 ' ',
1039 ' ',
1014 delay,
1040 delay,
1015 mask)
1041 mask)
1016 else:
1042 else:
1017 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1043 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1018 conf.name,
1044 conf.name,
1019 mode,
1045 mode,
1020 operation,
1046 operation,
1021 delay,
1047 delay,
1022 mask)
1048 mask)
1023
1049
1024 return mark_safe(html)
1050 return mark_safe(html)
1025
1051
1026 def parse_mask(l):
1052 def parse_mask(l):
1027
1053
1028 values = []
1054 values = []
1029
1055
1030 for x in range(8):
1056 for x in range(8):
1031 if '{}'.format(x) in l:
1057 if '{}'.format(x) in l:
1032 values.append(1)
1058 values.append(1)
1033 else:
1059 else:
1034 values.append(0)
1060 values.append(0)
1035
1061
1036 values.reverse()
1062 values.reverse()
1037
1063
1038 return int(''.join([str(x) for x in values]), 2)
1064 return int(''.join([str(x) for x in values]), 2)
1039
1065
1040
1066
1041 def dev_confs(request):
1067 def dev_confs(request):
1042
1068
1043
1069
1044 page = request.GET.get('page')
1070 page = request.GET.get('page')
1045 order = ('type', 'device__device_type', 'experiment')
1071 order = ('type', 'device__device_type', 'experiment')
1046 filters = request.GET.copy()
1072 filters = request.GET.copy()
1047
1073
1048 kwargs = get_paginator(Configuration, page, order, filters)
1074 kwargs = get_paginator(Configuration, page, order, filters)
1049
1075
1050 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
1076 form = FilterForm(initial=request.GET, extra_fields=['tags','template'])
1051 kwargs['keys'] = ['name', 'experiment', 'type', 'programmed_date']
1077 kwargs['keys'] = ['name', 'experiment', 'type', 'programmed_date']
1052 kwargs['title'] = 'Configuration'
1078 kwargs['title'] = 'Configuration'
1053 kwargs['suptitle'] = 'List'
1079 kwargs['suptitle'] = 'List'
1054 kwargs['no_sidebar'] = True
1080 kwargs['no_sidebar'] = True
1055 kwargs['form'] = form
1081 kwargs['form'] = form
1056 filters.pop('page', None)
1082 filters.pop('page', None)
1057 kwargs['q'] = urlencode(filters)
1083 kwargs['q'] = urlencode(filters)
1058
1084
1059 return render(request, 'base_list.html', kwargs)
1085 return render(request, 'base_list.html', kwargs)
1060
1086
1061
1087
1062 def dev_conf(request, id_conf):
1088 def dev_conf(request, id_conf):
1063
1089
1064 conf = get_object_or_404(Configuration, pk=id_conf)
1090 conf = get_object_or_404(Configuration, pk=id_conf)
1065
1091
1066 return redirect(conf.get_absolute_url())
1092 return redirect(conf.get_absolute_url())
1067
1093
1068
1094
1069 @user_passes_test(lambda u:u.is_staff)
1095 @user_passes_test(lambda u:u.is_staff)
1070 def dev_conf_new(request, id_exp=0, id_dev=0):
1096 def dev_conf_new(request, id_exp=0, id_dev=0):
1071
1097
1072 initial = {}
1098 initial = {}
1073 kwargs = {}
1099 kwargs = {}
1074
1100
1075 if id_exp!=0:
1101 if id_exp!=0:
1076 initial['experiment'] = id_exp
1102 initial['experiment'] = id_exp
1077
1103
1078 if id_dev!=0:
1104 if id_dev!=0:
1079 initial['device'] = id_dev
1105 initial['device'] = id_dev
1080
1106
1081 if request.method == 'GET':
1107 if request.method == 'GET':
1082
1108
1083 if id_dev:
1109 if id_dev:
1084 kwargs['button'] = 'Create'
1110 kwargs['button'] = 'Create'
1085 device = Device.objects.get(pk=id_dev)
1111 device = Device.objects.get(pk=id_dev)
1086 DevConfForm = CONF_FORMS[device.device_type.name]
1112 DevConfForm = CONF_FORMS[device.device_type.name]
1087 initial['name'] = request.GET['name']
1113 initial['name'] = request.GET['name']
1088 form = DevConfForm(initial=initial)
1114 form = DevConfForm(initial=initial)
1089 else:
1115 else:
1090 if 'template' in request.GET:
1116 if 'template' in request.GET:
1091 if request.GET['template']=='0':
1117 if request.GET['template']=='0':
1092 choices = [(conf.pk, '{}'.format(conf)) for conf in Configuration.objects.filter(template=True)]
1118 choices = [(conf.pk, '{}'.format(conf)) for conf in Configuration.objects.filter(template=True)]
1093 form = NewForm(initial={'create_from':2},
1119 form = NewForm(initial={'create_from':2},
1094 template_choices=choices)
1120 template_choices=choices)
1095 else:
1121 else:
1096 kwargs['button'] = 'Create'
1122 kwargs['button'] = 'Create'
1097 conf = Configuration.objects.get(pk=request.GET['template'])
1123 conf = Configuration.objects.get(pk=request.GET['template'])
1098 id_dev = conf.device.pk
1124 id_dev = conf.device.pk
1099 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1125 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1100 form = DevConfForm(instance=conf,
1126 form = DevConfForm(instance=conf,
1101 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
1127 initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()),
1102 'template': False,
1128 'template': False,
1103 'experiment':id_exp})
1129 'experiment':id_exp})
1104 elif 'blank' in request.GET:
1130 elif 'blank' in request.GET:
1105 kwargs['button'] = 'Create'
1131 kwargs['button'] = 'Create'
1106 form = ConfigurationForm(initial=initial)
1132 form = ConfigurationForm(initial=initial)
1107 else:
1133 else:
1108 form = NewForm()
1134 form = NewForm()
1109
1135
1110 if request.method == 'POST':
1136 if request.method == 'POST':
1111
1137
1112 device = Device.objects.get(pk=request.POST['device'])
1138 device = Device.objects.get(pk=request.POST['device'])
1113 DevConfForm = CONF_FORMS[device.device_type.name]
1139 DevConfForm = CONF_FORMS[device.device_type.name]
1114
1140
1115 form = DevConfForm(request.POST)
1141 form = DevConfForm(request.POST)
1116 kwargs['button'] = 'Create'
1142 kwargs['button'] = 'Create'
1117 if form.is_valid():
1143 if form.is_valid():
1118 conf = form.save()
1144 conf = form.save()
1119
1145
1120 if 'template' in request.GET and conf.device.device_type.name=='rc':
1146 if 'template' in request.GET and conf.device.device_type.name=='rc':
1121 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
1147 lines = RCLine.objects.filter(rc_configuration=request.GET['template'])
1122 for line in lines:
1148 for line in lines:
1123 line.clone(rc_configuration=conf)
1149 line.clone(rc_configuration=conf)
1124
1150
1125 if conf.device.device_type.name=='jars':
1151 if conf.device.device_type.name=='jars':
1126 conf.add_parms_to_filter()
1152 conf.add_parms_to_filter()
1127
1153
1128 return redirect('url_dev_conf', id_conf=conf.pk)
1154 return redirect('url_dev_conf', id_conf=conf.pk)
1129
1155
1130 kwargs['id_exp'] = id_exp
1156 kwargs['id_exp'] = id_exp
1131 kwargs['form'] = form
1157 kwargs['form'] = form
1132 kwargs['title'] = 'Configuration'
1158 kwargs['title'] = 'Configuration'
1133 kwargs['suptitle'] = 'New'
1159 kwargs['suptitle'] = 'New'
1134
1160
1135
1161
1136 if id_dev != 0:
1162 if id_dev != 0:
1137 device = Device.objects.get(pk=id_dev)
1163 device = Device.objects.get(pk=id_dev)
1138 kwargs['device'] = device.device_type.name
1164 kwargs['device'] = device.device_type.name
1139
1165
1140 return render(request, 'dev_conf_edit.html', kwargs)
1166 return render(request, 'dev_conf_edit.html', kwargs)
1141
1167
1142
1168
1143 @user_passes_test(lambda u:u.is_staff)
1169 @user_passes_test(lambda u:u.is_staff)
1144 def dev_conf_edit(request, id_conf):
1170 def dev_conf_edit(request, id_conf):
1145
1171
1146 conf = get_object_or_404(Configuration, pk=id_conf)
1172 conf = get_object_or_404(Configuration, pk=id_conf)
1147
1173
1148 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1174 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1149
1175
1150 if request.method=='GET':
1176 if request.method=='GET':
1151 form = DevConfForm(instance=conf)
1177 form = DevConfForm(instance=conf)
1152
1178
1153 if request.method=='POST':
1179 if request.method=='POST':
1154 form = DevConfForm(request.POST, instance=conf)
1180 form = DevConfForm(request.POST, instance=conf)
1155
1181
1156 if form.is_valid():
1182 if form.is_valid():
1157 form.save()
1183 form.save()
1158 return redirect('url_dev_conf', id_conf=id_conf)
1184 return redirect('url_dev_conf', id_conf=id_conf)
1159
1185
1160 kwargs = {}
1186 kwargs = {}
1161 kwargs['form'] = form
1187 kwargs['form'] = form
1162 kwargs['title'] = 'Device Configuration'
1188 kwargs['title'] = 'Device Configuration'
1163 kwargs['suptitle'] = 'Edit'
1189 kwargs['suptitle'] = 'Edit'
1164 kwargs['button'] = 'Update'
1190 kwargs['button'] = 'Update'
1165
1191
1166 ###### SIDEBAR ######
1192 ###### SIDEBAR ######
1167 kwargs.update(sidebar(conf=conf))
1193 kwargs.update(sidebar(conf=conf))
1168
1194
1169 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1195 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1170
1196
1171
1197
1172 @user_passes_test(lambda u:u.is_staff)
1198 @user_passes_test(lambda u:u.is_staff)
1173 def dev_conf_start(request, id_conf):
1199 def dev_conf_start(request, id_conf):
1174
1200
1175 conf = get_object_or_404(Configuration, pk=id_conf)
1201 conf = get_object_or_404(Configuration, pk=id_conf)
1176
1202
1177 if conf.start_device():
1203 if conf.start_device():
1178 messages.success(request, conf.message)
1204 messages.success(request, conf.message)
1179 else:
1205 else:
1180 messages.error(request, conf.message)
1206 messages.error(request, conf.message)
1181
1207
1182 #conf.status_device()
1208 #conf.status_device()
1183
1209
1184 return redirect(conf.get_absolute_url())
1210 return redirect(conf.get_absolute_url())
1185
1211
1186
1212
1187 @user_passes_test(lambda u:u.is_staff)
1213 @user_passes_test(lambda u:u.is_staff)
1188 def dev_conf_stop(request, id_conf):
1214 def dev_conf_stop(request, id_conf):
1189
1215
1190 conf = get_object_or_404(Configuration, pk=id_conf)
1216 conf = get_object_or_404(Configuration, pk=id_conf)
1191
1217
1192 if conf.stop_device():
1218 if conf.stop_device():
1193 messages.success(request, conf.message)
1219 messages.success(request, conf.message)
1194 else:
1220 else:
1195 messages.error(request, conf.message)
1221 messages.error(request, conf.message)
1196
1222
1197 #conf.status_device()
1223 #conf.status_device()
1198
1224
1199 return redirect(conf.get_absolute_url())
1225 return redirect(conf.get_absolute_url())
1200
1226
1201
1227
1202 def dev_conf_status(request, id_conf):
1228 def dev_conf_status(request, id_conf):
1203
1229
1204 conf = get_object_or_404(Configuration, pk=id_conf)
1230 conf = get_object_or_404(Configuration, pk=id_conf)
1205
1231
1206 if conf.status_device():
1232 if conf.status_device():
1207 messages.success(request, conf.message)
1233 messages.success(request, conf.message)
1208 else:
1234 else:
1209 messages.error(request, conf.message)
1235 messages.error(request, conf.message)
1210
1236
1211 return redirect(conf.get_absolute_url())
1237 return redirect(conf.get_absolute_url())
1212
1238
1213
1239
1214 @user_passes_test(lambda u:u.is_staff)
1240 @user_passes_test(lambda u:u.is_staff)
1215 def dev_conf_write(request, id_conf):
1241 def dev_conf_write(request, id_conf):
1216
1242
1217 conf = get_object_or_404(Configuration, pk=id_conf)
1243 conf = get_object_or_404(Configuration, pk=id_conf)
1218
1244
1219 if conf.write_device():
1245 if conf.write_device():
1220 messages.success(request, conf.message)
1246 messages.success(request, conf.message)
1221 conf.clone(type=1, template=False)
1247 conf.clone(type=1, template=False)
1222 else:
1248 else:
1223 messages.error(request, conf.message)
1249 messages.error(request, conf.message)
1224
1250
1225 return redirect(conf.get_absolute_url())
1251 return redirect(conf.get_absolute_url())
1226
1252
1227
1253
1228 @user_passes_test(lambda u:u.is_staff)
1254 @user_passes_test(lambda u:u.is_staff)
1229 def dev_conf_read(request, id_conf):
1255 def dev_conf_read(request, id_conf):
1230
1256
1231 conf = get_object_or_404(Configuration, pk=id_conf)
1257 conf = get_object_or_404(Configuration, pk=id_conf)
1232
1258
1233 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1259 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1234
1260
1235 if request.method=='GET':
1261 if request.method=='GET':
1236
1262
1237 parms = conf.read_device()
1263 parms = conf.read_device()
1238 #conf.status_device()
1264 #conf.status_device()
1239
1265
1240 if not parms:
1266 if not parms:
1241 messages.error(request, conf.message)
1267 messages.error(request, conf.message)
1242 return redirect(conf.get_absolute_url())
1268 return redirect(conf.get_absolute_url())
1243
1269
1244 form = DevConfForm(initial=parms, instance=conf)
1270 form = DevConfForm(initial=parms, instance=conf)
1245
1271
1246 if request.method=='POST':
1272 if request.method=='POST':
1247 form = DevConfForm(request.POST, instance=conf)
1273 form = DevConfForm(request.POST, instance=conf)
1248
1274
1249 if form.is_valid():
1275 if form.is_valid():
1250 form.save()
1276 form.save()
1251 return redirect(conf.get_absolute_url())
1277 return redirect(conf.get_absolute_url())
1252
1278
1253 messages.error(request, "Parameters could not be saved")
1279 messages.error(request, "Parameters could not be saved")
1254
1280
1255 kwargs = {}
1281 kwargs = {}
1256 kwargs['id_dev'] = conf.id
1282 kwargs['id_dev'] = conf.id
1257 kwargs['form'] = form
1283 kwargs['form'] = form
1258 kwargs['title'] = 'Device Configuration'
1284 kwargs['title'] = 'Device Configuration'
1259 kwargs['suptitle'] = 'Parameters read from device'
1285 kwargs['suptitle'] = 'Parameters read from device'
1260 kwargs['button'] = 'Save'
1286 kwargs['button'] = 'Save'
1261
1287
1262 ###### SIDEBAR ######
1288 ###### SIDEBAR ######
1263 kwargs.update(sidebar(conf=conf))
1289 kwargs.update(sidebar(conf=conf))
1264
1290
1265 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1291 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
1266
1292
1267
1293
1268 @user_passes_test(lambda u:u.is_staff)
1294 @user_passes_test(lambda u:u.is_staff)
1269 def dev_conf_import(request, id_conf):
1295 def dev_conf_import(request, id_conf):
1270
1296
1271 conf = get_object_or_404(Configuration, pk=id_conf)
1297 conf = get_object_or_404(Configuration, pk=id_conf)
1272 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1298 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1273
1299
1274 if request.method == 'GET':
1300 if request.method == 'GET':
1275 file_form = UploadFileForm()
1301 file_form = UploadFileForm()
1276
1302
1277 if request.method == 'POST':
1303 if request.method == 'POST':
1278 file_form = UploadFileForm(request.POST, request.FILES)
1304 file_form = UploadFileForm(request.POST, request.FILES)
1279
1305
1280 if file_form.is_valid():
1306 if file_form.is_valid():
1281
1307
1282 parms = conf.import_from_file(request.FILES['file'])
1308 parms = conf.import_from_file(request.FILES['file'])
1283
1309
1284 if parms:
1310 if parms:
1285 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1311 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
1286 form = DevConfForm(initial=parms, instance=conf)
1312 form = DevConfForm(initial=parms, instance=conf)
1287
1313
1288 kwargs = {}
1314 kwargs = {}
1289 kwargs['id_dev'] = conf.id
1315 kwargs['id_dev'] = conf.id
1290 kwargs['form'] = form
1316 kwargs['form'] = form
1291 kwargs['title'] = 'Device Configuration'
1317 kwargs['title'] = 'Device Configuration'
1292 kwargs['suptitle'] = 'Parameters imported'
1318 kwargs['suptitle'] = 'Parameters imported'
1293 kwargs['button'] = 'Save'
1319 kwargs['button'] = 'Save'
1294 kwargs['action'] = conf.get_absolute_url_edit()
1320 kwargs['action'] = conf.get_absolute_url_edit()
1295 kwargs['previous'] = conf.get_absolute_url()
1321 kwargs['previous'] = conf.get_absolute_url()
1296
1322
1297 ###### SIDEBAR ######
1323 ###### SIDEBAR ######
1298 kwargs.update(sidebar(conf=conf))
1324 kwargs.update(sidebar(conf=conf))
1299
1325
1300 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1326 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1301
1327
1302 messages.error(request, "Could not import parameters from file")
1328 messages.error(request, "Could not import parameters from file")
1303
1329
1304 kwargs = {}
1330 kwargs = {}
1305 kwargs['id_dev'] = conf.id
1331 kwargs['id_dev'] = conf.id
1306 kwargs['title'] = 'Device Configuration'
1332 kwargs['title'] = 'Device Configuration'
1307 kwargs['form'] = file_form
1333 kwargs['form'] = file_form
1308 kwargs['suptitle'] = 'Importing file'
1334 kwargs['suptitle'] = 'Importing file'
1309 kwargs['button'] = 'Import'
1335 kwargs['button'] = 'Import'
1310
1336
1311 kwargs.update(sidebar(conf=conf))
1337 kwargs.update(sidebar(conf=conf))
1312
1338
1313 return render(request, 'dev_conf_import.html', kwargs)
1339 return render(request, 'dev_conf_import.html', kwargs)
1314
1340
1315
1341
1316 @user_passes_test(lambda u:u.is_staff)
1342 @user_passes_test(lambda u:u.is_staff)
1317 def dev_conf_export(request, id_conf):
1343 def dev_conf_export(request, id_conf):
1318
1344
1319 conf = get_object_or_404(Configuration, pk=id_conf)
1345 conf = get_object_or_404(Configuration, pk=id_conf)
1320
1346
1321 if request.method == 'GET':
1347 if request.method == 'GET':
1322 file_form = DownloadFileForm(conf.device.device_type.name)
1348 file_form = DownloadFileForm(conf.device.device_type.name)
1323
1349
1324 if request.method == 'POST':
1350 if request.method == 'POST':
1325 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1351 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
1326
1352
1327 if file_form.is_valid():
1353 if file_form.is_valid():
1328 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1354 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
1329
1355
1330 response = HttpResponse(content_type=fields['content_type'])
1356 response = HttpResponse(content_type=fields['content_type'])
1331 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1357 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
1332 response.write(fields['content'])
1358 response.write(fields['content'])
1333
1359
1334 return response
1360 return response
1335
1361
1336 messages.error(request, "Could not export parameters")
1362 messages.error(request, "Could not export parameters")
1337
1363
1338 kwargs = {}
1364 kwargs = {}
1339 kwargs['id_dev'] = conf.id
1365 kwargs['id_dev'] = conf.id
1340 kwargs['title'] = 'Device Configuration'
1366 kwargs['title'] = 'Device Configuration'
1341 kwargs['form'] = file_form
1367 kwargs['form'] = file_form
1342 kwargs['suptitle'] = 'Exporting file'
1368 kwargs['suptitle'] = 'Exporting file'
1343 kwargs['button'] = 'Export'
1369 kwargs['button'] = 'Export'
1344
1370
1345 return render(request, 'dev_conf_export.html', kwargs)
1371 return render(request, 'dev_conf_export.html', kwargs)
1346
1372
1347
1373
1348 @user_passes_test(lambda u:u.is_staff)
1374 @user_passes_test(lambda u:u.is_staff)
1349 def dev_conf_delete(request, id_conf):
1375 def dev_conf_delete(request, id_conf):
1350
1376
1351 conf = get_object_or_404(Configuration, pk=id_conf)
1377 conf = get_object_or_404(Configuration, pk=id_conf)
1352
1378
1353 if request.method=='POST':
1379 if request.method=='POST':
1354 if request.user.is_staff:
1380 if request.user.is_staff:
1355 conf.delete()
1381 conf.delete()
1356 return redirect('url_dev_confs')
1382 return redirect('url_dev_confs')
1357
1383
1358 messages.error(request, 'Not enough permission to delete this object')
1384 messages.error(request, 'Not enough permission to delete this object')
1359 return redirect(conf.get_absolute_url())
1385 return redirect(conf.get_absolute_url())
1360
1386
1361 kwargs = {
1387 kwargs = {
1362 'title': 'Delete',
1388 'title': 'Delete',
1363 'suptitle': 'Experiment',
1389 'suptitle': 'Experiment',
1364 'object': conf,
1390 'object': conf,
1365 'previous': conf.get_absolute_url(),
1391 'previous': conf.get_absolute_url(),
1366 'delete': True
1392 'delete': True
1367 }
1393 }
1368
1394
1369 return render(request, 'confirm.html', kwargs)
1395 return render(request, 'confirm.html', kwargs)
1370
1396
1371
1397
1372 def sidebar(**kwargs):
1398 def sidebar(**kwargs):
1373
1399
1374 side_data = {}
1400 side_data = {}
1375
1401
1376 conf = kwargs.get('conf', None)
1402 conf = kwargs.get('conf', None)
1377 experiment = kwargs.get('experiment', None)
1403 experiment = kwargs.get('experiment', None)
1378
1404
1379 if not experiment:
1405 if not experiment:
1380 experiment = conf.experiment
1406 experiment = conf.experiment
1381
1407
1382 if experiment:
1408 if experiment:
1383 side_data['experiment'] = experiment
1409 side_data['experiment'] = experiment
1384 campaign = experiment.campaign_set.all()
1410 campaign = experiment.campaign_set.all()
1385 if campaign:
1411 if campaign:
1386 side_data['campaign'] = campaign[0]
1412 side_data['campaign'] = campaign[0]
1387 experiments = campaign[0].experiments.all()
1413 experiments = campaign[0].experiments.all()
1388 else:
1414 else:
1389 experiments = [experiment]
1415 experiments = [experiment]
1390 configurations = experiment.configuration_set.filter(type=0)
1416 configurations = experiment.configuration_set.filter(type=0)
1391 side_data['side_experiments'] = experiments
1417 side_data['side_experiments'] = experiments
1392 side_data['side_configurations'] = configurations
1418 side_data['side_configurations'] = configurations
1393
1419
1394 return side_data
1420 return side_data
1395
1421
1396 def get_paginator(model, page, order, filters={}, n=10):
1422 def get_paginator(model, page, order, filters={}, n=10):
1397
1423
1398 kwargs = {}
1424 kwargs = {}
1399 query = Q()
1425 query = Q()
1400 if isinstance(filters, QueryDict):
1426 if isinstance(filters, QueryDict):
1401 filters = filters.dict()
1427 filters = filters.dict()
1402 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1428 [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1403 filters.pop('page', None)
1429 filters.pop('page', None)
1404
1430
1405 if 'template' in filters:
1431 if 'template' in filters:
1406 filters['template'] = True
1432 filters['template'] = True
1407 if 'start_date' in filters:
1433 if 'start_date' in filters:
1408 filters['start_date__gte'] = filters.pop('start_date')
1434 filters['start_date__gte'] = filters.pop('start_date')
1409 if 'end_date' in filters:
1435 if 'end_date' in filters:
1410 filters['start_date__lte'] = filters.pop('end_date')
1436 filters['start_date__lte'] = filters.pop('end_date')
1411 if 'tags' in filters:
1437 if 'tags' in filters:
1412 tags = filters.pop('tags')
1438 tags = filters.pop('tags')
1413 fields = [f.name for f in model._meta.get_fields()]
1439 fields = [f.name for f in model._meta.get_fields()]
1414
1440
1415 if 'tags' in fields:
1441 if 'tags' in fields:
1416 query = query | Q(tags__icontains=tags)
1442 query = query | Q(tags__icontains=tags)
1417 if 'name' in fields:
1443 if 'name' in fields:
1418 query = query | Q(name__icontains=tags)
1444 query = query | Q(name__icontains=tags)
1419 if 'location' in fields:
1445 if 'location' in fields:
1420 query = query | Q(location__name__icontains=tags)
1446 query = query | Q(location__name__icontains=tags)
1421 if 'device' in fields:
1447 if 'device' in fields:
1422 query = query | Q(device__device_type__name__icontains=tags)
1448 query = query | Q(device__device_type__name__icontains=tags)
1423
1449
1424 object_list = model.objects.filter(query, **filters).order_by(*order)
1450 object_list = model.objects.filter(query, **filters).order_by(*order)
1425 paginator = Paginator(object_list, n)
1451 paginator = Paginator(object_list, n)
1426
1452
1427 try:
1453 try:
1428 objects = paginator.page(page)
1454 objects = paginator.page(page)
1429 except PageNotAnInteger:
1455 except PageNotAnInteger:
1430 objects = paginator.page(1)
1456 objects = paginator.page(1)
1431 except EmptyPage:
1457 except EmptyPage:
1432 objects = paginator.page(paginator.num_pages)
1458 objects = paginator.page(paginator.num_pages)
1433
1459
1434 kwargs['objects'] = objects
1460 kwargs['objects'] = objects
1435 kwargs['offset'] = (int(page)-1)*n if page else 0
1461 kwargs['offset'] = (int(page)-1)*n if page else 0
1436
1462
1437 return kwargs
1463 return kwargs
1438
1464
1439 def operation(request, id_camp=None):
1465 def operation(request, id_camp=None):
1440
1466
1441 kwargs = {}
1467 kwargs = {}
1442 kwargs['title'] = 'Radars Operation'
1468 kwargs['title'] = 'Radars Operation'
1443 kwargs['no_sidebar'] = True
1469 kwargs['no_sidebar'] = True
1444 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1470 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1445 end_date__gte=datetime.now()).order_by('-start_date')
1471 end_date__gte=datetime.now()).order_by('-start_date')
1446
1472
1447
1473
1448 if id_camp:
1474 if id_camp:
1449 campaign = get_object_or_404(Campaign, pk = id_camp)
1475 campaign = get_object_or_404(Campaign, pk = id_camp)
1450 form = OperationForm(initial={'campaign': campaign.id}, campaigns=campaigns)
1476 form = OperationForm(initial={'campaign': campaign.id}, campaigns=campaigns)
1451 kwargs['campaign'] = campaign
1477 kwargs['campaign'] = campaign
1452 else:
1478 else:
1453 form = OperationForm(campaigns=campaigns)
1479 form = OperationForm(campaigns=campaigns)
1454 kwargs['form'] = form
1480 kwargs['form'] = form
1455 return render(request, 'operation.html', kwargs)
1481 return render(request, 'operation.html', kwargs)
1456
1482
1457 #---Experiment
1483 #---Experiment
1458 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1484 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1459 kwargs['experiment_keys'] = keys[1:]
1485 kwargs['experiment_keys'] = keys[1:]
1460 kwargs['experiments'] = experiments
1486 kwargs['experiments'] = experiments
1461 #---Radar
1487 #---Radar
1462 kwargs['locations'] = campaign.get_experiments_by_radar()
1488 kwargs['locations'] = campaign.get_experiments_by_radar()
1463 kwargs['form'] = form
1489 kwargs['form'] = form
1464
1490
1465 return render(request, 'operation.html', kwargs)
1491 return render(request, 'operation.html', kwargs)
1466
1492
1467
1493
1468 @login_required
1494 @login_required
1469 def radar_start(request, id_camp, id_radar):
1495 def radar_start(request, id_camp, id_radar):
1470
1496
1471 campaign = get_object_or_404(Campaign, pk = id_camp)
1497 campaign = get_object_or_404(Campaign, pk = id_camp)
1472 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1498 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1473 now = datetime.utcnow()
1499 now = datetime.utcnow()
1474
1500
1475 for exp in experiments:
1501 for exp in experiments:
1476 date = datetime.combine(datetime.now().date(), exp.start_time)
1502 date = datetime.combine(datetime.now().date(), exp.start_time)
1477
1503
1478 if exp.status == 2:
1504 if exp.status == 2:
1479 messages.warning(request, 'Experiment {} already running'.format(exp))
1505 messages.warning(request, 'Experiment {} already running'.format(exp))
1480 continue
1506 continue
1481
1507
1482 if exp.status == 3:
1508 if exp.status == 3:
1483 messages.warning(request, 'Experiment {} already programmed'.format(exp))
1509 messages.warning(request, 'Experiment {} already programmed'.format(exp))
1484 continue
1510 continue
1485
1511
1486 if date>campaign.end_date or date<campaign.start_date:
1512 if date>campaign.end_date or date<campaign.start_date:
1487 messages.warning(request, 'Experiment {} out of date'.format(exp))
1513 messages.warning(request, 'Experiment {} out of date'.format(exp))
1488 continue
1514 continue
1489
1515
1490 if now>=date:
1516 if now>=date:
1491 task = task_start.delay(exp.pk)
1517 task = task_start.delay(exp.pk)
1492 exp.status = task.wait()
1518 exp.status = task.wait()
1493 if exp.status==0:
1519 if exp.status==0:
1494 messages.error(request, 'Experiment {} not start'.format(exp))
1520 messages.error(request, 'Experiment {} not start'.format(exp))
1495 if exp.status==2:
1521 if exp.status==2:
1496 messages.success(request, 'Experiment {} started'.format(exp))
1522 messages.success(request, 'Experiment {} started'.format(exp))
1497 else:
1523 else:
1498 task = task_start.apply_async((exp.pk,), eta=date)
1524 task = task_start.apply_async((exp.pk,), eta=date)
1499 exp.status = 3
1525 exp.status = 3
1500 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, date))
1526 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, date))
1501
1527
1502 exp.save()
1528 exp.save()
1503
1529
1504 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1530 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1505
1531
1506
1532
1507 @login_required
1533 @login_required
1508 def radar_stop(request, id_camp, id_radar):
1534 def radar_stop(request, id_camp, id_radar):
1509
1535
1510 campaign = get_object_or_404(Campaign, pk = id_camp)
1536 campaign = get_object_or_404(Campaign, pk = id_camp)
1511 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1537 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1512
1538
1513 for exp in experiments:
1539 for exp in experiments:
1514
1540
1515 if exp.status == 2:
1541 if exp.status == 2:
1516 task = task_stop.delay(exp.pk)
1542 task = task_stop.delay(exp.pk)
1517 exp.status = task.wait()
1543 exp.status = task.wait()
1518 messages.warning(request, 'Experiment {} stopped'.format(exp))
1544 messages.warning(request, 'Experiment {} stopped'.format(exp))
1519 exp.save()
1545 exp.save()
1520 else:
1546 else:
1521 messages.error(request, 'Experiment {} not running'.format(exp))
1547 messages.error(request, 'Experiment {} not running'.format(exp))
1522
1548
1523 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1549 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1524
1550
1525
1551
1526 @login_required
1552 @login_required
1527 def radar_refresh(request, id_camp, id_radar):
1553 def radar_refresh(request, id_camp, id_radar):
1528
1554
1529 campaign = get_object_or_404(Campaign, pk = id_camp)
1555 campaign = get_object_or_404(Campaign, pk = id_camp)
1530 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1556 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1531
1557
1532 for exp in experiments:
1558 for exp in experiments:
1533 exp.get_status()
1559 exp.get_status()
1534
1560
1535 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1561 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
General Comments 0
You need to be logged in to leave comments. Login now