##// END OF EJS Templates
Update new and edit "views"...
Juan C. Espinoza -
r91:620bd5874a5a
parent child
Show More
@@ -1,151 +1,154
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
3
4 from .models import DeviceType, Device, Experiment, Campaign, Configuration, Location
4 from .models import DeviceType, Device, Experiment, Campaign, Configuration, Location
5
5
6 FILE_FORMAT = (
6 FILE_FORMAT = (
7 ('json', 'json'),
7 ('json', 'json'),
8 )
8 )
9
9
10 DDS_FILE_FORMAT = (
10 DDS_FILE_FORMAT = (
11 ('json', 'json'),
11 ('json', 'json'),
12 ('text', 'dds')
12 ('text', 'dds')
13 )
13 )
14
14
15 RC_FILE_FORMAT = (
15 RC_FILE_FORMAT = (
16 ('json', 'json'),
16 ('json', 'json'),
17 ('text', 'racp'),
17 ('text', 'racp'),
18 ('binary', 'dat'),
18 ('binary', 'dat'),
19 )
19 )
20
20
21 def add_empty_choice(choices, pos=0, label='-----'):
21 def add_empty_choice(choices, pos=0, label='-----'):
22 if len(choices)>0:
22 if len(choices)>0:
23 choices = list(choices)
23 choices = list(choices)
24 choices.insert(0, (0, label))
24 choices.insert(0, (0, label))
25 return choices
25 return choices
26 else:
26 else:
27 return [(0, label)]
27 return [(0, label)]
28
28
29 class DatepickerWidget(forms.widgets.TextInput):
29 class DatepickerWidget(forms.widgets.TextInput):
30 def render(self, name, value, attrs=None):
30 def render(self, name, value, attrs=None):
31 input_html = super(DatepickerWidget, self).render(name, value, attrs)
31 input_html = super(DatepickerWidget, self).render(name, value, attrs)
32 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span></div>'
32 html = '<div class="input-group date">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span></div>'
33 return mark_safe(html)
33 return mark_safe(html)
34
34
35 class TimepickerWidget(forms.widgets.TextInput):
35 class TimepickerWidget(forms.widgets.TextInput):
36 def render(self, name, value, attrs=None):
36 def render(self, name, value, attrs=None):
37 input_html = super(TimepickerWidget, self).render(name, value, attrs)
37 input_html = super(TimepickerWidget, self).render(name, value, attrs)
38 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span></div>'
38 html = '<div class="input-group time">'+input_html+'<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span></div>'
39 return mark_safe(html)
39 return mark_safe(html)
40
40
41 class CampaignForm(forms.ModelForm):
41 class CampaignForm(forms.ModelForm):
42
42
43 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
43 experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
44 queryset=Experiment.objects.filter(template=True),
44 queryset=Experiment.objects.filter(template=True),
45 required=False)
45 required=False)
46
46
47 def __init__(self, *args, **kwargs):
47 def __init__(self, *args, **kwargs):
48 super(CampaignForm, self).__init__(*args, **kwargs)
48 super(CampaignForm, self).__init__(*args, **kwargs)
49 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
49 self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
50 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
50 self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
51 self.fields['description'].widget.attrs = {'rows': 2}
51 self.fields['description'].widget.attrs = {'rows': 2}
52
53 if self.instance:
54 self.fields['experiments'].queryset |= self.instance.experiments.all()
52
55
53 class Meta:
56 class Meta:
54 model = Campaign
57 model = Campaign
55 exclude = ['']
58 exclude = ['']
56
59
57 class ExperimentForm(forms.ModelForm):
60 class ExperimentForm(forms.ModelForm):
58
61
59 def __init__(self, *args, **kwargs):
62 def __init__(self, *args, **kwargs):
60 super(ExperimentForm, self).__init__(*args, **kwargs)
63 super(ExperimentForm, self).__init__(*args, **kwargs)
61 self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
64 self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
62 self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
65 self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
63
66
64 class Meta:
67 class Meta:
65 model = Experiment
68 model = Experiment
66 exclude = ['status']
69 exclude = ['status']
67
70
68 class LocationForm(forms.ModelForm):
71 class LocationForm(forms.ModelForm):
69 class Meta:
72 class Meta:
70 model = Location
73 model = Location
71 exclude = ['']
74 exclude = ['']
72
75
73 class DeviceForm(forms.ModelForm):
76 class DeviceForm(forms.ModelForm):
74 class Meta:
77 class Meta:
75 model = Device
78 model = Device
76 exclude = ['status']
79 exclude = ['status']
77
80
78 class ConfigurationForm(forms.ModelForm):
81 class ConfigurationForm(forms.ModelForm):
79
82
80 def __init__(self, *args, **kwargs):
83 def __init__(self, *args, **kwargs):
81 super(ConfigurationForm, self).__init__(*args, **kwargs)
84 super(ConfigurationForm, self).__init__(*args, **kwargs)
82
85
83 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
86 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
84 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
87 self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
85
88
86 class Meta:
89 class Meta:
87 model = Configuration
90 model = Configuration
88 exclude = ['type', 'created_date', 'programmed_date', 'parameters']
91 exclude = ['type', 'created_date', 'programmed_date', 'parameters']
89
92
90 class DeviceTypeForm(forms.Form):
93 class DeviceTypeForm(forms.Form):
91 device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name')))
94 device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name')))
92
95
93
96
94 class UploadFileForm(forms.Form):
97 class UploadFileForm(forms.Form):
95
98
96 file = forms.FileField()
99 file = forms.FileField()
97
100
98 class DownloadFileForm(forms.Form):
101 class DownloadFileForm(forms.Form):
99
102
100 format = forms.ChoiceField(choices= ((0, 'json'),) )
103 format = forms.ChoiceField(choices= ((0, 'json'),) )
101
104
102 def __init__(self, device_type, *args, **kwargs):
105 def __init__(self, device_type, *args, **kwargs):
103
106
104 super(DownloadFileForm, self).__init__(*args, **kwargs)
107 super(DownloadFileForm, self).__init__(*args, **kwargs)
105
108
106 self.fields['format'].choices = FILE_FORMAT
109 self.fields['format'].choices = FILE_FORMAT
107
110
108 if device_type == 'dds':
111 if device_type == 'dds':
109 self.fields['format'].choices = DDS_FILE_FORMAT
112 self.fields['format'].choices = DDS_FILE_FORMAT
110
113
111 if device_type == 'rc':
114 if device_type == 'rc':
112 self.fields['format'].choices = RC_FILE_FORMAT
115 self.fields['format'].choices = RC_FILE_FORMAT
113
116
114 class OperationForm(forms.Form):
117 class OperationForm(forms.Form):
115 # today = datetime.today()
118 # today = datetime.today()
116 # -----Campaigns from this month------[:5]
119 # -----Campaigns from this month------[:5]
117 campaign = forms.ChoiceField(label="Campaign")
120 campaign = forms.ChoiceField(label="Campaign")
118
121
119 def __init__(self, *args, **kwargs):
122 def __init__(self, *args, **kwargs):
120
123
121 if 'length' not in kwargs.keys():
124 if 'length' not in kwargs.keys():
122 length = None
125 length = None
123 else:
126 else:
124 length = kwargs['length']
127 length = kwargs['length']
125
128
126 kwargs.pop('length')
129 kwargs.pop('length')
127
130
128 super(OperationForm, self).__init__(*args, **kwargs)
131 super(OperationForm, self).__init__(*args, **kwargs)
129 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')[:length]
132 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')[:length]
130
133
131 class OperationSearchForm(forms.Form):
134 class OperationSearchForm(forms.Form):
132 # -----ALL Campaigns------
135 # -----ALL Campaigns------
133 campaign = forms.ChoiceField(label="Campaign")
136 campaign = forms.ChoiceField(label="Campaign")
134
137
135 def __init__(self, *args, **kwargs):
138 def __init__(self, *args, **kwargs):
136 super(OperationSearchForm, self).__init__(*args, **kwargs)
139 super(OperationSearchForm, self).__init__(*args, **kwargs)
137 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
140 self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
138
141
139 class NewForm(forms.Form):
142 class NewForm(forms.Form):
140
143
141 create_from = forms.ChoiceField(choices=((0, '-----'),
144 create_from = forms.ChoiceField(choices=((0, '-----'),
142 (1, 'Empty (blank)'),
145 (1, 'Empty (blank)'),
143 (2, 'Template')))
146 (2, 'Template')))
144 choose_template = forms.ChoiceField()
147 choose_template = forms.ChoiceField()
145
148
146 def __init__(self, *args, **kwargs):
149 def __init__(self, *args, **kwargs):
147
150
148 template_choices = kwargs.pop('template_choices', [])
151 template_choices = kwargs.pop('template_choices', [])
149 super(NewForm, self).__init__(*args, **kwargs)
152 super(NewForm, self).__init__(*args, **kwargs)
150 self.fields['choose_template'].choices = add_empty_choice(template_choices)
153 self.fields['choose_template'].choices = add_empty_choice(template_choices)
151 No newline at end of file
154
@@ -1,387 +1,390
1
1
2 from datetime import datetime
2 from datetime import datetime
3
3
4 from django.db import models
4 from django.db import models
5 from polymorphic import PolymorphicModel
5 from polymorphic import PolymorphicModel
6
6
7 from django.core.urlresolvers import reverse
7 from django.core.urlresolvers import reverse
8
8
9 CONF_STATES = (
9 CONF_STATES = (
10 (0, 'Disconnected'),
10 (0, 'Disconnected'),
11 (1, 'Connected'),
11 (1, 'Connected'),
12 (2, 'Running'),
12 (2, 'Running'),
13 )
13 )
14
14
15 EXP_STATES = (
15 EXP_STATES = (
16 (0,'Error'), #RED
16 (0,'Error'), #RED
17 (1,'Configurated'), #BLUE
17 (1,'Configurated'), #BLUE
18 (2,'Running'), #GREEN
18 (2,'Running'), #GREEN
19 (3,'Waiting'), #YELLOW
19 (3,'Waiting'), #YELLOW
20 (4,'Not Configured'), #WHITE
20 (4,'Not Configured'), #WHITE
21 )
21 )
22
22
23 CONF_TYPES = (
23 CONF_TYPES = (
24 (0, 'Active'),
24 (0, 'Active'),
25 (1, 'Historical'),
25 (1, 'Historical'),
26 )
26 )
27
27
28 DEV_STATES = (
28 DEV_STATES = (
29 (0, 'No connected'),
29 (0, 'No connected'),
30 (1, 'Connected'),
30 (1, 'Connected'),
31 (2, 'Configured'),
31 (2, 'Configured'),
32 (3, 'Running'),
32 (3, 'Running'),
33 )
33 )
34
34
35 DEV_TYPES = (
35 DEV_TYPES = (
36 ('', 'Select a device type'),
36 ('', 'Select a device type'),
37 ('rc', 'Radar Controller'),
37 ('rc', 'Radar Controller'),
38 ('dds', 'Direct Digital Synthesizer'),
38 ('dds', 'Direct Digital Synthesizer'),
39 ('jars', 'Jicamarca Radar Acquisition System'),
39 ('jars', 'Jicamarca Radar Acquisition System'),
40 ('usrp', 'Universal Software Radio Peripheral'),
40 ('usrp', 'Universal Software Radio Peripheral'),
41 ('cgs', 'Clock Generator System'),
41 ('cgs', 'Clock Generator System'),
42 ('abs', 'Automatic Beam Switching'),
42 ('abs', 'Automatic Beam Switching'),
43 )
43 )
44
44
45 DEV_PORTS = {
45 DEV_PORTS = {
46 'rc' : 2000,
46 'rc' : 2000,
47 'dds' : 2000,
47 'dds' : 2000,
48 'jars' : 2000,
48 'jars' : 2000,
49 'usrp' : 2000,
49 'usrp' : 2000,
50 'cgs' : 8080,
50 'cgs' : 8080,
51 'abs' : 8080
51 'abs' : 8080
52 }
52 }
53
53
54 RADAR_STATES = (
54 RADAR_STATES = (
55 (0, 'No connected'),
55 (0, 'No connected'),
56 (1, 'Connected'),
56 (1, 'Connected'),
57 (2, 'Configured'),
57 (2, 'Configured'),
58 (3, 'Running'),
58 (3, 'Running'),
59 (4, 'Scheduled'),
59 (4, 'Scheduled'),
60 )
60 )
61 # Create your models here.
61 # Create your models here.
62
62
63 class Location(models.Model):
63 class Location(models.Model):
64
64
65 name = models.CharField(max_length = 30)
65 name = models.CharField(max_length = 30)
66 description = models.TextField(blank=True, null=True)
66 description = models.TextField(blank=True, null=True)
67
67
68 class Meta:
68 class Meta:
69 db_table = 'db_location'
69 db_table = 'db_location'
70
70
71 def __unicode__(self):
71 def __unicode__(self):
72 return u'%s' % self.name
72 return u'%s' % self.name
73
73
74 def get_absolute_url(self):
74 def get_absolute_url(self):
75 return reverse('url_device', args=[str(self.id)])
75 return reverse('url_device', args=[str(self.id)])
76
76
77
77
78 class DeviceType(models.Model):
78 class DeviceType(models.Model):
79
79
80 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
80 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
81 description = models.TextField(blank=True, null=True)
81 description = models.TextField(blank=True, null=True)
82
82
83 class Meta:
83 class Meta:
84 db_table = 'db_device_types'
84 db_table = 'db_device_types'
85
85
86 def __unicode__(self):
86 def __unicode__(self):
87 return u'%s' % self.get_name_display()
87 return u'%s' % self.get_name_display()
88
88
89 class Device(models.Model):
89 class Device(models.Model):
90
90
91 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
91 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
92 location = models.ForeignKey(Location, on_delete=models.CASCADE)
92 location = models.ForeignKey(Location, on_delete=models.CASCADE)
93
93
94 name = models.CharField(max_length=40, default='')
94 name = models.CharField(max_length=40, default='')
95 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
95 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
96 port_address = models.PositiveSmallIntegerField(default=2000)
96 port_address = models.PositiveSmallIntegerField(default=2000)
97 description = models.TextField(blank=True, null=True)
97 description = models.TextField(blank=True, null=True)
98 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
98 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
99
99
100 class Meta:
100 class Meta:
101 db_table = 'db_devices'
101 db_table = 'db_devices'
102
102
103 def __unicode__(self):
103 def __unicode__(self):
104 return u'%s | %s' % (self.name, self.ip_address)
104 return u'%s | %s' % (self.name, self.ip_address)
105
105
106 def get_status(self):
106 def get_status(self):
107 return self.status
107 return self.status
108
108
109 def get_absolute_url(self):
109 def get_absolute_url(self):
110 return reverse('url_device', args=[str(self.id)])
110 return reverse('url_device', args=[str(self.id)])
111
111
112
112
113 class Campaign(models.Model):
113 class Campaign(models.Model):
114
114
115 template = models.BooleanField(default=False)
115 template = models.BooleanField(default=False)
116 name = models.CharField(max_length=60, unique=True)
116 name = models.CharField(max_length=60, unique=True)
117 start_date = models.DateTimeField(blank=True, null=True)
117 start_date = models.DateTimeField(blank=True, null=True)
118 end_date = models.DateTimeField(blank=True, null=True)
118 end_date = models.DateTimeField(blank=True, null=True)
119 tags = models.CharField(max_length=40)
119 tags = models.CharField(max_length=40)
120 description = models.TextField(blank=True, null=True)
120 description = models.TextField(blank=True, null=True)
121 experiments = models.ManyToManyField('Experiment', blank=True)
121 experiments = models.ManyToManyField('Experiment', blank=True)
122
122
123 class Meta:
123 class Meta:
124 db_table = 'db_campaigns'
124 db_table = 'db_campaigns'
125 ordering = ('name',)
125 ordering = ('name',)
126
126
127 def __unicode__(self):
127 def __unicode__(self):
128 return u'%s' % (self.name)
128 return u'%s' % (self.name)
129
129
130 def get_absolute_url(self):
130 def get_absolute_url(self):
131 return reverse('url_campaign', args=[str(self.id)])
131 return reverse('url_campaign', args=[str(self.id)])
132
132
133
133
134 class RunningExperiment(models.Model):
134 class RunningExperiment(models.Model):
135 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
135 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
136 running_experiment = models.ManyToManyField('Experiment')
136 running_experiment = models.ManyToManyField('Experiment')
137 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
137 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
138
138
139
139
140 class Experiment(models.Model):
140 class Experiment(models.Model):
141
141
142 template = models.BooleanField(default=False)
142 template = models.BooleanField(default=False)
143 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
143 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
144 name = models.CharField(max_length=40, default='', unique=True)
144 name = models.CharField(max_length=40, default='', unique=True)
145 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
145 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
146 start_time = models.TimeField(default='00:00:00')
146 start_time = models.TimeField(default='00:00:00')
147 end_time = models.TimeField(default='23:59:59')
147 end_time = models.TimeField(default='23:59:59')
148 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
148 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
149
149
150 class Meta:
150 class Meta:
151 db_table = 'db_experiments'
151 db_table = 'db_experiments'
152 ordering = ('name',)
152 ordering = ('template', 'name')
153
153
154 def __unicode__(self):
154 def __unicode__(self):
155 return u'%s' % (self.name)
155 if self.template:
156 return u'%s (template)' % (self.name)
157 else:
158 return u'%s' % (self.name)
156
159
157 @property
160 @property
158 def radar(self):
161 def radar(self):
159 return self.location
162 return self.location
160
163
161 def clone(self, **kwargs):
164 def clone(self, **kwargs):
162
165
163 confs = Configuration.objects.filter(experiment=self, type=0)
166 confs = Configuration.objects.filter(experiment=self, type=0)
164 self.pk = None
167 self.pk = None
165 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
168 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
166 for attr, value in kwargs.items():
169 for attr, value in kwargs.items():
167 setattr(self, attr, value)
170 setattr(self, attr, value)
168
171
169 self.save()
172 self.save()
170
173
171 for conf in confs:
174 for conf in confs:
172 conf.clone(experiment=self, template=False)
175 conf.clone(experiment=self, template=False)
173
176
174 return self
177 return self
175
178
176 def get_status(self):
179 def get_status(self):
177 configurations = Configuration.objects.filter(experiment=self)
180 configurations = Configuration.objects.filter(experiment=self)
178 exp_status=[]
181 exp_status=[]
179 for conf in configurations:
182 for conf in configurations:
180 print conf.status_device()
183 print conf.status_device()
181 exp_status.append(conf.status_device())
184 exp_status.append(conf.status_device())
182
185
183 if not exp_status: #No Configuration
186 if not exp_status: #No Configuration
184 self.status = 4
187 self.status = 4
185 self.save()
188 self.save()
186 return
189 return
187
190
188 total = 1
191 total = 1
189 for e_s in exp_status:
192 for e_s in exp_status:
190 total = total*e_s
193 total = total*e_s
191
194
192 if total == 0: #Error
195 if total == 0: #Error
193 status = 0
196 status = 0
194 elif total == (3**len(exp_status)): #Running
197 elif total == (3**len(exp_status)): #Running
195 status = 2
198 status = 2
196 else:
199 else:
197 status = 1 #Configurated
200 status = 1 #Configurated
198
201
199 self.status = status
202 self.status = status
200 self.save()
203 self.save()
201
204
202 def status_color(self):
205 def status_color(self):
203 color = 'danger'
206 color = 'danger'
204 if self.status == 0:
207 if self.status == 0:
205 color = "danger"
208 color = "danger"
206 elif self.status == 1:
209 elif self.status == 1:
207 color = "info"
210 color = "info"
208 elif self.status == 2:
211 elif self.status == 2:
209 color = "succes"
212 color = "success"
210 elif self.status == 3:
213 elif self.status == 3:
211 color = "warning"
214 color = "warning"
212 else:
215 else:
213 color = "muted"
216 color = "muted"
214
217
215 return color
218 return color
216
219
217 def get_absolute_url(self):
220 def get_absolute_url(self):
218 return reverse('url_experiment', args=[str(self.id)])
221 return reverse('url_experiment', args=[str(self.id)])
219
222
220
223
221 class Configuration(PolymorphicModel):
224 class Configuration(PolymorphicModel):
222
225
223 template = models.BooleanField(default=False)
226 template = models.BooleanField(default=False)
224
227
225 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
228 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
226
229
227 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
230 experiment = models.ForeignKey('Experiment', null=True, blank=True, on_delete=models.CASCADE)
228 device = models.ForeignKey(Device, on_delete=models.CASCADE)
231 device = models.ForeignKey(Device, on_delete=models.CASCADE)
229
232
230 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
233 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
231
234
232 created_date = models.DateTimeField(auto_now_add=True)
235 created_date = models.DateTimeField(auto_now_add=True)
233 programmed_date = models.DateTimeField(auto_now=True)
236 programmed_date = models.DateTimeField(auto_now=True)
234
237
235 parameters = models.TextField(default='{}')
238 parameters = models.TextField(default='{}')
236
239
237 message = ""
240 message = ""
238
241
239 class Meta:
242 class Meta:
240 db_table = 'db_configurations'
243 db_table = 'db_configurations'
241
244
242 def __unicode__(self):
245 def __unicode__(self):
243
246
244 if self.experiment:
247 if self.experiment:
245 return u'[%s, %s]: %s' % (self.experiment.name,
248 return u'[%s, %s]: %s' % (self.experiment.name,
246 self.device.name,
249 self.device.name,
247 self.name)
250 self.name)
248 else:
251 else:
249 return u'%s' % self.device.name
252 return u'%s' % self.device.name
250
253
251 def clone(self, **kwargs):
254 def clone(self, **kwargs):
252
255
253 self.pk = None
256 self.pk = None
254 self.id = None
257 self.id = None
255 for attr, value in kwargs.items():
258 for attr, value in kwargs.items():
256 setattr(self, attr, value)
259 setattr(self, attr, value)
257
260
258 self.save()
261 self.save()
259
262
260 return self
263 return self
261
264
262 def parms_to_dict(self):
265 def parms_to_dict(self):
263
266
264 parameters = {}
267 parameters = {}
265
268
266 for key in self.__dict__.keys():
269 for key in self.__dict__.keys():
267 parameters[key] = getattr(self, key)
270 parameters[key] = getattr(self, key)
268
271
269 return parameters
272 return parameters
270
273
271 def parms_to_text(self):
274 def parms_to_text(self):
272
275
273 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
276 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
274
277
275 return ''
278 return ''
276
279
277 def parms_to_binary(self):
280 def parms_to_binary(self):
278
281
279 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
282 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
280
283
281 return ''
284 return ''
282
285
283 def dict_to_parms(self, parameters):
286 def dict_to_parms(self, parameters):
284
287
285 if type(parameters) != type({}):
288 if type(parameters) != type({}):
286 return
289 return
287
290
288 for key in parameters.keys():
291 for key in parameters.keys():
289 setattr(self, key, parameters[key])
292 setattr(self, key, parameters[key])
290
293
291 def export_to_file(self, format="json"):
294 def export_to_file(self, format="json"):
292
295
293 import json
296 import json
294
297
295 content_type = ''
298 content_type = ''
296
299
297 if format == 'text':
300 if format == 'text':
298 content_type = 'text/plain'
301 content_type = 'text/plain'
299 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
302 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
300 content = self.parms_to_text()
303 content = self.parms_to_text()
301
304
302 if format == 'binary':
305 if format == 'binary':
303 content_type = 'application/octet-stream'
306 content_type = 'application/octet-stream'
304 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
307 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
305 content = self.parms_to_binary()
308 content = self.parms_to_binary()
306
309
307 if not content_type:
310 if not content_type:
308 content_type = 'application/json'
311 content_type = 'application/json'
309 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
312 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
310 content = json.dumps(self.parms_to_dict(), indent=2)
313 content = json.dumps(self.parms_to_dict(), indent=2)
311
314
312 fields = {'content_type':content_type,
315 fields = {'content_type':content_type,
313 'filename':filename,
316 'filename':filename,
314 'content':content
317 'content':content
315 }
318 }
316
319
317 return fields
320 return fields
318
321
319 def import_from_file(self, fp):
322 def import_from_file(self, fp):
320
323
321 import os, json
324 import os, json
322
325
323 parms = {}
326 parms = {}
324
327
325 path, ext = os.path.splitext(fp.name)
328 path, ext = os.path.splitext(fp.name)
326
329
327 if ext == '.json':
330 if ext == '.json':
328 parms = json.load(fp)
331 parms = json.load(fp)
329
332
330 return parms
333 return parms
331
334
332 def status_device(self):
335 def status_device(self):
333
336
334 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
337 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
335
338
336 return None
339 return None
337
340
338 def stop_device(self):
341 def stop_device(self):
339
342
340 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
343 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
341
344
342 return None
345 return None
343
346
344 def start_device(self):
347 def start_device(self):
345
348
346 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
349 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
347
350
348 return None
351 return None
349
352
350 def write_device(self, parms):
353 def write_device(self, parms):
351
354
352 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
355 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
353
356
354 return None
357 return None
355
358
356 def read_device(self):
359 def read_device(self):
357
360
358 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
361 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
359
362
360 return None
363 return None
361
364
362 def get_absolute_url(self):
365 def get_absolute_url(self):
363 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
366 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
364
367
365 def get_absolute_url_edit(self):
368 def get_absolute_url_edit(self):
366 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
369 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
367
370
368 def get_absolute_url_import(self):
371 def get_absolute_url_import(self):
369 return reverse('url_import_dev_conf', args=[str(self.id)])
372 return reverse('url_import_dev_conf', args=[str(self.id)])
370
373
371 def get_absolute_url_export(self):
374 def get_absolute_url_export(self):
372 return reverse('url_export_dev_conf', args=[str(self.id)])
375 return reverse('url_export_dev_conf', args=[str(self.id)])
373
376
374 def get_absolute_url_write(self):
377 def get_absolute_url_write(self):
375 return reverse('url_write_dev_conf', args=[str(self.id)])
378 return reverse('url_write_dev_conf', args=[str(self.id)])
376
379
377 def get_absolute_url_read(self):
380 def get_absolute_url_read(self):
378 return reverse('url_read_dev_conf', args=[str(self.id)])
381 return reverse('url_read_dev_conf', args=[str(self.id)])
379
382
380 def get_absolute_url_start(self):
383 def get_absolute_url_start(self):
381 return reverse('url_start_dev_conf', args=[str(self.id)])
384 return reverse('url_start_dev_conf', args=[str(self.id)])
382
385
383 def get_absolute_url_stop(self):
386 def get_absolute_url_stop(self):
384 return reverse('url_stop_dev_conf', args=[str(self.id)])
387 return reverse('url_stop_dev_conf', args=[str(self.id)])
385
388
386 def get_absolute_url_status(self):
389 def get_absolute_url_status(self):
387 return reverse('url_status_dev_conf', args=[str(self.id)]) No newline at end of file
390 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,80 +1,80
1 {% extends "base.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap3 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5 {% block extra-head %}
5 {% block extra-head %}
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
7 {% endblock %}
7 {% endblock %}
8
8
9 {% block exp-active %}active{% endblock %}
9 {% block exp-active %}active{% endblock %}
10
10
11 {% block content-title %}{{title}}{% endblock %}
11 {% block content-title %}{{title}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
13
13
14 {% block content %}
14 {% block content %}
15 <table class="table table-bordered">
15 <table class="table table-bordered">
16 {% for key in experiment_keys %}
16 {% for key in experiment_keys %}
17 <tr><th>{{key|title}}</th><td>{{experiment|attr:key}}</td></tr>
17 <tr><th>{{key|title}}</th><td>{{experiment|attr:key}}</td></tr>
18 {% endfor %}
18 {% endfor %}
19 </table>
19 </table>
20 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_export">Export</button>
20 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_export">Export</button>
21 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit">Edit</button>
21 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit">Edit</button>
22 <br></br>
22 <br></br>
23 <br></br>
23 <br></br>
24
24
25 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
25 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
26
26
27 <div class="panel panel-default">
27 <div class="panel panel-default">
28 <div class="panel-heading" role="tab" id="headingTwo">
28 <div class="panel-heading" role="tab" id="headingTwo">
29 <h4 class="panel-title">
29 <h4 class="panel-title">
30 <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseThree">
30 <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseThree">
31 Device Configurations
31 Device Configurations
32 </a>
32 </a>
33 </h4>
33 </h4>
34 </div>
34 </div>
35 <div id="collapseTwo" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
35 <div id="collapseTwo" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
36 <div class="panel-body">
36 <div class="panel-body">
37 <table class="table table-hover">
37 <table class="table table-hover">
38 <tr>
38 <tr>
39 <th>#</th>
39 <th>#</th>
40 {% for key in configuration_labels %}
40 {% for key in configuration_keys %}
41 <th>{{ key|title }}</th>
41 <th>{{ key|title }}</th>
42 {% endfor%}
42 {% endfor%}
43 </tr>
43 </tr>
44 {% for item in configurations %}
44 {% for item in configurations %}
45 <tr class="clickable-row" data-href="{{item.get_absolute_url}}">
45 <tr class="clickable-row" data-href="{{item.get_absolute_url}}">
46 <td>{{ forloop.counter }}</td>
46 <td>{{ forloop.counter }}</td>
47 {% for key in configuration_keys %}
47 {% for key in configuration_keys %}
48 <td>{{ item|value:key }}</td>
48 <td>{{ item|value:key }}</td>
49 {% endfor %}
49 {% endfor %}
50 </tr>
50 </tr>
51 {% endfor %}
51 {% endfor %}
52 </table>
52 </table>
53 <button class="btn btn-primary pull-right" id="bt_add_conf">{{button}}</button>
53 <button class="btn btn-primary pull-right" id="bt_add_conf">{{button}}</button>
54 </div>
54 </div>
55 </div>
55 </div>
56 </div>
56 </div>
57 </div>
57 </div>
58 {% endblock %}
58 {% endblock %}
59
59
60 {% block sidebar%}
60 {% block sidebar%}
61 {% include "sidebar_devices.html" %}
61 {% include "sidebar_devices.html" %}
62 {% endblock %}
62 {% endblock %}
63
63
64 {% block extra-js%}
64 {% block extra-js%}
65 <script type="text/javascript">
65 <script type="text/javascript">
66
66
67 $(".clickable-row").click(function() {
67 $(".clickable-row").click(function() {
68 document.location = $(this).data("href");
68 document.location = $(this).data("href");
69 });
69 });
70
70
71 $("#bt_edit").click(function() {
71 $("#bt_edit").click(function() {
72 document.location = "{% url 'url_edit_experiment' experiment.id%}";
72 document.location = "{% url 'url_edit_experiment' experiment.id%}";
73 });
73 });
74
74
75 $("#bt_add_conf").click(function() {
75 $("#bt_add_conf").click(function() {
76 document.location = "{% url 'url_add_dev_conf' experiment.id %}";
76 document.location = "{% url 'url_add_dev_conf' experiment.id %}";
77 });
77 });
78
78
79 </script>
79 </script>
80 {% endblock %} No newline at end of file
80 {% endblock %}
@@ -1,59 +1,37
1 {% extends "base.html" %}
1 {% extends "base_edit.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap3 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5 {% block extra-head %}
5 {% block extra-head %}
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
7 {% endblock %}
7 {% endblock %}
8
8
9 {% block exp-active %}active{% endblock %}
10
11 {% block content-title %}{{title}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
13
14 {% block content %}
15 <form class="form" method="post" action="">
16 {% csrf_token %}
17 {% bootstrap_form form layout='horizontal' size='medium' %}
18 <div style="clear: both;"></div>
19 <br>
20 {% if button %}
21 <br>
22 <button type="submit" class="btn btn-primary pull-right">{{button}}</button>
23 {% endif %}
24 </form>
25 {% endblock %}
26
27 {% block sidebar%}
28 {% include "sidebar_devices.html" %}
29 {% endblock %}
30
31 {% block extra-js%}
9 {% block extra-js%}
32 <script src="{% static 'js/moment.min.js' %}"></script>
10 <script src="{% static 'js/moment.min.js' %}"></script>
33 <script src="{% static 'js/bootstrap-datetimepicker.min.js' %}"></script>
11 <script src="{% static 'js/bootstrap-datetimepicker.min.js' %}"></script>
34 <script type="text/javascript">
12 <script type="text/javascript">
35
13
36 $('.input-group.time').datetimepicker({
14 $('.input-group.time').datetimepicker({
37 format: 'HH:mm:ss',
15 format: 'HH:mm:ss',
38 pickDate: false,
16 pickDate: false,
39 pickSeconds: true
17 pickSeconds: true
40 });
18 });
41
19
42 $('#id_create_from').change(function() {
20 $('#id_create_from').change(function() {
43 var url = "{% url 'url_add_experiment' %}";
21 var url = "{% url 'url_add_experiment' %}";
44 if ($(this).val()=="2"){
22 if ($(this).val()=="2"){
45 document.location = url+"?template=0";
23 document.location = url+"?template=0";
46 }else if ($(this).val()=="1"){
24 }else if ($(this).val()=="1"){
47 document.location = url+"?blank=0";
25 document.location = url+"?blank=0";
48 }else{
26 }else{
49 document.location = url;
27 document.location = url;
50 }
28 }
51 });
29 });
52
30
53 $('#id_choose_template').change(function() {
31 $('#id_choose_template').change(function() {
54 var url = "{% url 'url_add_experiment' %}";
32 var url = "{% url 'url_add_experiment' %}";
55 document.location = url+"?template="+$(this).val();
33 document.location = url+"?template="+$(this).val();
56 });
34 });
57
35
58 </script>
36 </script>
59 {% endblock %} No newline at end of file
37 {% endblock %}
@@ -1,36 +1,36
1 from django.template.defaulttags import register
1 from django.template.defaulttags import register
2 from django.utils.safestring import mark_safe
2 from django.utils.safestring import mark_safe
3
3
4 @register.filter
4 @register.filter
5 def attr(instance, key):
5 def attr(instance, key):
6
6
7 display_key = "get_" + key + "_display"
7 display_key = "get_" + key + "_display"
8
8
9 if hasattr(instance, display_key):
9 if hasattr(instance, display_key):
10 return getattr(instance, display_key)()
10 return getattr(instance, display_key)()
11
11
12 if hasattr(instance, key):
12 if hasattr(instance, key):
13 return getattr(instance, key)
13 return getattr(instance, key)
14
14
15 return instance.get(key)
15 return instance.get(key)
16
16
17 @register.filter
17 @register.filter
18 def title(s):
18 def title(s):
19 return s.replace('_', ' ').title()
19 return s.split('__')[-1].replace('_', ' ').title()
20
20
21 @register.filter
21 @register.filter
22 def value(instance, key):
22 def value(instance, key):
23
23
24 item = instance
24 item = instance
25 for my_key in key.split("__"):
25 for my_key in key.split("__"):
26 item = attr(item, my_key)
26 item = attr(item, my_key)
27
27
28 return item
28 return item
29
29
30 @register.simple_tag
30 @register.simple_tag
31 def get_verbose_field_name(instance, field_name):
31 def get_verbose_field_name(instance, field_name):
32 """
32 """
33 Returns verbose_name for a field.
33 Returns verbose_name for a field.
34 """
34 """
35
35
36 return mark_safe(instance._meta.get_field(field_name).verbose_name) No newline at end of file
36 return mark_safe(instance._meta.get_field(field_name).verbose_name)
@@ -1,1042 +1,1065
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 from django.http import HttpResponseRedirect
2 from django.http import HttpResponseRedirect
3 from django.core.urlresolvers import reverse
3 from django.core.urlresolvers import reverse
4 from django.contrib import messages
4 from django.contrib import messages
5 from datetime import datetime
5 from datetime import datetime
6
6
7 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
7 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
8 from .forms import OperationSearchForm
8 from .forms import OperationSearchForm
9 from apps.cgs.forms import CGSConfigurationForm
9 from apps.cgs.forms import CGSConfigurationForm
10 from apps.jars.forms import JARSConfigurationForm
10 from apps.jars.forms import JARSConfigurationForm
11 from apps.usrp.forms import USRPConfigurationForm
11 from apps.usrp.forms import USRPConfigurationForm
12 from apps.abs.forms import ABSConfigurationForm
12 from apps.abs.forms import ABSConfigurationForm
13 from apps.rc.forms import RCConfigurationForm
13 from apps.rc.forms import RCConfigurationForm
14 from apps.dds.forms import DDSConfigurationForm
14 from apps.dds.forms import DDSConfigurationForm
15
15
16 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
16 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment
17 from apps.cgs.models import CGSConfiguration
17 from apps.cgs.models import CGSConfiguration
18 from apps.jars.models import JARSConfiguration
18 from apps.jars.models import JARSConfiguration
19 from apps.usrp.models import USRPConfiguration
19 from apps.usrp.models import USRPConfiguration
20 from apps.abs.models import ABSConfiguration
20 from apps.abs.models import ABSConfiguration
21 from apps.rc.models import RCConfiguration
21 from apps.rc.models import RCConfiguration
22 from apps.dds.models import DDSConfiguration
22 from apps.dds.models import DDSConfiguration
23
23
24 # Create your views here.
24 # Create your views here.
25
25
26 CONF_FORMS = {
26 CONF_FORMS = {
27 'rc': RCConfigurationForm,
27 'rc': RCConfigurationForm,
28 'dds': DDSConfigurationForm,
28 'dds': DDSConfigurationForm,
29 'jars': JARSConfigurationForm,
29 'jars': JARSConfigurationForm,
30 'cgs': CGSConfigurationForm,
30 'cgs': CGSConfigurationForm,
31 'abs': ABSConfigurationForm,
31 'abs': ABSConfigurationForm,
32 'usrp': USRPConfigurationForm,
32 'usrp': USRPConfigurationForm,
33 }
33 }
34
34
35 CONF_MODELS = {
35 CONF_MODELS = {
36 'rc': RCConfiguration,
36 'rc': RCConfiguration,
37 'dds': DDSConfiguration,
37 'dds': DDSConfiguration,
38 'jars': JARSConfiguration,
38 'jars': JARSConfiguration,
39 'cgs': CGSConfiguration,
39 'cgs': CGSConfiguration,
40 'abs': ABSConfiguration,
40 'abs': ABSConfiguration,
41 'usrp': USRPConfiguration,
41 'usrp': USRPConfiguration,
42 }
42 }
43
43
44
44
45 def index(request):
45 def index(request):
46 kwargs = {}
46 kwargs = {}
47
47
48 return render(request, 'index.html', kwargs)
48 return render(request, 'index.html', kwargs)
49
49
50
50
51 def locations(request):
51 def locations(request):
52
52
53 locations = Location.objects.all().order_by('name')
53 locations = Location.objects.all().order_by('name')
54
54
55 keys = ['id', 'name', 'description']
55 keys = ['id', 'name', 'description']
56
56
57 kwargs = {}
57 kwargs = {}
58 kwargs['location_keys'] = keys[1:]
58 kwargs['location_keys'] = keys[1:]
59 kwargs['locations'] = locations
59 kwargs['locations'] = locations
60 kwargs['title'] = 'Location'
60 kwargs['title'] = 'Location'
61 kwargs['suptitle'] = 'List'
61 kwargs['suptitle'] = 'List'
62 kwargs['button'] = 'New Location'
62 kwargs['button'] = 'New Location'
63
63
64 return render(request, 'locations.html', kwargs)
64 return render(request, 'locations.html', kwargs)
65
65
66
66
67 def location(request, id_loc):
67 def location(request, id_loc):
68
68
69 location = get_object_or_404(Location, pk=id_loc)
69 location = get_object_or_404(Location, pk=id_loc)
70
70
71 kwargs = {}
71 kwargs = {}
72 kwargs['location'] = location
72 kwargs['location'] = location
73 kwargs['location_keys'] = ['name', 'description']
73 kwargs['location_keys'] = ['name', 'description']
74
74
75 kwargs['title'] = 'Location'
75 kwargs['title'] = 'Location'
76 kwargs['suptitle'] = 'Details'
76 kwargs['suptitle'] = 'Details'
77
77
78 return render(request, 'location.html', kwargs)
78 return render(request, 'location.html', kwargs)
79
79
80
80
81 def location_new(request):
81 def location_new(request):
82
82
83 if request.method == 'GET':
83 if request.method == 'GET':
84 form = LocationForm()
84 form = LocationForm()
85
85
86 if request.method == 'POST':
86 if request.method == 'POST':
87 form = LocationForm(request.POST)
87 form = LocationForm(request.POST)
88
88
89 if form.is_valid():
89 if form.is_valid():
90 form.save()
90 form.save()
91 return redirect('url_locations')
91 return redirect('url_locations')
92
92
93 kwargs = {}
93 kwargs = {}
94 kwargs['form'] = form
94 kwargs['form'] = form
95 kwargs['title'] = 'Location'
95 kwargs['title'] = 'Location'
96 kwargs['suptitle'] = 'New'
96 kwargs['suptitle'] = 'New'
97 kwargs['button'] = 'Create'
97 kwargs['button'] = 'Create'
98
98
99 return render(request, 'location_edit.html', kwargs)
99 return render(request, 'location_edit.html', kwargs)
100
100
101
101
102 def location_edit(request, id_loc):
102 def location_edit(request, id_loc):
103
103
104 location = get_object_or_404(Location, pk=id_loc)
104 location = get_object_or_404(Location, pk=id_loc)
105
105
106 if request.method=='GET':
106 if request.method=='GET':
107 form = LocationForm(instance=location)
107 form = LocationForm(instance=location)
108
108
109 if request.method=='POST':
109 if request.method=='POST':
110 form = LocationForm(request.POST, instance=location)
110 form = LocationForm(request.POST, instance=location)
111
111
112 if form.is_valid():
112 if form.is_valid():
113 form.save()
113 form.save()
114 return redirect('url_locations')
114 return redirect('url_locations')
115
115
116 kwargs = {}
116 kwargs = {}
117 kwargs['form'] = form
117 kwargs['form'] = form
118 kwargs['title'] = 'Location'
118 kwargs['title'] = 'Location'
119 kwargs['suptitle'] = 'Edit'
119 kwargs['suptitle'] = 'Edit'
120 kwargs['button'] = 'Update'
120 kwargs['button'] = 'Update'
121
121
122 return render(request, 'location_edit.html', kwargs)
122 return render(request, 'location_edit.html', kwargs)
123
123
124
124
125 def location_delete(request, id_loc):
125 def location_delete(request, id_loc):
126
126
127 location = get_object_or_404(Location, pk=id_loc)
127 location = get_object_or_404(Location, pk=id_loc)
128
128
129 if request.method=='POST':
129 if request.method=='POST':
130
130
131 if request.user.is_staff:
131 if request.user.is_staff:
132 location.delete()
132 location.delete()
133 return redirect('url_locations')
133 return redirect('url_locations')
134
134
135 messages.error(request, 'Not enough permission to delete this object')
135 messages.error(request, 'Not enough permission to delete this object')
136 return redirect(location.get_absolute_url())
136 return redirect(location.get_absolute_url())
137
137
138 kwargs = {
138 kwargs = {
139 'title': 'Delete',
139 'title': 'Delete',
140 'suptitle': 'Location',
140 'suptitle': 'Location',
141 'object': location,
141 'object': location,
142 'previous': location.get_absolute_url(),
142 'previous': location.get_absolute_url(),
143 'delete': True
143 'delete': True
144 }
144 }
145
145
146 return render(request, 'confirm.html', kwargs)
146 return render(request, 'confirm.html', kwargs)
147
147
148
148
149 def devices(request):
149 def devices(request):
150
150
151 devices = Device.objects.all().order_by('device_type__name')
151 devices = Device.objects.all().order_by('device_type__name')
152
152
153 # keys = ['id', 'device_type__name', 'name', 'ip_address']
153 # keys = ['id', 'device_type__name', 'name', 'ip_address']
154 keys = ['id', 'name', 'ip_address', 'port_address', 'device_type']
154 keys = ['id', 'name', 'ip_address', 'port_address', 'device_type']
155
155
156 kwargs = {}
156 kwargs = {}
157 kwargs['device_keys'] = keys[1:]
157 kwargs['device_keys'] = keys[1:]
158 kwargs['devices'] = devices#.values(*keys)
158 kwargs['devices'] = devices#.values(*keys)
159 kwargs['title'] = 'Device'
159 kwargs['title'] = 'Device'
160 kwargs['suptitle'] = 'List'
160 kwargs['suptitle'] = 'List'
161 kwargs['button'] = 'New Device'
161 kwargs['button'] = 'New Device'
162
162
163 return render(request, 'devices.html', kwargs)
163 return render(request, 'devices.html', kwargs)
164
164
165
165
166 def device(request, id_dev):
166 def device(request, id_dev):
167
167
168 device = get_object_or_404(Device, pk=id_dev)
168 device = get_object_or_404(Device, pk=id_dev)
169
169
170 kwargs = {}
170 kwargs = {}
171 kwargs['device'] = device
171 kwargs['device'] = device
172 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
172 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
173
173
174 kwargs['title'] = 'Device'
174 kwargs['title'] = 'Device'
175 kwargs['suptitle'] = 'Details'
175 kwargs['suptitle'] = 'Details'
176
176
177 return render(request, 'device.html', kwargs)
177 return render(request, 'device.html', kwargs)
178
178
179
179
180 def device_new(request):
180 def device_new(request):
181
181
182 if request.method == 'GET':
182 if request.method == 'GET':
183 form = DeviceForm()
183 form = DeviceForm()
184
184
185 if request.method == 'POST':
185 if request.method == 'POST':
186 form = DeviceForm(request.POST)
186 form = DeviceForm(request.POST)
187
187
188 if form.is_valid():
188 if form.is_valid():
189 form.save()
189 form.save()
190 return redirect('url_devices')
190 return redirect('url_devices')
191
191
192 kwargs = {}
192 kwargs = {}
193 kwargs['form'] = form
193 kwargs['form'] = form
194 kwargs['title'] = 'Device'
194 kwargs['title'] = 'Device'
195 kwargs['suptitle'] = 'New'
195 kwargs['suptitle'] = 'New'
196 kwargs['button'] = 'Create'
196 kwargs['button'] = 'Create'
197
197
198 return render(request, 'device_edit.html', kwargs)
198 return render(request, 'device_edit.html', kwargs)
199
199
200
200
201 def device_edit(request, id_dev):
201 def device_edit(request, id_dev):
202
202
203 device = get_object_or_404(Device, pk=id_dev)
203 device = get_object_or_404(Device, pk=id_dev)
204
204
205 if request.method=='GET':
205 if request.method=='GET':
206 form = DeviceForm(instance=device)
206 form = DeviceForm(instance=device)
207
207
208 if request.method=='POST':
208 if request.method=='POST':
209 form = DeviceForm(request.POST, instance=device)
209 form = DeviceForm(request.POST, instance=device)
210
210
211 if form.is_valid():
211 if form.is_valid():
212 form.save()
212 form.save()
213 return redirect(device.get_absolute_url())
213 return redirect(device.get_absolute_url())
214
214
215 kwargs = {}
215 kwargs = {}
216 kwargs['form'] = form
216 kwargs['form'] = form
217 kwargs['title'] = 'Device'
217 kwargs['title'] = 'Device'
218 kwargs['suptitle'] = 'Edit'
218 kwargs['suptitle'] = 'Edit'
219 kwargs['button'] = 'Update'
219 kwargs['button'] = 'Update'
220
220
221 return render(request, 'device_edit.html', kwargs)
221 return render(request, 'device_edit.html', kwargs)
222
222
223
223
224 def device_delete(request, id_dev):
224 def device_delete(request, id_dev):
225
225
226 device = get_object_or_404(Device, pk=id_dev)
226 device = get_object_or_404(Device, pk=id_dev)
227
227
228 if request.method=='POST':
228 if request.method=='POST':
229
229
230 if request.user.is_staff:
230 if request.user.is_staff:
231 device.delete()
231 device.delete()
232 return redirect('url_devices')
232 return redirect('url_devices')
233
233
234 messages.error(request, 'Not enough permission to delete this object')
234 messages.error(request, 'Not enough permission to delete this object')
235 return redirect(device.get_absolute_url())
235 return redirect(device.get_absolute_url())
236
236
237 kwargs = {
237 kwargs = {
238 'title': 'Delete',
238 'title': 'Delete',
239 'suptitle': 'Device',
239 'suptitle': 'Device',
240 'object': device,
240 'object': device,
241 'previous': device.get_absolute_url(),
241 'previous': device.get_absolute_url(),
242 'delete': True
242 'delete': True
243 }
243 }
244
244
245 return render(request, 'confirm.html', kwargs)
245 return render(request, 'confirm.html', kwargs)
246
246
247
247
248 def campaigns(request):
248 def campaigns(request):
249
249
250 campaigns = Campaign.objects.all().order_by('start_date')
250 campaigns = Campaign.objects.all().order_by('start_date')
251
251
252 keys = ['id', 'name', 'start_date', 'end_date']
252 keys = ['id', 'name', 'start_date', 'end_date']
253
253
254 kwargs = {}
254 kwargs = {}
255 kwargs['campaign_keys'] = keys[1:]
255 kwargs['campaign_keys'] = keys[1:]
256 kwargs['campaigns'] = campaigns#.values(*keys)
256 kwargs['campaigns'] = campaigns#.values(*keys)
257 kwargs['title'] = 'Campaign'
257 kwargs['title'] = 'Campaign'
258 kwargs['suptitle'] = 'List'
258 kwargs['suptitle'] = 'List'
259 kwargs['button'] = 'New Campaign'
259 kwargs['button'] = 'New Campaign'
260
260
261 return render(request, 'campaigns.html', kwargs)
261 return render(request, 'campaigns.html', kwargs)
262
262
263
263
264 def campaign(request, id_camp):
264 def campaign(request, id_camp):
265
265
266 campaign = get_object_or_404(Campaign, pk=id_camp)
266 campaign = get_object_or_404(Campaign, pk=id_camp)
267 experiments = Experiment.objects.filter(campaign=campaign)
267 experiments = Experiment.objects.filter(campaign=campaign)
268
268
269 form = CampaignForm(instance=campaign)
269 form = CampaignForm(instance=campaign)
270
270
271 kwargs = {}
271 kwargs = {}
272 kwargs['campaign'] = campaign
272 kwargs['campaign'] = campaign
273 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
273 kwargs['campaign_keys'] = ['template', 'name', 'start_date', 'end_date', 'tags', 'description']
274
274
275 kwargs['experiments'] = experiments
275 kwargs['experiments'] = experiments
276 kwargs['experiment_keys'] = ['name', 'radar', 'start_time', 'end_time']
276 kwargs['experiment_keys'] = ['name', 'radar', 'start_time', 'end_time']
277
277
278 kwargs['title'] = 'Campaign'
278 kwargs['title'] = 'Campaign'
279 kwargs['suptitle'] = 'Details'
279 kwargs['suptitle'] = 'Details'
280
280
281 kwargs['form'] = form
281 kwargs['form'] = form
282 kwargs['button'] = 'Add Experiment'
282 kwargs['button'] = 'Add Experiment'
283
283
284 return render(request, 'campaign.html', kwargs)
284 return render(request, 'campaign.html', kwargs)
285
285
286
286
287 def campaign_new(request):
287 def campaign_new(request):
288
288
289 kwargs = {}
289 kwargs = {}
290
290
291 if request.method == 'GET':
291 if request.method == 'GET':
292
292
293 if 'template' in request.GET:
293 if 'template' in request.GET:
294 if request.GET['template']=='0':
294 if request.GET['template']=='0':
295 form = NewForm(initial={'create_from':2},
295 form = NewForm(initial={'create_from':2},
296 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
296 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
297 else:
297 else:
298 kwargs['button'] = 'Create'
298 kwargs['button'] = 'Create'
299 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
299 kwargs['experiments'] = Configuration.objects.filter(experiment=request.GET['template'])
300 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
300 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
301 form = CampaignForm(instance=Campaign.objects.get(pk=request.GET['template']),
301 camp = Campaign.objects.get(pk=request.GET['template'])
302 initial={'template':False})
302 form = CampaignForm(instance=camp,
303 initial={'name':'{} [{:%Y/%m/%d}]'.format(camp.name, datetime.now()),
304 'template':False})
303 elif 'blank' in request.GET:
305 elif 'blank' in request.GET:
304 kwargs['button'] = 'Create'
306 kwargs['button'] = 'Create'
305 form = CampaignForm()
307 form = CampaignForm()
306 else:
308 else:
307 form = NewForm()
309 form = NewForm()
308
310
309 if request.method == 'POST':
311 if request.method == 'POST':
310 kwargs['button'] = 'Create'
312 kwargs['button'] = 'Create'
311 post = request.POST.copy()
313 post = request.POST.copy()
312 experiments = []
314 experiments = []
313
315
314 for id_exp in post.getlist('experiments'):
316 for id_exp in post.getlist('experiments'):
315 exp = Experiment.objects.get(pk=id_exp)
317 exp = Experiment.objects.get(pk=id_exp)
316 new_exp = exp.clone(template=False)
318 new_exp = exp.clone(template=False)
317 experiments.append(new_exp)
319 experiments.append(new_exp)
318
320
319 post.setlist('experiments', [])
321 post.setlist('experiments', [])
320
322
321 form = CampaignForm(post)
323 form = CampaignForm(post)
322
324
323 if form.is_valid():
325 if form.is_valid():
324 campaign = form.save()
326 campaign = form.save()
325 for exp in experiments:
327 for exp in experiments:
326 campaign.experiments.add(exp)
328 campaign.experiments.add(exp)
327 campaign.save()
329 campaign.save()
328 return redirect('url_campaign', id_camp=campaign.id)
330 return redirect('url_campaign', id_camp=campaign.id)
329
331
330 kwargs['form'] = form
332 kwargs['form'] = form
331 kwargs['title'] = 'Campaign'
333 kwargs['title'] = 'Campaign'
332 kwargs['suptitle'] = 'New'
334 kwargs['suptitle'] = 'New'
333
335
334 return render(request, 'campaign_edit.html', kwargs)
336 return render(request, 'campaign_edit.html', kwargs)
335
337
336
338
337 def campaign_edit(request, id_camp):
339 def campaign_edit(request, id_camp):
338
340
339 campaign = get_object_or_404(Campaign, pk=id_camp)
341 campaign = get_object_or_404(Campaign, pk=id_camp)
340
342
341 if request.method=='GET':
343 if request.method=='GET':
342 form = CampaignForm(instance=campaign)
344 form = CampaignForm(instance=campaign)
343
345
344 if request.method=='POST':
346 if request.method=='POST':
345 form = CampaignForm(request.POST, instance=campaign)
347 exps = campaign.experiments.all().values_list('pk', flat=True)
348 post = request.POST.copy()
349 new_exps = post.getlist('experiments')
350 post.setlist('experiments', [])
351 form = CampaignForm(post, instance=campaign)
346
352
347 if form.is_valid():
353 if form.is_valid():
348 form.save()
354 camp = form.save()
355 for id_exp in new_exps:
356 if int(id_exp) in exps:
357 exps.pop(id_exp)
358 else:
359 exp = Experiment.objects.get(pk=id_exp)
360 if exp.template:
361 camp.experiments.add(exp.clone(template=False))
362 else:
363 camp.experiments.add(exp)
364
365 for id_exp in exps:
366 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
367
349 return redirect('url_campaign', id_camp=id_camp)
368 return redirect('url_campaign', id_camp=id_camp)
350
369
351 kwargs = {}
370 kwargs = {}
352 kwargs['form'] = form
371 kwargs['form'] = form
353 kwargs['title'] = 'Campaign'
372 kwargs['title'] = 'Campaign'
354 kwargs['suptitle'] = 'Edit'
373 kwargs['suptitle'] = 'Edit'
355 kwargs['button'] = 'Update'
374 kwargs['button'] = 'Update'
356
375
357 return render(request, 'campaign_edit.html', kwargs)
376 return render(request, 'campaign_edit.html', kwargs)
358
377
359
378
360 def campaign_delete(request, id_camp):
379 def campaign_delete(request, id_camp):
361
380
362 campaign = get_object_or_404(Campaign, pk=id_camp)
381 campaign = get_object_or_404(Campaign, pk=id_camp)
363
382
364 if request.method=='POST':
383 if request.method=='POST':
365 if request.user.is_staff:
384 if request.user.is_staff:
366
385
367 for exp in campaign.experiments.all():
386 for exp in campaign.experiments.all():
368 for conf in Configuration.objects.filter(experiment=exp):
387 for conf in Configuration.objects.filter(experiment=exp):
369 conf.delete()
388 conf.delete()
370 exp.delete()
389 exp.delete()
371 campaign.delete()
390 campaign.delete()
372
391
373 return redirect('url_campaigns')
392 return redirect('url_campaigns')
374
393
375 messages.error(request, 'Not enough permission to delete this object')
394 messages.error(request, 'Not enough permission to delete this object')
376 return redirect(campaign.get_absolute_url())
395 return redirect(campaign.get_absolute_url())
377
396
378 kwargs = {
397 kwargs = {
379 'title': 'Delete',
398 'title': 'Delete',
380 'suptitle': 'Campaign',
399 'suptitle': 'Campaign',
381 'object': campaign,
400 'object': campaign,
382 'previous': campaign.get_absolute_url(),
401 'previous': campaign.get_absolute_url(),
383 'delete': True
402 'delete': True
384 }
403 }
385
404
386 return render(request, 'confirm.html', kwargs)
405 return render(request, 'confirm.html', kwargs)
387
406
388
407
389 def experiments(request):
408 def experiments(request):
390
409
391 experiment_list = Experiment.objects.all()
410 experiment_list = Experiment.objects.all()
392
411
393 keys = ['id', 'name', 'start_time', 'end_time']
412 keys = ['id', 'name', 'start_time', 'end_time']
394
413
395 kwargs = {}
414 kwargs = {}
396
415
397 kwargs['experiment_keys'] = keys[1:]
416 kwargs['experiment_keys'] = keys[1:]
398 kwargs['experiments'] = experiment_list
417 kwargs['experiments'] = experiment_list
399
418
400 kwargs['title'] = 'Experiment'
419 kwargs['title'] = 'Experiment'
401 kwargs['suptitle'] = 'List'
420 kwargs['suptitle'] = 'List'
402 kwargs['button'] = 'New Experiment'
421 kwargs['button'] = 'New Experiment'
403
422
404 return render(request, 'experiments.html', kwargs)
423 return render(request, 'experiments.html', kwargs)
405
424
406
425
407 def experiment(request, id_exp):
426 def experiment(request, id_exp):
408
427
409 experiment = get_object_or_404(Experiment, pk=id_exp)
428 experiment = get_object_or_404(Experiment, pk=id_exp)
410
429
411 configurations = Configuration.objects.filter(experiment=experiment, type=0)
430 configurations = Configuration.objects.filter(experiment=experiment, type=0)
412
431
413 kwargs = {}
432 kwargs = {}
414
433
415 exp_keys = ['id', 'location', 'name', 'start_time', 'end_time']
434 kwargs['experiment_keys'] = ['template', 'radar', 'name', 'start_time', 'end_time']
416 conf_keys = ['id', 'device__name', 'device__device_type', 'device__ip_address', 'device__port_address']
417
418 conf_labels = ['id', 'device__name', 'device_type', 'ip_address', 'port_address']
419
420 kwargs['experiment_keys'] = exp_keys[1:]
421 kwargs['experiment'] = experiment
435 kwargs['experiment'] = experiment
422
436
423 kwargs['configuration_labels'] = conf_labels[1:]
437 kwargs['configuration_keys'] = ['device__name', 'device__device_type', 'device__ip_address', 'device__port_address']
424 kwargs['configuration_keys'] = conf_keys[1:]
438 kwargs['configurations'] = configurations
425 kwargs['configurations'] = configurations #.values(*conf_keys)
426
439
427 kwargs['title'] = 'Experiment'
440 kwargs['title'] = 'Experiment'
428 kwargs['suptitle'] = 'Details'
441 kwargs['suptitle'] = 'Details'
429
442
430 kwargs['button'] = 'Add Configuration'
443 kwargs['button'] = 'Add Configuration'
431
444
432 ###### SIDEBAR ######
445 ###### SIDEBAR ######
433 kwargs.update(sidebar(experiment=experiment))
446 kwargs.update(sidebar(experiment=experiment))
434
447
435 return render(request, 'experiment.html', kwargs)
448 return render(request, 'experiment.html', kwargs)
436
449
437
450
438 def experiment_new(request, id_camp=None):
451 def experiment_new(request, id_camp=None):
439
452
440 kwargs = {}
453 kwargs = {}
441
454
442 if request.method == 'GET':
455 if request.method == 'GET':
443 if 'template' in request.GET:
456 if 'template' in request.GET:
444 if request.GET['template']=='0':
457 if request.GET['template']=='0':
445 form = NewForm(initial={'create_from':2},
458 form = NewForm(initial={'create_from':2},
446 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
459 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
447 else:
460 else:
448 kwargs['button'] = 'Create'
461 kwargs['button'] = 'Create'
449 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
462 kwargs['configurations'] = Configuration.objects.filter(experiment=request.GET['template'])
450 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
463 kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address']
451 form = ExperimentForm(instance=Experiment.objects.get(pk=request.GET['template']),
464 exp=Experiment.objects.get(pk=request.GET['template'])
452 initial={'template':False})
465 form = ExperimentForm(instance=exp,
466 initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()),
467 'template': False})
453 elif 'blank' in request.GET:
468 elif 'blank' in request.GET:
454 kwargs['button'] = 'Create'
469 kwargs['button'] = 'Create'
455 form = ExperimentForm()
470 form = ExperimentForm()
456 else:
471 else:
457 form = NewForm()
472 form = NewForm()
458
473
459 if request.method == 'POST':
474 if request.method == 'POST':
460 form = ExperimentForm(request.POST)
475 form = ExperimentForm(request.POST)
461 if form.is_valid():
476 if form.is_valid():
462 experiment = form.save()
477 experiment = form.save()
463
478
464 if 'template' in request.GET:
479 if 'template' in request.GET:
465 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
480 configurations = Configuration.objects.filter(experiment=request.GET['template'], type=0)
466 for conf in configurations:
481 for conf in configurations:
467 conf.clone(experiment=experiment, template=False)
482 conf.clone(experiment=experiment, template=False)
468
483
469 return redirect('url_experiment', id_exp=experiment.id)
484 return redirect('url_experiment', id_exp=experiment.id)
470
485
471 kwargs['form'] = form
486 kwargs['form'] = form
472 kwargs['title'] = 'Experiment'
487 kwargs['title'] = 'Experiment'
473 kwargs['suptitle'] = 'New'
488 kwargs['suptitle'] = 'New'
474
489
475 return render(request, 'experiment_edit.html', kwargs)
490 return render(request, 'experiment_edit.html', kwargs)
476
491
477
492
478 def experiment_edit(request, id_exp):
493 def experiment_edit(request, id_exp):
479
494
480 experiment = get_object_or_404(Experiment, pk=id_exp)
495 experiment = get_object_or_404(Experiment, pk=id_exp)
481
496
482 if request.method == 'GET':
497 if request.method == 'GET':
483 form = ExperimentForm(instance=experiment)
498 form = ExperimentForm(instance=experiment)
484
499
485 if request.method=='POST':
500 if request.method=='POST':
486 form = ExperimentForm(request.POST, instance=experiment)
501 form = ExperimentForm(request.POST, instance=experiment)
487
502
488 if form.is_valid():
503 if form.is_valid():
489 experiment = form.save()
504 experiment = form.save()
490 return redirect('url_experiment', id_exp=experiment.id)
505 return redirect('url_experiment', id_exp=experiment.id)
491
506
492 kwargs = {}
507 kwargs = {}
493 kwargs['form'] = form
508 kwargs['form'] = form
494 kwargs['title'] = 'Experiment'
509 kwargs['title'] = 'Experiment'
495 kwargs['suptitle'] = 'Edit'
510 kwargs['suptitle'] = 'Edit'
496 kwargs['button'] = 'Update'
511 kwargs['button'] = 'Update'
497
512
498 return render(request, 'experiment_edit.html', kwargs)
513 return render(request, 'experiment_edit.html', kwargs)
499
514
500
515
501 def experiment_delete(request, id_exp):
516 def experiment_delete(request, id_exp):
502
517
503 experiment = get_object_or_404(Experiment, pk=id_exp)
518 experiment = get_object_or_404(Experiment, pk=id_exp)
504
519
505 if request.method=='POST':
520 if request.method=='POST':
506 if request.user.is_staff:
521 if request.user.is_staff:
522 for conf in Configuration.objects.filter(experiment=experiment):
523 conf.delete()
507 experiment.delete()
524 experiment.delete()
508 return redirect('url_experiments')
525 return redirect('url_experiments')
509
526
510 return HttpResponse("Not enough permission to delete this object")
527 messages.error(request, 'Not enough permission to delete this object')
528 return redirect(experiment.get_absolute_url())
511
529
512 kwargs = {'object':experiment, 'exp_active':'active',
530 kwargs = {
513 'url_cancel':'url_experiment', 'id_item':id_exp}
531 'title': 'Delete',
532 'suptitle': 'Experiment',
533 'object': experiment,
534 'previous': experiment.get_absolute_url(),
535 'delete': True
536 }
514
537
515 return render(request, 'item_delete.html', kwargs)
538 return render(request, 'confirm.html', kwargs)
516
539
517
540
518 def dev_confs(request):
541 def dev_confs(request):
519
542
520 configurations = Configuration.objects.all().order_by('type', 'device__device_type', 'experiment')
543 configurations = Configuration.objects.all().order_by('type', 'device__device_type', 'experiment')
521
522 # keys = ['id', 'device__device_type__name', 'device__name', 'experiment__campaign__name', 'experiment__name']
523
524 keys = ['id', 'device', 'experiment', 'type', 'programmed_date']
525
544
526 kwargs = {}
545 kwargs = {}
527
546
528 kwargs['configuration_keys'] = keys[1:]
547 kwargs['configuration_keys'] = ['device', 'experiment', 'type', 'programmed_date']
529 kwargs['configurations'] = configurations#.values(*keys)
548 kwargs['configurations'] = configurations
530
549
531 kwargs['title'] = 'Configuration'
550 kwargs['title'] = 'Configuration'
532 kwargs['suptitle'] = 'List'
551 kwargs['suptitle'] = 'List'
533 kwargs['button'] = 'New Configuration'
534
552
535 return render(request, 'dev_confs.html', kwargs)
553 return render(request, 'dev_confs.html', kwargs)
536
554
537
555
538 def dev_conf(request, id_conf):
556 def dev_conf(request, id_conf):
539
557
540 conf = get_object_or_404(Configuration, pk=id_conf)
558 conf = get_object_or_404(Configuration, pk=id_conf)
541
559
542 return redirect(conf.get_absolute_url())
560 return redirect(conf.get_absolute_url())
543
561
544
562
545 def dev_conf_new(request, id_exp=0, id_dev=0):
563 def dev_conf_new(request, id_exp=0, id_dev=0):
546
564
547 initial = {}
565 initial = {}
548
566
549 if id_exp<>0:
567 if id_exp<>0:
550 initial['experiment'] = id_exp
568 initial['experiment'] = id_exp
551
569
552 if id_dev<>0:
570 if id_dev<>0:
553 initial['device'] = id_dev
571 initial['device'] = id_dev
554
572
555 if request.method == 'GET':
573 if request.method == 'GET':
556 if id_dev==0:
574 if id_dev==0:
557 form = ConfigurationForm(initial=initial)
575 form = ConfigurationForm(initial=initial)
558 else:
576 else:
559 device = Device.objects.get(pk=id_dev)
577 device = Device.objects.get(pk=id_dev)
560 DevConfForm = CONF_FORMS[device.device_type.name]
578 DevConfForm = CONF_FORMS[device.device_type.name]
561
579
562 form = DevConfForm(initial=initial)
580 form = DevConfForm(initial=initial)
563
581
564 if request.method == 'POST':
582 if request.method == 'POST':
565
583
566 device = Device.objects.get(pk=request.POST['device'])
584 device = Device.objects.get(pk=request.POST['device'])
567 DevConfForm = CONF_FORMS[device.device_type.name]
585 DevConfForm = CONF_FORMS[device.device_type.name]
568
586
569 form = DevConfForm(request.POST)
587 form = DevConfForm(request.POST)
570
588
571 if form.is_valid():
589 if form.is_valid():
572 dev_conf = form.save()
590 dev_conf = form.save()
573
591
574 return redirect('url_dev_confs')
592 return redirect('url_dev_confs')
575
593
576 kwargs = {}
594 kwargs = {}
577 kwargs['id_exp'] = id_exp
595 kwargs['id_exp'] = id_exp
578 kwargs['form'] = form
596 kwargs['form'] = form
579 kwargs['title'] = 'Configuration'
597 kwargs['title'] = 'Configuration'
580 kwargs['suptitle'] = 'New'
598 kwargs['suptitle'] = 'New'
581 kwargs['button'] = 'Create'
599 kwargs['button'] = 'Create'
582
600
583 return render(request, 'dev_conf_edit.html', kwargs)
601 return render(request, 'dev_conf_edit.html', kwargs)
584
602
585
603
586 def dev_conf_edit(request, id_conf):
604 def dev_conf_edit(request, id_conf):
587
605
588 conf = get_object_or_404(Configuration, pk=id_conf)
606 conf = get_object_or_404(Configuration, pk=id_conf)
589
607
590 DevConfModel = CONF_MODELS[conf.device.device_type.name]
608 DevConfModel = CONF_MODELS[conf.device.device_type.name]
591 DevConfForm = CONF_FORMS[conf.device.device_type.name]
609 DevConfForm = CONF_FORMS[conf.device.device_type.name]
592
610
593 dev_conf = DevConfModel.objects.get(pk=id_conf)
611 dev_conf = DevConfModel.objects.get(pk=id_conf)
594
612
595 if request.method=='GET':
613 if request.method=='GET':
596 form = DevConfForm(instance=dev_conf)
614 form = DevConfForm(instance=dev_conf)
597
615
598 if request.method=='POST':
616 if request.method=='POST':
599 form = DevConfForm(request.POST, instance=dev_conf)
617 form = DevConfForm(request.POST, instance=dev_conf)
600
618
601 if form.is_valid():
619 if form.is_valid():
602 form.save()
620 form.save()
603 return redirect('url_dev_conf', id_conf=id_conf)
621 return redirect('url_dev_conf', id_conf=id_conf)
604
622
605 kwargs = {}
623 kwargs = {}
606 kwargs['form'] = form
624 kwargs['form'] = form
607 kwargs['title'] = 'Device Configuration'
625 kwargs['title'] = 'Device Configuration'
608 kwargs['suptitle'] = 'Edit'
626 kwargs['suptitle'] = 'Edit'
609 kwargs['button'] = 'Update'
627 kwargs['button'] = 'Update'
610
628
611 ###### SIDEBAR ######
629 ###### SIDEBAR ######
612 kwargs.update(sidebar(conf=conf))
630 kwargs.update(sidebar(conf=conf))
613
631
614 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
632 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
615
633
616
634
617 def dev_conf_start(request, id_conf):
635 def dev_conf_start(request, id_conf):
618
636
619 conf = get_object_or_404(Configuration, pk=id_conf)
637 conf = get_object_or_404(Configuration, pk=id_conf)
620
638
621 DevConfModel = CONF_MODELS[conf.device.device_type.name]
639 DevConfModel = CONF_MODELS[conf.device.device_type.name]
622
640
623 conf = DevConfModel.objects.get(pk=id_conf)
641 conf = DevConfModel.objects.get(pk=id_conf)
624
642
625 if conf.start_device():
643 if conf.start_device():
626 messages.success(request, conf.message)
644 messages.success(request, conf.message)
627 else:
645 else:
628 messages.error(request, conf.message)
646 messages.error(request, conf.message)
629
647
630 conf.status_device()
648 conf.status_device()
631
649
632 return redirect(conf.get_absolute_url())
650 return redirect(conf.get_absolute_url())
633
651
634
652
635 def dev_conf_stop(request, id_conf):
653 def dev_conf_stop(request, id_conf):
636
654
637 conf = get_object_or_404(Configuration, pk=id_conf)
655 conf = get_object_or_404(Configuration, pk=id_conf)
638
656
639 DevConfModel = CONF_MODELS[conf.device.device_type.name]
657 DevConfModel = CONF_MODELS[conf.device.device_type.name]
640
658
641 conf = DevConfModel.objects.get(pk=id_conf)
659 conf = DevConfModel.objects.get(pk=id_conf)
642
660
643 if conf.stop_device():
661 if conf.stop_device():
644 messages.success(request, conf.message)
662 messages.success(request, conf.message)
645 else:
663 else:
646 messages.error(request, conf.message)
664 messages.error(request, conf.message)
647
665
648 conf.status_device()
666 conf.status_device()
649
667
650 return redirect(conf.get_absolute_url())
668 return redirect(conf.get_absolute_url())
651
669
652
670
653 def dev_conf_status(request, id_conf):
671 def dev_conf_status(request, id_conf):
654
672
655 conf = get_object_or_404(Configuration, pk=id_conf)
673 conf = get_object_or_404(Configuration, pk=id_conf)
656
674
657 DevConfModel = CONF_MODELS[conf.device.device_type.name]
675 DevConfModel = CONF_MODELS[conf.device.device_type.name]
658
676
659 conf = DevConfModel.objects.get(pk=id_conf)
677 conf = DevConfModel.objects.get(pk=id_conf)
660
678
661 if conf.status_device():
679 if conf.status_device():
662 messages.success(request, conf.message)
680 messages.success(request, conf.message)
663 else:
681 else:
664 messages.error(request, conf.message)
682 messages.error(request, conf.message)
665
683
666 return redirect(conf.get_absolute_url())
684 return redirect(conf.get_absolute_url())
667
685
668
686
669 def dev_conf_write(request, id_conf):
687 def dev_conf_write(request, id_conf):
670
688
671 conf = get_object_or_404(Configuration, pk=id_conf)
689 conf = get_object_or_404(Configuration, pk=id_conf)
672
690
673 DevConfModel = CONF_MODELS[conf.device.device_type.name]
691 DevConfModel = CONF_MODELS[conf.device.device_type.name]
674
692
675 conf = DevConfModel.objects.get(pk=id_conf)
693 conf = DevConfModel.objects.get(pk=id_conf)
676
694
677 answer = conf.write_device()
695 answer = conf.write_device()
678 conf.status_device()
696 conf.status_device()
679
697
680 if answer:
698 if answer:
681 messages.success(request, conf.message)
699 messages.success(request, conf.message)
682
700
683 #Creating a historical configuration
701 #Creating a historical configuration
684 conf.clone(type=0, template=False)
702 conf.clone(type=0, template=False)
685
703
686 #Original configuration
704 #Original configuration
687 conf = DevConfModel.objects.get(pk=id_conf)
705 conf = DevConfModel.objects.get(pk=id_conf)
688 else:
706 else:
689 messages.error(request, conf.message)
707 messages.error(request, conf.message)
690
708
691 return redirect(conf.get_absolute_url())
709 return redirect(conf.get_absolute_url())
692
710
693
711
694 def dev_conf_read(request, id_conf):
712 def dev_conf_read(request, id_conf):
695
713
696 conf = get_object_or_404(Configuration, pk=id_conf)
714 conf = get_object_or_404(Configuration, pk=id_conf)
697
715
698 DevConfModel = CONF_MODELS[conf.device.device_type.name]
716 DevConfModel = CONF_MODELS[conf.device.device_type.name]
699 DevConfForm = CONF_FORMS[conf.device.device_type.name]
717 DevConfForm = CONF_FORMS[conf.device.device_type.name]
700
718
701 conf = DevConfModel.objects.get(pk=id_conf)
719 conf = DevConfModel.objects.get(pk=id_conf)
702
720
703 if request.method=='GET':
721 if request.method=='GET':
704
722
705 parms = conf.read_device()
723 parms = conf.read_device()
706 conf.status_device()
724 conf.status_device()
707
725
708 if not parms:
726 if not parms:
709 messages.error(request, conf.message)
727 messages.error(request, conf.message)
710 return redirect(conf.get_absolute_url())
728 return redirect(conf.get_absolute_url())
711
729
712 form = DevConfForm(initial=parms, instance=conf)
730 form = DevConfForm(initial=parms, instance=conf)
713
731
714 if request.method=='POST':
732 if request.method=='POST':
715 form = DevConfForm(request.POST, instance=conf)
733 form = DevConfForm(request.POST, instance=conf)
716
734
717 if form.is_valid():
735 if form.is_valid():
718 form.save()
736 form.save()
719 return redirect(conf.get_absolute_url())
737 return redirect(conf.get_absolute_url())
720
738
721 messages.error(request, "Parameters could not be saved")
739 messages.error(request, "Parameters could not be saved")
722
740
723 kwargs = {}
741 kwargs = {}
724 kwargs['id_dev'] = conf.id
742 kwargs['id_dev'] = conf.id
725 kwargs['form'] = form
743 kwargs['form'] = form
726 kwargs['title'] = 'Device Configuration'
744 kwargs['title'] = 'Device Configuration'
727 kwargs['suptitle'] = 'Parameters read from device'
745 kwargs['suptitle'] = 'Parameters read from device'
728 kwargs['button'] = 'Save'
746 kwargs['button'] = 'Save'
729
747
730 ###### SIDEBAR ######
748 ###### SIDEBAR ######
731 kwargs.update(sidebar(conf=conf))
749 kwargs.update(sidebar(conf=conf))
732
750
733 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
751 return render(request, '%s_conf_edit.html' %conf.device.device_type.name, kwargs)
734
752
735
753
736 def dev_conf_import(request, id_conf):
754 def dev_conf_import(request, id_conf):
737
755
738 conf = get_object_or_404(Configuration, pk=id_conf)
756 conf = get_object_or_404(Configuration, pk=id_conf)
739
757
740 DevConfModel = CONF_MODELS[conf.device.device_type.name]
758 DevConfModel = CONF_MODELS[conf.device.device_type.name]
741 DevConfForm = CONF_FORMS[conf.device.device_type.name]
759 DevConfForm = CONF_FORMS[conf.device.device_type.name]
742 conf = DevConfModel.objects.get(pk=id_conf)
760 conf = DevConfModel.objects.get(pk=id_conf)
743
761
744 if request.method == 'GET':
762 if request.method == 'GET':
745 file_form = UploadFileForm()
763 file_form = UploadFileForm()
746
764
747 if request.method == 'POST':
765 if request.method == 'POST':
748 file_form = UploadFileForm(request.POST, request.FILES)
766 file_form = UploadFileForm(request.POST, request.FILES)
749
767
750 if file_form.is_valid():
768 if file_form.is_valid():
751
769
752 parms = conf.import_from_file(request.FILES['file'])
770 parms = conf.import_from_file(request.FILES['file'])
753
771
754 if parms:
772 if parms:
755 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
773 messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name)
756 form = DevConfForm(initial=parms, instance=conf)
774 form = DevConfForm(initial=parms, instance=conf)
757
775
758 kwargs = {}
776 kwargs = {}
759 kwargs['id_dev'] = conf.id
777 kwargs['id_dev'] = conf.id
760 kwargs['form'] = form
778 kwargs['form'] = form
761 kwargs['title'] = 'Device Configuration'
779 kwargs['title'] = 'Device Configuration'
762 kwargs['suptitle'] = 'Parameters imported'
780 kwargs['suptitle'] = 'Parameters imported'
763 kwargs['button'] = 'Save'
781 kwargs['button'] = 'Save'
764 kwargs['action'] = conf.get_absolute_url_edit()
782 kwargs['action'] = conf.get_absolute_url_edit()
765 kwargs['previous'] = conf.get_absolute_url()
783 kwargs['previous'] = conf.get_absolute_url()
766
784
767 ###### SIDEBAR ######
785 ###### SIDEBAR ######
768 kwargs.update(sidebar(conf=conf))
786 kwargs.update(sidebar(conf=conf))
769
787
770 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
788 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
771
789
772 messages.error(request, "Could not import parameters from file")
790 messages.error(request, "Could not import parameters from file")
773
791
774 kwargs = {}
792 kwargs = {}
775 kwargs['id_dev'] = conf.id
793 kwargs['id_dev'] = conf.id
776 kwargs['title'] = 'Device Configuration'
794 kwargs['title'] = 'Device Configuration'
777 kwargs['form'] = file_form
795 kwargs['form'] = file_form
778 kwargs['suptitle'] = 'Importing file'
796 kwargs['suptitle'] = 'Importing file'
779 kwargs['button'] = 'Import'
797 kwargs['button'] = 'Import'
780
798
781 kwargs.update(sidebar(conf=conf))
799 kwargs.update(sidebar(conf=conf))
782
800
783 return render(request, 'dev_conf_import.html', kwargs)
801 return render(request, 'dev_conf_import.html', kwargs)
784
802
785
803
786 def dev_conf_export(request, id_conf):
804 def dev_conf_export(request, id_conf):
787
805
788 conf = get_object_or_404(Configuration, pk=id_conf)
806 conf = get_object_or_404(Configuration, pk=id_conf)
789
807
790 DevConfModel = CONF_MODELS[conf.device.device_type.name]
808 DevConfModel = CONF_MODELS[conf.device.device_type.name]
791
809
792 conf = DevConfModel.objects.get(pk=id_conf)
810 conf = DevConfModel.objects.get(pk=id_conf)
793
811
794 if request.method == 'GET':
812 if request.method == 'GET':
795 file_form = DownloadFileForm(conf.device.device_type.name)
813 file_form = DownloadFileForm(conf.device.device_type.name)
796
814
797 if request.method == 'POST':
815 if request.method == 'POST':
798 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
816 file_form = DownloadFileForm(conf.device.device_type.name, request.POST)
799
817
800 if file_form.is_valid():
818 if file_form.is_valid():
801 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
819 fields = conf.export_to_file(format = file_form.cleaned_data['format'])
802
820
803 response = HttpResponse(content_type=fields['content_type'])
821 response = HttpResponse(content_type=fields['content_type'])
804 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
822 response['Content-Disposition'] = 'attachment; filename="%s"' %fields['filename']
805 response.write(fields['content'])
823 response.write(fields['content'])
806
824
807 return response
825 return response
808
826
809 messages.error(request, "Could not export parameters")
827 messages.error(request, "Could not export parameters")
810
828
811 kwargs = {}
829 kwargs = {}
812 kwargs['id_dev'] = conf.id
830 kwargs['id_dev'] = conf.id
813 kwargs['title'] = 'Device Configuration'
831 kwargs['title'] = 'Device Configuration'
814 kwargs['form'] = file_form
832 kwargs['form'] = file_form
815 kwargs['suptitle'] = 'Exporting file'
833 kwargs['suptitle'] = 'Exporting file'
816 kwargs['button'] = 'Export'
834 kwargs['button'] = 'Export'
817
835
818 return render(request, 'dev_conf_export.html', kwargs)
836 return render(request, 'dev_conf_export.html', kwargs)
819
837
820
838
821 def dev_conf_delete(request, id_conf):
839 def dev_conf_delete(request, id_conf):
822
840
823 conf = get_object_or_404(Configuration, pk=id_conf)
841 conf = get_object_or_404(Configuration, pk=id_conf)
824
842
825 if request.method=='POST':
843 if request.method=='POST':
826 if request.user.is_staff:
844 if request.user.is_staff:
827 id_exp = conf.experiment.id
828 conf.delete()
845 conf.delete()
829 return redirect('url_experiment', id_exp=id_exp)
846 return redirect('url_dev_confs')
830
847
831 return HttpResponse("Not enough permission to delete this object")
848 messages.error(request, 'Not enough permission to delete this object')
849 return redirect(conf.get_absolute_url())
832
850
833 kwargs = {'object':conf, 'conf_active':'active',
851 kwargs = {
834 'url_cancel':'url_dev_conf', 'id_item':id_conf}
852 'title': 'Delete',
853 'suptitle': 'Experiment',
854 'object': conf,
855 'previous': conf.get_absolute_url(),
856 'delete': True
857 }
835
858
836 return render(request, 'item_delete.html', kwargs)
859 return render(request, 'confirm.html', kwargs)
837
860
838
861
839 def sidebar(**kwargs):
862 def sidebar(**kwargs):
840
863
841 side_data = {}
864 side_data = {}
842
865
843 conf = kwargs.get('conf', None)
866 conf = kwargs.get('conf', None)
844 experiment = kwargs.get('experiment', None)
867 experiment = kwargs.get('experiment', None)
845
868
846 if not experiment:
869 if not experiment:
847 experiment = conf.experiment
870 experiment = conf.experiment
848
871
849 if experiment:
872 if experiment:
850 side_data['experiment'] = experiment
873 side_data['experiment'] = experiment
851 campaign = experiment.campaign_set.all()
874 campaign = experiment.campaign_set.all()
852 if campaign:
875 if campaign:
853 side_data['campaign'] = campaign[0]
876 side_data['campaign'] = campaign[0]
854 experiments = campaign[0].experiments.all()
877 experiments = campaign[0].experiments.all()
855 else:
878 else:
856 experiments = [experiment]
879 experiments = [experiment]
857 configurations = experiment.configuration_set.filter(type=0)
880 configurations = experiment.configuration_set.filter(type=0)
858 side_data['side_experiments'] = experiments
881 side_data['side_experiments'] = experiments
859 side_data['side_configurations'] = configurations
882 side_data['side_configurations'] = configurations
860
883
861 return side_data
884 return side_data
862
885
863
886
864 def operation(request, id_camp=None):
887 def operation(request, id_camp=None):
865
888
866 if not id_camp:
889 if not id_camp:
867 campaigns = Campaign.objects.all().order_by('-start_date')
890 campaigns = Campaign.objects.all().order_by('-start_date')
868
891
869 if not campaigns:
892 if not campaigns:
870 kwargs = {}
893 kwargs = {}
871 kwargs['title'] = 'No Campaigns'
894 kwargs['title'] = 'No Campaigns'
872 kwargs['suptitle'] = 'Empty'
895 kwargs['suptitle'] = 'Empty'
873 return render(request, 'operation.html', kwargs)
896 return render(request, 'operation.html', kwargs)
874
897
875 id_camp = campaigns[0].id
898 id_camp = campaigns[0].id
876
899
877 campaign = get_object_or_404(Campaign, pk = id_camp)
900 campaign = get_object_or_404(Campaign, pk = id_camp)
878
901
879 if request.method=='GET':
902 if request.method=='GET':
880 form = OperationForm(initial={'campaign': campaign.id}, length = 5)
903 form = OperationForm(initial={'campaign': campaign.id}, length = 5)
881
904
882 if request.method=='POST':
905 if request.method=='POST':
883 form = OperationForm(request.POST, initial={'campaign':campaign.id}, length = 5)
906 form = OperationForm(request.POST, initial={'campaign':campaign.id}, length = 5)
884
907
885 if form.is_valid():
908 if form.is_valid():
886 return redirect('url_operation', id_camp=campaign.id)
909 return redirect('url_operation', id_camp=campaign.id)
887 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
910 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
888 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
911 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
889 #for exs in experiments:
912 #for exs in experiments:
890 # exs.get_status()
913 # exs.get_status()
891 locations= Location.objects.filter(experiment=experiments).distinct()
914 locations= Location.objects.filter(experiment=experiments).distinct()
892 #experiments = [Experiment.objects.filter(location__pk=location.id).filter(campaign__pk=campaign.id) for location in locations]
915 #experiments = [Experiment.objects.filter(location__pk=location.id).filter(campaign__pk=campaign.id) for location in locations]
893 kwargs = {}
916 kwargs = {}
894 #---Campaign
917 #---Campaign
895 kwargs['campaign'] = campaign
918 kwargs['campaign'] = campaign
896 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
919 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
897 #---Experiment
920 #---Experiment
898 keys = ['id', 'name', 'start_time', 'end_time', 'status']
921 keys = ['id', 'name', 'start_time', 'end_time', 'status']
899 kwargs['experiment_keys'] = keys[1:]
922 kwargs['experiment_keys'] = keys[1:]
900 kwargs['experiments'] = experiments
923 kwargs['experiments'] = experiments
901 #---Radar
924 #---Radar
902 kwargs['locations'] = locations
925 kwargs['locations'] = locations
903 #---Else
926 #---Else
904 kwargs['title'] = 'Campaign'
927 kwargs['title'] = 'Campaign'
905 kwargs['suptitle'] = campaign.name
928 kwargs['suptitle'] = campaign.name
906 kwargs['form'] = form
929 kwargs['form'] = form
907 kwargs['button'] = 'Search'
930 kwargs['button'] = 'Search'
908 kwargs['details'] = True
931 kwargs['details'] = True
909 kwargs['search_button'] = True
932 kwargs['search_button'] = True
910
933
911 return render(request, 'operation.html', kwargs)
934 return render(request, 'operation.html', kwargs)
912
935
913
936
914 def operation_search(request, id_camp=None):
937 def operation_search(request, id_camp=None):
915
938
916
939
917 if not id_camp:
940 if not id_camp:
918 campaigns = Campaign.objects.all().order_by('-start_date')
941 campaigns = Campaign.objects.all().order_by('-start_date')
919
942
920 if not campaigns:
943 if not campaigns:
921 return render(request, 'operation.html', {})
944 return render(request, 'operation.html', {})
922
945
923 id_camp = campaigns[0].id
946 id_camp = campaigns[0].id
924 campaign = get_object_or_404(Campaign, pk = id_camp)
947 campaign = get_object_or_404(Campaign, pk = id_camp)
925
948
926 if request.method=='GET':
949 if request.method=='GET':
927 form = OperationSearchForm(initial={'campaign': campaign.id})
950 form = OperationSearchForm(initial={'campaign': campaign.id})
928
951
929 if request.method=='POST':
952 if request.method=='POST':
930 form = OperationSearchForm(request.POST, initial={'campaign':campaign.id})
953 form = OperationSearchForm(request.POST, initial={'campaign':campaign.id})
931
954
932 if form.is_valid():
955 if form.is_valid():
933 return redirect('url_operation', id_camp=campaign.id)
956 return redirect('url_operation', id_camp=campaign.id)
934
957
935 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
958 #locations = Location.objects.filter(experiment__campaign__pk = campaign.id).distinct()
936 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
959 experiments = Experiment.objects.filter(campaign__pk=campaign.id)
937 #for exs in experiments:
960 #for exs in experiments:
938 # exs.get_status()
961 # exs.get_status()
939 locations= Location.objects.filter(experiment=experiments).distinct()
962 locations= Location.objects.filter(experiment=experiments).distinct()
940 form = OperationSearchForm(initial={'campaign': campaign.id})
963 form = OperationSearchForm(initial={'campaign': campaign.id})
941
964
942 kwargs = {}
965 kwargs = {}
943 #---Campaign
966 #---Campaign
944 kwargs['campaign'] = campaign
967 kwargs['campaign'] = campaign
945 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
968 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
946 #---Experiment
969 #---Experiment
947 keys = ['id', 'name', 'start_time', 'end_time', 'status']
970 keys = ['id', 'name', 'start_time', 'end_time', 'status']
948 kwargs['experiment_keys'] = keys[1:]
971 kwargs['experiment_keys'] = keys[1:]
949 kwargs['experiments'] = experiments
972 kwargs['experiments'] = experiments
950 #---Radar
973 #---Radar
951 kwargs['locations'] = locations
974 kwargs['locations'] = locations
952 #---Else
975 #---Else
953 kwargs['title'] = 'Campaign'
976 kwargs['title'] = 'Campaign'
954 kwargs['suptitle'] = campaign.name
977 kwargs['suptitle'] = campaign.name
955 kwargs['form'] = form
978 kwargs['form'] = form
956 kwargs['button'] = 'Select'
979 kwargs['button'] = 'Select'
957 kwargs['details'] = True
980 kwargs['details'] = True
958 kwargs['search_button'] = False
981 kwargs['search_button'] = False
959
982
960 return render(request, 'operation.html', kwargs)
983 return render(request, 'operation.html', kwargs)
961
984
962
985
963 def radar_play(request, id_camp, id_radar):
986 def radar_play(request, id_camp, id_radar):
964 campaign = get_object_or_404(Campaign, pk = id_camp)
987 campaign = get_object_or_404(Campaign, pk = id_camp)
965 radar = get_object_or_404(Location, pk = id_radar)
988 radar = get_object_or_404(Location, pk = id_radar)
966 today = datetime.today()
989 today = datetime.today()
967 now = today.time()
990 now = today.time()
968
991
969 #--If campaign datetime is ok:
992 #--If campaign datetime is ok:
970 if today >= campaign.start_date and today <= campaign.end_date:
993 if today >= campaign.start_date and today <= campaign.end_date:
971 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
994 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
972 for exp in experiments:
995 for exp in experiments:
973 #--If experiment time is ok:
996 #--If experiment time is ok:
974 if now >= exp.start_time and now <= exp.end_time:
997 if now >= exp.start_time and now <= exp.end_time:
975 configurations = Configuration.objects.filter(experiment = exp)
998 configurations = Configuration.objects.filter(experiment = exp)
976 for conf in configurations:
999 for conf in configurations:
977 if 'cgs' in conf.device.device_type.name:
1000 if 'cgs' in conf.device.device_type.name:
978 conf.status_device()
1001 conf.status_device()
979 else:
1002 else:
980 answer = conf.start_device()
1003 answer = conf.start_device()
981 conf.status_device()
1004 conf.status_device()
982 #--Running Experiment
1005 #--Running Experiment
983 r_e = RunningExperiment.objects.filter(radar=radar)
1006 r_e = RunningExperiment.objects.filter(radar=radar)
984 #--If RunningExperiment element exists
1007 #--If RunningExperiment element exists
985 if r_e:
1008 if r_e:
986 r_e = r_e[0]
1009 r_e = r_e[0]
987 r_e.running_experiment = exp
1010 r_e.running_experiment = exp
988 r_e.status = 3
1011 r_e.status = 3
989 r_e.save()
1012 r_e.save()
990 else:
1013 else:
991 running_experiment = RunningExperiment(
1014 running_experiment = RunningExperiment(
992 radar = radar,
1015 radar = radar,
993 running_experiment = exp,
1016 running_experiment = exp,
994 status = 3,
1017 status = 3,
995 )
1018 )
996 running_experiment.save()
1019 running_experiment.save()
997
1020
998 if answer:
1021 if answer:
999 messages.success(request, conf.message)
1022 messages.success(request, conf.message)
1000 exp.status=2
1023 exp.status=2
1001 exp.save()
1024 exp.save()
1002 else:
1025 else:
1003 messages.error(request, conf.message)
1026 messages.error(request, conf.message)
1004 else:
1027 else:
1005 if exp.status == 1 or exp.status == 3:
1028 if exp.status == 1 or exp.status == 3:
1006 exp.status=3
1029 exp.status=3
1007 exp.save()
1030 exp.save()
1008
1031
1009
1032
1010 route = request.META['HTTP_REFERER']
1033 route = request.META['HTTP_REFERER']
1011 route = str(route)
1034 route = str(route)
1012 if 'search' in route:
1035 if 'search' in route:
1013 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1036 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1014 else:
1037 else:
1015 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1038 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1016
1039
1017
1040
1018 def radar_stop(request, id_camp, id_radar):
1041 def radar_stop(request, id_camp, id_radar):
1019
1042
1020 route = request.META['HTTP_REFERER']
1043 route = request.META['HTTP_REFERER']
1021 route = str(route)
1044 route = str(route)
1022 if 'search' in route:
1045 if 'search' in route:
1023 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1046 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1024 else:
1047 else:
1025 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1048 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1026
1049
1027
1050
1028 def radar_refresh(request, id_camp, id_radar):
1051 def radar_refresh(request, id_camp, id_radar):
1029
1052
1030 campaign = get_object_or_404(Campaign, pk = id_camp)
1053 campaign = get_object_or_404(Campaign, pk = id_camp)
1031 radar = get_object_or_404(Location, pk = id_radar)
1054 radar = get_object_or_404(Location, pk = id_radar)
1032 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1055 experiments = Experiment.objects.filter(campaign=campaign).filter(location=radar)
1033 for exs in experiments:
1056 for exs in experiments:
1034 exs.get_status()
1057 exs.get_status()
1035
1058
1036 route = request.META['HTTP_REFERER']
1059 route = request.META['HTTP_REFERER']
1037 route = str(route)
1060 route = str(route)
1038 if 'search' in route:
1061 if 'search' in route:
1039 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1062 return HttpResponseRedirect(reverse('url_operation_search', args=[id_camp]))
1040 else:
1063 else:
1041 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1064 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1042
1065
General Comments 0
You need to be logged in to leave comments. Login now