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