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