##// END OF EJS Templates
DDS app updated...
Miguel Urco -
r32:e512425c47f1
parent child
Show More
@@ -0,0 +1,93
1 '''
2 Created on Feb 8, 2016
3
4 @author: Miguel Urco
5 '''
6
7 import string
8
9 def read_dds_file(fp):
10 """
11 Function to extract the parameters from a text file with the next format:
12
13 Input:
14
15 File with the next content:
16
17 Phase Adjust Register 1
18 -----------------------
19 00000000
20 00000000
21
22 .....
23
24 -----------------------
25 Frequency Tuning Word 1
26 -----------------------
27 00110101
28 01111111
29 11111111
30 11111111
31 10100000
32 00000000
33
34 Output:
35 Return configuration parameters for DDS: multiplier, frequency, phase, amplitude, etc.
36
37 """
38
39 kwargs = {}
40 dds_registers = []
41
42 for this_line in fp:
43 this_line = str.strip(this_line)
44
45 if not str.isdigit(this_line):
46 continue
47
48 if len(this_line) != 8:
49 continue
50
51 dds_registers.append(string.atoi(this_line,2))
52
53 if len(dds_registers) != 40:
54 return kwargs
55
56 kwargs['clock'] = 60.0
57
58 kwargs['phase_bin'] = dds_registers[0]*(2**8) + dds_registers[1]
59 kwargs['phase_mod_bin'] = dds_registers[2]*(2**8) + dds_registers[3]
60
61 kwargs['frequency_bin'] = dds_registers[4]*(2**40) + dds_registers[5]*(2**32) + dds_registers[6]*(2**24) + dds_registers[7]*(2**16) + dds_registers[8]*(2**8) + dds_registers[9]
62 kwargs['frequency_mod_bin'] = dds_registers[10]*(2**40) + dds_registers[11]*(2**32) + dds_registers[12]*(2**24) + dds_registers[13]*(2**16) + dds_registers[14]*(2**8) + dds_registers[15]
63
64 kwargs['delta_frequency'] = dds_registers[16]*(2**40) + dds_registers[17]*(2**32) + dds_registers[18]*(2**24) + dds_registers[19]*(2**16) + dds_registers[20]*(2**8) + dds_registers[21]
65
66 kwargs['update_clock'] = dds_registers[22]*(2**24) + dds_registers[23]*(2**16) + dds_registers[24]*(2**8) + dds_registers[25]
67
68 kwargs['ramp_rate_clock'] = dds_registers[26]*(2**16) + dds_registers[27]*(2**8) + dds_registers[28]
69
70 kwargs['control_register'] = dds_registers[29]*(2**24) + dds_registers[30]*(2**16) + dds_registers[31]*(2**8) + dds_registers[32]
71
72 kwargs['multiplier'] = dds_registers[30] & 0x1F
73 kwargs['modulation'] = (dds_registers[31] & 0x0E) >> 1
74 kwargs['amplitude_enabled'] = (dds_registers[32] & 0x20) >> 5
75
76 kwargs['amplitude_ch_A'] = (dds_registers[33]*(2**8) + dds_registers[34]) & 0x0FFF
77 kwargs['amplitude_ch_B'] = (dds_registers[35]*(2**8) + dds_registers[36]) & 0x0FFF
78
79 kwargs['amplitude_ramp_rate'] = dds_registers[37]
80
81 return kwargs
82
83 def read_json_file(fp):
84
85 kwargs = {}
86
87 return kwargs
88
89 def write_dds_file(filename):
90 pass
91
92 def write_json_file(filename):
93 pass No newline at end of file
@@ -0,0 +1,7
1 {% extends "dev_conf_edit.html" %}
2 {% load bootstrap3 %}
3 {% load static %}
4 {% load main_tags %}
5
6 {% block extra-js%}
7 {% endblock %} No newline at end of file
@@ -1,50 +1,60
1 1 from django import forms
2 2 from apps.main.models import Device
3 3 from .models import DDSConfiguration
4 4
5 5 # from django.core.validators import MinValueValidator, MaxValueValidator
6 6
7 EXT_TYPES = (
8 ('dds', '.dds'),
9 ('json', '.json'),
10 )
11
7 12 class DDSConfigurationForm(forms.ModelForm):
8 13
9 14 # frequency_bin = forms.IntegerField(label='Frequency (Binary)', required=False)
10 15 # phase_bin = forms.IntegerField(label='Phase (Binary)', required=False)
11 16
12 17 # frequency_mod_bin = forms.IntegerField(label='Frequency Mod (Binary)', required=False)
13 18 # phase_mod_bin = forms.IntegerField(label='Phase Mod (Binary)', required=False)
14 19
15 20 field_order = ['experiment', 'device',
16 21 'clock', 'multiplier',
17 22 'frequency',
18 23 'frequency_bin',
19 24 'phase',
20 25 'phase_bin',
21 26 'amplitude_chA', 'amplitude_chB',
22 27 'modulation',
23 28 'frequency_mod',
24 29 'frequency_mod_bin',
25 30 'phase_mod',
26 31 'phase_mod_bin']
27 32
28 33 def __init__(self, *args, **kwargs):
29 34 #request = kwargs.pop('request')
30 35 super(DDSConfigurationForm, self).__init__(*args, **kwargs)
31 36
32 37 instance = getattr(self, 'instance', None)
33 38
34 39 if instance and instance.pk:
35 40
36 41 devices = Device.objects.filter(device_type__name='dds')
37 42
38 43 self.fields['experiment'].widget.attrs['readonly'] = True
39 44 self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
40 45
41 46 self.fields['device'].widget.choices = [(device.id, device) for device in devices]
42 47
43 48
44 49 def clean(self):
45 50 # Custom validation to force an integer when type of unit = "Unit"
46 51 return
47 52
48 53 class Meta:
49 54 model = DDSConfiguration
50 55 exclude = ('type','parameters')
56
57 class UploadFileForm(forms.Form):
58
59 title = forms.ChoiceField(label='Extension Type', choices=EXT_TYPES)
60 file = forms.FileField() No newline at end of file
@@ -1,76 +1,125
1 1 from django.db import models
2 2 from apps.main.models import Configuration
3 3 # Create your models here.
4 4
5 5 from django.core.validators import MinValueValidator, MaxValueValidator
6 6 from django.core.exceptions import ValidationError
7 7
8 from files import read_dds_file, read_json_file
9
8 10 MOD_TYPES = (
9 11 (0, 'Single Tone'),
10 12 (1, 'FSK'),
11 13 (2, 'Ramped FSK'),
12 14 (3, 'Chirp'),
13 15 (4, 'BPSK'),
14 16 )
15 17
16 18 class DDSConfiguration(Configuration):
17 19
18 20 DDS_NBITS = 48
19 21
20 clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True)
22 clock = models.FloatField(verbose_name='Clock Input (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True)
21 23 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
22 24
23 frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=18, decimal_places=16)
25 frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16)
24 26 frequency_bin = models.BigIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)])
25 27
26 28 phase = models.FloatField(verbose_name='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], default=0)
27 29 # phase_binary = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)])
28 30
29 amplitude_ch_A = models.PositiveIntegerField(verbose_name='Amplitude CH A',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
30 amplitude_ch_B = models.PositiveIntegerField(verbose_name='Amplitude CH B',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
31 amplitude_ch_A = models.PositiveIntegerField(verbose_name='Amplitude CH A',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
32 amplitude_ch_B = models.PositiveIntegerField(verbose_name='Amplitude CH B',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
31 33
32 34 modulation = models.PositiveIntegerField(verbose_name='Modulation Type', choices = MOD_TYPES, default = 0)
33 35
34 frequency_mod = models.DecimalField(verbose_name='Mod: Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=18, decimal_places=16, blank=True, null=True)
36 frequency_mod = models.DecimalField(verbose_name='Mod: Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, blank=True, null=True)
35 37 frequency_mod_bin = models.BigIntegerField(verbose_name='Mod: Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
36 38
37 39 phase_mod = models.FloatField(verbose_name='Mod: Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
38 40 # phase_binary_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True)
39 41
40 42 def get_nbits(self):
41 43
42 44 return self.DDS_NBITS
43 45
44 46 def clean(self):
45 47
46 48 if self.modulation in [1,2,3]:
47 49 if self.frequency_mod is None or self.frequency_mod_bin is None:
48 50 raise ValidationError({
49 51 'frequency_mod': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
50 52 })
51 53
52 54 if self.modulation in [4,]:
53 55 if self.phase_mod is None:
54 56 raise ValidationError({
55 57 'phase_mod': 'Phase modulation has to be defined when BPSK modulation is selected'
56 58 })
57 59
58 60 def verify_frequencies(self):
59 61
60 62 return True
61 63
62 64 def freq2binary(self, freq, mclock):
63 65
64 66 binary = (float(freq)/mclock)*(2**self.DDS_NBITS)
65 67
66 68 return binary
67 69
68 70 def binary2freq(self, binary, mclock):
69 71
70 72 freq = (float(binary)/(2**self.DDS_NBITS))*mclock
71 73
72 74 return freq
73 75
76 def phase2binary(self, phase):
77
78 binary = phase*8192/180.0
79
80 return binary
81
82 def binary2phase(self, binary):
83
84 phase = binary*180.0/8192
85
86 return phase
87
88 def export_file(self, ext_file="dds"):
89
90 pass
91
92 def update_from_file(self, fp, ext_file="dds"):
93
94 if ext_file == "dds":
95 kwargs = read_dds_file(fp)
96 else:
97 kwargs = read_json_file(fp)
98
99 if not kwargs:
100 return False
101
102 self.clock = kwargs['clock']
103 self.multiplier = kwargs['multiplier']
104
105 mclock = self.clock*self.multiplier
106
107 self.frequency = self.binary2freq(kwargs['frequency_bin'], mclock)
108 self.frequency_bin = kwargs['frequency_bin']
109
110 self.frequency_mod = self.binary2freq(kwargs['frequency_mod_bin'], mclock)
111 self.frequency_mod_bin = kwargs['frequency_mod_bin']
112
113 self.phase = self.binary2phase(kwargs['phase_bin'])
114 self.phase_mod = self.binary2phase(kwargs['phase_mod_bin'])
115
116 self.modulation = kwargs['modulation']
117
118 self.amplitude_ch_A = kwargs['amplitude_ch_A']
119 self.amplitude_ch_B = kwargs['amplitude_ch_B']
120
121 return True
122
74 123 class Meta:
75 124 db_table = 'dds_configurations'
76 125 No newline at end of file
@@ -1,11 +1,11
1 1 from django.conf.urls import url
2 2
3 3 urlpatterns = (
4 4 url(r'^(?P<id_conf>-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'),
5 5 url(r'^(?P<id_conf>-?\d+)/(?P<message>-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'),
6 6 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.dds.views.dds_conf_edit', name='url_edit_dds_conf'),
7 7 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.dds.views.dds_conf_write', name='url_write_dds_conf'),
8 8 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.dds.views.dds_conf_read', name='url_read_dds_conf'),
9 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_dds_conf'),
9 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.dds.views.dds_conf_import', name='url_import_dds_conf'),
10 10 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_dds_conf'),
11 11 )
@@ -1,163 +1,221
1 1 # Create your views here.
2 2 from django.contrib import messages
3 3 from django.shortcuts import redirect, render, get_object_or_404
4 4
5 from django.core.exceptions import ValidationError
6
5 7 # from apps.main.models import Experiment, Configuration
6 8 from apps.main.views import sidebar
7 9
8 10 from .models import DDSConfiguration
9 from .forms import DDSConfigurationForm
11 from .forms import DDSConfigurationForm, UploadFileForm
10 12 # Create your views here.
11 13
12 14 from radarsys_api import dds
13 15
14 16 def dds_conf(request, id_conf):
15 17
16 18 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
17 19
18 20 answer = dds.echo(ip=str(conf.device.ip_address), port=conf.device.port_address)
19 21
20 22 kwargs = {}
23
21 24 kwargs['connected'] = (answer[0] == "1")
22 25
26 if not kwargs['connected']:
27 messages.error(request, message=answer)
28
23 29 kwargs['dev_conf'] = conf
24 30 kwargs['dev_conf_keys'] = ['experiment', 'device',
25 31 'clock', 'multiplier',
26 32 'frequency',
27 33 'frequency_bin',
28 34 'phase',
29 35 # 'phase_binary',
30 36 'amplitude_ch_A', 'amplitude_ch_B',
31 37 'modulation',
32 38 'frequency_mod',
33 39 'frequency_mod_bin',
34 40 'phase_mod']
35 41 # 'phase_binary_mod']
36 42
37 43 kwargs['title'] = 'DDS Configuration'
38 44 kwargs['suptitle'] = 'Details'
39 45
40 46 kwargs['button'] = 'Edit Configuration'
41 47
42 48 ###### SIDEBAR ######
43 49 kwargs.update(sidebar(conf))
44 50
45 51 return render(request, 'dds_conf.html', kwargs)
46 52
47 53 def dds_conf_edit(request, id_conf):
48 54
49 55 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
50 56
51 57 if request.method=='GET':
52 58 form = DDSConfigurationForm(instance=conf)
53 59
54 60 if request.method=='POST':
55 61 form = DDSConfigurationForm(request.POST, instance=conf)
56 62
57 63 if form.is_valid():
58 64 conf = form.save(commit=False)
59 65
60 66 if conf.verify_frequencies():
61 67
62 68 conf.save()
63 69 return redirect('url_dds_conf', id_conf=conf.id)
64 70
65 71 ##ERRORS
66 72
67 73 kwargs = {}
68 74 kwargs['id_dev'] = conf.id
69 75 kwargs['form'] = form
70 76 kwargs['title'] = 'Device Configuration'
71 77 kwargs['suptitle'] = 'Edit'
72 78 kwargs['button'] = 'Save'
73 79
74 80 ###### SIDEBAR ######
75 81 kwargs.update(sidebar(conf))
76 82
77 83 return render(request, 'dds_conf_edit.html', kwargs)
78 84
79 85 def dds_conf_write(request, id_conf):
80 86
81 87 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
82 88
83 89 answer = dds.write_config(ip=str(conf.device.ip_address),
84 90 port=conf.device.port_address,
85 91 clock=conf.clock,
86 92 multiplier=conf.multiplier,
87 93 freq_regA=conf.frequency_bin,
88 94 freq_regB=conf.frequency_mod_bin,
89 95 modulation=conf.modulation,
90 phaseA=conf.phase,
91 phaseB=conf.phase_mod,
96 phaseA=conf.phase2binary(conf.phase),
97 phaseB=conf.phase2binary(conf.phase_mod),
92 98 amplitude0=conf.amplitude_ch_A,
93 99 amplitude1=conf.amplitude_ch_B)
94 100
95 101 if answer[0] == "1":
96 102 messages.success(request, answer[2:])
97 103
98 104 conf.pk = None
99 105 conf.id = None
100 106 conf.type = 1
101 107 conf.save()
102 108
103 109 else:
104 messages.error(request, answer)
110 messages.error(request, "Could not write the parameters to this device")
105 111
106 return redirect('url_dds_conf', id_conf=conf.id)
112 return redirect('url_dds_conf', id_conf=id_conf)
107 113
108 114 def dds_conf_read(request, id_conf):
109 115
110 116 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
111 117
112 118 if request.method=='POST':
113 119 form = DDSConfigurationForm(request.POST, instance=conf)
114 120
115 121 if form.is_valid():
116 122 dds_model = form.save(commit=False)
117 123
118 124 if dds_model.verify_frequencies():
119 125
120 126 dds_model.save()
121 127 return redirect('url_dds_conf', id_conf=conf.id)
122 128
123 messages.error(request, "Parameters could not be saved. Invalid parameters")
129 messages.error(request, "Parameters could not be saved")
124 130
125 131 data = {}
126 132
127 133 if request.method=='GET':
128 134 #mult, freqA, freqB, modulation, phaseA, phaseB, amp0, amp1
129 135 parms = dds.read_config(ip=conf.device.ip_address,
130 136 port=conf.device.port_address)
131 137
132 138 if not parms:
133 messages.error(request, "Could not read parameters from Device")
139 messages.error(request, "Could not read dds parameters from this device")
134 140 return redirect('url_dds_conf', id_conf=conf.id)
135 141
136 data = {'experiment' : conf.experiment.id,
137 'device' : conf.device.id,
138 'clock' : conf.clock,
139 'multiplier' : parms[0],
142 data = {'multiplier' : parms[0],
140 143 'frequency' : conf.binary2freq(parms[1], parms[0]*conf.clock),
141 144 'frequency_bin' : parms[1],
142 'phase' : parms[4],
145 'phase' : conf.binary2phase(parms[4]),
143 146 'amplitude_ch_A' : parms[6],
144 147 'amplitude_ch_B' : parms[7],
145 148 'modulation' : parms[3],
146 149 'frequency_mod' : conf.binary2freq(parms[2], parms[0]*conf.clock),
147 150 'frequency_mod_bin' : parms[2],
148 'phase_mod' : parms[5],
151 'phase_mod' : conf.binary2phase(parms[5]),
149 152 }
150 153
151 form = DDSConfigurationForm(data)
154 form = DDSConfigurationForm(initial=data, instance=conf)
152 155
153 156 kwargs = {}
154 157 kwargs['id_dev'] = conf.id
155 158 kwargs['form'] = form
156 159 kwargs['title'] = 'Device Configuration'
157 160 kwargs['suptitle'] = 'Parameters read from device'
158 161 kwargs['button'] = 'Save'
159 162
160 163 ###### SIDEBAR ######
161 164 kwargs.update(sidebar(conf))
162 165
163 return render(request, 'dds_conf_edit.html', kwargs) No newline at end of file
166 return render(request, 'dds_conf_edit.html', kwargs)
167
168 def dds_conf_import(request, id_conf):
169
170 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
171
172 if request.method == 'POST':
173 file_form = UploadFileForm(request.POST, request.FILES)
174
175 if file_form.is_valid():
176
177 if conf.update_from_file(request.FILES['file']):
178
179 try:
180 conf.full_clean()
181 except ValidationError as e:
182 messages.error(request, e)
183 else:
184 conf.save()
185
186 messages.success(request, "Parameters imported from file: '%s'." %request.FILES['file'].name)
187 messages.warning(request, "Clock Input could not be read from file, using %3.2fMhz by default. Please update it to its real value" %conf.clock)
188 return redirect('url_dds_conf', id_conf=conf.id)
189
190 messages.error(request, "Could not import parameters from file")
191
192 else:
193 file_form = UploadFileForm()
194
195 kwargs = {}
196 kwargs['id_dev'] = conf.id
197 kwargs['title'] = 'Device Configuration'
198 kwargs['form'] = file_form
199 kwargs['suptitle'] = 'Importing file'
200 kwargs['button'] = 'Import'
201
202 kwargs.update(sidebar(conf))
203
204 return render(request, 'dds_conf_import.html', kwargs)
205
206 def handle_uploaded_file(f):
207
208 data = {'multiplier' : 5,
209 'frequency' : 49.92,
210 'frequency_bin' : 45678,
211 'phase' : 0,
212 'amplitude_ch_A' : 1024,
213 'amplitude_ch_B' : 2014,
214 'modulation' : 1,
215 'frequency_mod' : 0,
216 'frequency_mod_bin' : 0,
217 'phase_mod' : 180,
218 }
219
220
221 return data No newline at end of file
@@ -1,131 +1,128
1 1 from itertools import chain
2 2 from django.db import models
3 3 from polymorphic import PolymorphicModel
4 4
5 from django.core.urlresolvers import reverse
6
5 7 CONF_TYPES = (
6 8 (0, 'Active'),
7 9 (1, 'Historical'),
8 10 )
9 11
10 12 DEV_STATES = (
11 13 (0, 'No connected'),
12 14 (1, 'Connected'),
13 15 (2, 'Configured'),
14 16 (3, 'Running'),
15 17 )
16 18
17 19 DEV_TYPES = (
18 20 ('', 'Select a device type'),
19 21 ('rc', 'Radar Controller'),
20 22 ('dds', 'Direct Digital Synthesizer'),
21 23 ('jars', 'Jicamarca Radar Acquisition System'),
22 24 ('usrp', 'Universal Software Radio Peripheral'),
23 25 ('cgs', 'Clock Generator System'),
24 26 ('abs', 'Automatic Beam Switching'),
25 27 )
26 28
27 29 # Create your models here.
28 30
29 31 class DeviceType(models.Model):
30 32
31 33 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
32 34
33 35 description = models.TextField(blank=True, null=True)
34 36
35 37 # info = models.TextField(blank=True, null=True)
36 38 # status = models.PositiveSmallIntegerField(default=1, choices=STATES)
37 39
38 40 class Meta:
39 41 db_table = 'db_device_types'
40 42
41 43 def __unicode__(self):
42 44 return u'%s' % self.get_name_display()
43 45
44 46 class Device(models.Model):
45 47
46 48 device_type = models.ForeignKey(DeviceType)
47 49 name = models.CharField(max_length=40, default='')
48 50 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
49 51 port_address = models.PositiveSmallIntegerField(default=2000)
50 52 description = models.TextField(blank=True, null=True)
51 53 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
52 54
53 55 # serial_number = models.CharField(max_length=40, default='')
54 56 # mac_address = models.CharField(max_length = 20, null=True, blank=True)
55 57
56 58
57 59 class Meta:
58 60 db_table = 'db_devices'
59 61
60 62 def __unicode__(self):
61 63 return u'%s | %s' % (self.name, self.ip_address)
62 64
63 65 class Campaign(models.Model):
64 66
65 67 name = models.CharField(max_length=40, unique=True)
66 68 start_date = models.DateTimeField(blank=True, null=True)
67 69 end_date = models.DateTimeField(blank=True, null=True)
68 70 tags = models.CharField(max_length=40)
69 71 description = models.TextField(blank=True, null=True)
70 72 template = models.BooleanField(default=False)
71 73
72 74 class Meta:
73 75 db_table = 'db_campaigns'
74 76
75 77 def __unicode__(self):
76 78 return u'%s' % (self.name)
77 79
78 80 class Experiment(models.Model):
79 81
80 82 campaign = models.ForeignKey(Campaign)
81 83 name = models.CharField(max_length=40, default='')
82 84 start_time = models.TimeField(default='00:00:00')
83 85 end_time = models.TimeField(default='23:59:59')
84 86
85 87 class Meta:
86 88 db_table = 'db_experiments'
87 89
88 90 def __unicode__(self):
89 91 return u'[%s]: %s' % (self.campaign.name, self.name)
90 92
91 93 class Configuration(PolymorphicModel):
92 94
93 95 experiment = models.ForeignKey(Experiment)
94 96 device = models.ForeignKey(Device)
95 97 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
96 98
97 99 created_date = models.DateTimeField(auto_now_add=True)
98 100 programmed_date = models.DateTimeField(auto_now=True)
99 101
100 102 parameters = models.TextField(default='{}')
101 103
102 104 class Meta:
103 105 db_table = 'db_configurations'
104 106
105 107 def __unicode__(self):
106 108 return u'[%s - %s]: %s' % (self.experiment.campaign.name,
107 109 self.experiment.name,
108 110 self.device.name)
109 111 def get_absolute_url(self):
110 from django.core.urlresolvers import reverse
112
111 113 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
112 114
113 115 def get_absolute_url_edit(self):
114 from django.core.urlresolvers import reverse
115 116 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
116 117
117 118 def get_absolute_url_import(self):
118 from django.core.urlresolvers import reverse
119 119 return reverse('url_import_%s_conf' % self.device.device_type.name, args=[str(self.id)])
120 120
121 121 def get_absolute_url_export(self):
122 from django.core.urlresolvers import reverse
123 122 return reverse('url_export_%s_conf' % self.device.device_type.name, args=[str(self.id)])
124 123
125 124 def get_absolute_url_write(self):
126 from django.core.urlresolvers import reverse
127 125 return reverse('url_write_%s_conf' % self.device.device_type.name, args=[str(self.id)])
128 126
129 127 def get_absolute_url_read(self):
130 from django.core.urlresolvers import reverse
131 128 return reverse('url_read_%s_conf' % self.device.device_type.name, args=[str(self.id)]) No newline at end of file
@@ -1,127 +1,126
1 1 <!DOCTYPE html>
2 2 {% load static %}
3 3 <html lang="en">
4 4 <head>
5 5 <meta charset="utf-8">
6 6 <title>{% block title %}Jicamarca Integrated Radar System:::::{% endblock %}</title>
7 7 <meta name="description" content="">
8 8 <meta name="author" content="">
9 9 <meta name="viewport" content="width=device-width, initial-scale=1">
10 10 {# bootstrap_css #}
11 11 <link href="{% static 'css/bootstrap-flatly.min.css' %}" media="all" rel="stylesheet">
12 12 <style type="text/css">
13 13 body {padding-top: 60px}
14 14 .logo {padding-top: 5px; height: 50px}
15 15 .clickable-row {cursor: pointer;}
16 16 </style>
17 17 <!--[if lt IE 9]>
18 18 <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
19 19 <![endif]-->
20 20 {% block extra-head %}
21 21 {% endblock %}
22 22 </head>
23 23
24 24 <body>
25 25
26 26 {% block main_menu %}
27 27 <nav class="navbar navbar-default navbar-fixed-top" role="banner">
28 28 <div class="container-fluid">
29 29 <div class="navbar-header">
30 30 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navigationbar">
31 31 <span class="sr-only">Toggle navigation</span>
32 32 <span class="icon-bar"></span>
33 33 <span class="icon-bar"></span>
34 34 <span class="icon-bar"></span>
35 35 </button>
36 36 <a class="navbar-brand" href="{% url 'index' %}" style="padding-top:1px"><img class="logo" alt="JRO" src="{% static "images/logo-jro-white-trans.png" %}"></a>
37 37 </div>
38 38 <div class="collapse navbar-collapse" id="navigationbar">
39 39 <ul class="nav navbar-nav">
40 40 <li class=" dropdown {% block dev-active %}{% endblock %}"><a href="{% url 'url_devices'%}">Devices</a>
41 41 </li>
42 42 <li class=" dropdown {% block camp-active %}{% endblock %}"><a href="{% url 'url_campaigns'%}">Campaigns</a>
43 43 </li>
44 44 <li class=" dropdown {% block exp-active %}{% endblock %}"><a href="{% url 'url_experiments'%}">Experiments</a>
45 45 </li>
46 46 <li class=" dropdown {% block conf-active %}{% endblock %}"><a href="{% url 'url_dev_confs'%}">Device Configurations</a>
47 47 </li>
48 48 </ul>
49 49 <ul class="nav navbar-nav navbar-right">
50 50 <li class="nav-divider"></li>
51 51 {% if user.is_authenticated %}
52 52 <li class="dropdown">
53 53 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hi {{ user.username }}<span class="caret"></span></a>
54 54 <ul class="dropdown-menu" role="menu">
55 55 <li><a href="#">Control Panel</a></li>
56 56 <li><a href="{% url 'django.contrib.auth.views.logout' %}">Logout</a></li>
57 57 </ul>
58 58 </li>
59 59 {% else %}
60 60 <li><a href="{% url 'django.contrib.auth.views.login' %}?next={{request.get_full_path}}">Login</a></li>
61 61 {% endif %}
62 62 </ul>
63 63 </div>
64 64 </div>
65 65 </nav>
66 66 <div style="clear: both;"></div>
67 67 {% endblock %}
68 68
69 69 <div class="container">
70 70 <div id="page" class="row" style="min-height:600px">
71 71
72 72 <div class="col-md-3 hidden-xs hidden-sm" role="complementary">
73 73 <br><br>
74 74 <div id="sidebar">
75 75 {% block sidebar%}
76 76 {% endblock %}
77 77 </div>
78 78 </div>
79 79
80 80 <div class="col-md-9 col-xs-12" role="main">
81 81 <div class="page-header">
82 82 <h1>{% block content-title %}{% endblock %} <small>{% block content-suptitle %}{% endblock %}</small></h1>
83 83 <hr>
84 84 </div>
85 85 {% block messages %}
86 86 {% if messages %}
87 87 {% for message in messages %}
88 88 <div class="alert alert-{% if message.tags %}{% if 'error' in message.tags %}danger{% else %}{{ message.tags }}{% endif %}{% else %}info{% endif %} alert-dismissible" role="alert">
89 89 <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
90 90 <strong>{{message.tags|title}}!</strong> {{ message }}
91 91 </div>
92 {% endfor %}
93 <br>
92 {% endfor %}
94 93 {% endif %}
95 94 {% endblock %}
96 95
97 96 {% block content %}
98 97 {% endblock %}
99 <br>
98
100 99 </div>
101 100
102 101
103 102 </div><!--/row-->
104 103 </div> <!-- container -->
105 104
106 105 <div id="debug">{{debug}}</div>
107 106
108 107 {% block footer %}
109 108 <footer class="footer">
110 109 <div class="container">
111 110 <p><hr></p>
112 111 <p>
113 112 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
114 113 </p>
115 114 </div>
116 115 </footer>
117 116 {% endblock %}
118 117
119 118 {# bootstrap_javascript jquery=True #}
120 119 <script src="{% static 'js/jquery.min.js' %}"></script>
121 120 <script src="{% static 'js/bootstrap.min.js' %}"></script>
122 121 <script src="{% static 'js/jquery-ui.min.js' %}"></script>
123 122 {% block extra-js %}
124 123 {% endblock%}
125 124 </body>
126 125 </html>
127 126
@@ -1,29 +1,35
1 1 {% extends "base.html" %}
2 2 {% load bootstrap3 %}
3 3 {% load static %}
4 4 {% load main_tags %}
5 5
6 6 {% block conf-active %}active{% endblock %}
7 7
8 8 {% block content-title %}{{title}}{% endblock %}
9 9 {% block content-suptitle %}{{suptitle}}{% endblock %}
10 10
11 11 {% block content %}
12 <form class="form" method="post" action="">
12
13 {% if form.is_multipart %}
14 <form class="form" enctype="multipart/form-data" method="post" action="">
15 {% else %}
16 <form class="form" method="post" action="">
17 {% endif %}
18
13 19 {% csrf_token %}
14 20 {% bootstrap_form form layout='horizontal' size='medium' %}
15 21 <div style="clear: both;"></div>
16 22 <br>
17 23 <div class="pull-right">
18 24 <button type="button" class="btn btn-primary" onclick="{% if previous %}window.location.replace('{{ previous }}');{% else %}history.go(-1);{% endif %}">Cancel</button>
19 25 <button type="submit" class="btn btn-primary">{{button}}</button>
20 26 </div>
21 27 </form>
22 28 {% endblock %}
23 29
24 30 {% block sidebar%}
25 31 {% include "sidebar_devices.html" %}
26 32 {% endblock %}
27 33
28 34 {% block extra-js%}
29 35 {% endblock %} No newline at end of file
@@ -1,569 +1,509
1 1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 2 from django.contrib import messages
3 3
4 4 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm
5 5 from apps.cgs.forms import CGSConfigurationForm
6 6 from apps.jars.forms import JARSConfigurationForm
7 7 from apps.usrp.forms import USRPConfigurationForm
8 8 from apps.abs.forms import ABSConfigurationForm
9 9 from apps.rc.forms import RCConfigurationForm
10 10 from apps.dds.forms import DDSConfigurationForm
11 11
12 12 from .models import Campaign, Experiment, Device, Configuration
13 13 from apps.cgs.models import CGSConfiguration
14 14 from apps.jars.models import JARSConfiguration
15 15 from apps.usrp.models import USRPConfiguration
16 16 from apps.abs.models import ABSConfiguration
17 17 from apps.rc.models import RCConfiguration
18 18 from apps.dds.models import DDSConfiguration
19 19
20 20 # Create your views here.
21 21
22 22 CONF_FORMS = {
23 23 'rc': RCConfigurationForm,
24 24 'dds': DDSConfigurationForm,
25 25 'jars': JARSConfigurationForm,
26 26 'cgs': CGSConfigurationForm,
27 27 'abs': ABSConfigurationForm,
28 28 'usrp': USRPConfigurationForm,
29 29 }
30 30
31 31 CONF_MODELS = {
32 32 'rc': RCConfiguration,
33 33 'dds': DDSConfiguration,
34 34 'jars': JARSConfiguration,
35 35 'cgs': CGSConfiguration,
36 36 'abs': ABSConfiguration,
37 37 'usrp': USRPConfiguration,
38 38 }
39 39
40 40 def index(request):
41 41 kwargs = {}
42 42
43 43 return render(request, 'index.html', kwargs)
44 44
45 45 def devices(request):
46 46
47 47 devices = Device.objects.all().order_by('device_type__name')
48 48
49 49 # keys = ['id', 'device_type__name', 'name', 'ip_address']
50 50 keys = ['id', 'name', 'ip_address', 'device_type']
51 51
52 52 kwargs = {}
53 53 kwargs['device_keys'] = keys[1:]
54 54 kwargs['devices'] = devices#.values(*keys)
55 55 kwargs['title'] = 'Device'
56 56 kwargs['suptitle'] = 'List'
57 57 kwargs['button'] = 'New Device'
58 58
59 59 return render(request, 'devices.html', kwargs)
60 60
61 61 def device(request, id_dev):
62 62
63 63 device = get_object_or_404(Device, pk=id_dev)
64 64
65 65 kwargs = {}
66 66 kwargs['device'] = device
67 67 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
68 68
69 69 kwargs['title'] = 'Device'
70 70 kwargs['suptitle'] = 'Details'
71 71
72 72 kwargs['button'] = 'Add Device'
73 73
74 74 return render(request, 'device.html', kwargs)
75 75
76 76 def device_new(request):
77 77
78 78 if request.method == 'GET':
79 79 form = DeviceForm()
80 80
81 81 if request.method == 'POST':
82 82 form = DeviceForm(request.POST)
83 83
84 84 if form.is_valid():
85 85 form.save()
86 86 return redirect('url_devices')
87 87
88 88 kwargs = {}
89 89 kwargs['form'] = form
90 90 kwargs['title'] = 'Device'
91 91 kwargs['suptitle'] = 'New'
92 92 kwargs['button'] = 'Create'
93 93
94 94 return render(request, 'device_edit.html', kwargs)
95 95
96 96 def device_edit(request, id_dev):
97 97
98 98 device = get_object_or_404(Device, pk=id_dev)
99 99
100 100 if request.method=='GET':
101 101 form = DeviceForm(instance=device)
102 102
103 103 if request.method=='POST':
104 104 form = DeviceForm(request.POST, instance=device)
105 105
106 106 if form.is_valid():
107 107 form.save()
108 108 return redirect('url_devices')
109 109
110 110 kwargs = {}
111 111 kwargs['form'] = form
112 112 kwargs['title'] = 'Device'
113 113 kwargs['suptitle'] = 'Edit'
114 114 kwargs['button'] = 'Update'
115 115
116 116 return render(request, 'device_edit.html', kwargs)
117 117
118 118 def device_delete(request, id_dev):
119 119
120 120 device = get_object_or_404(Device, pk=id_dev)
121 121
122 122 if request.method=='POST':
123 123
124 124 if request.user.is_staff:
125 125 device.delete()
126 126 return redirect('url_devices')
127 127
128 128 return HttpResponse("Not enough permission to delete this object")
129 129
130 130 kwargs = {'object':device, 'dev_active':'active',
131 131 'url_cancel':'url_device', 'id_item':id_dev}
132 132
133 133 return render(request, 'item_delete.html', kwargs)
134 134
135 135 def campaigns(request):
136 136
137 137 campaigns = Campaign.objects.all().order_by('start_date')
138 138
139 139 keys = ['id', 'name', 'start_date', 'end_date']
140 140
141 141 kwargs = {}
142 142 kwargs['campaign_keys'] = keys[1:]
143 143 kwargs['campaigns'] = campaigns#.values(*keys)
144 144 kwargs['title'] = 'Campaign'
145 145 kwargs['suptitle'] = 'List'
146 146 kwargs['button'] = 'New Campaign'
147 147
148 148 return render(request, 'campaigns.html', kwargs)
149 149
150 150 def campaign(request, id_camp):
151 151
152 152 campaign = get_object_or_404(Campaign, pk=id_camp)
153 153 experiments = Experiment.objects.filter(campaign=campaign)
154 154
155 155 form = CampaignForm(instance=campaign)
156 156
157 157 kwargs = {}
158 158 kwargs['campaign'] = campaign
159 159 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
160 160
161 161 keys = ['id', 'name', 'start_time', 'end_time']
162 162
163 163 kwargs['experiment_keys'] = keys[1:]
164 164 kwargs['experiments'] = experiments.values(*keys)
165 165
166 166 kwargs['title'] = 'Campaign'
167 167 kwargs['suptitle'] = 'Details'
168 168
169 169 kwargs['form'] = form
170 170 kwargs['button'] = 'Add Experiment'
171 171
172 172 return render(request, 'campaign.html', kwargs)
173 173
174 174 def campaign_new(request):
175 175
176 176 if request.method == 'GET':
177 177 form = CampaignForm()
178 178
179 179 if request.method == 'POST':
180 180 form = CampaignForm(request.POST)
181 181
182 182 if form.is_valid():
183 183 campaign = form.save()
184 184 return redirect('url_campaign', id_camp=campaign.id)
185 185
186 186 kwargs = {}
187 187 kwargs['form'] = form
188 188 kwargs['title'] = 'Campaign'
189 189 kwargs['suptitle'] = 'New'
190 190 kwargs['button'] = 'Create'
191 191
192 192 return render(request, 'campaign_edit.html', kwargs)
193 193
194 194 def campaign_edit(request, id_camp):
195 195
196 196 campaign = get_object_or_404(Campaign, pk=id_camp)
197 197
198 198 if request.method=='GET':
199 199 form = CampaignForm(instance=campaign)
200 200
201 201 if request.method=='POST':
202 202 form = CampaignForm(request.POST, instance=campaign)
203 203
204 204 if form.is_valid():
205 205 form.save()
206 206 return redirect('url_campaign', id_camp=id_camp)
207 207
208 208 kwargs = {}
209 209 kwargs['form'] = form
210 210 kwargs['title'] = 'Campaign'
211 211 kwargs['suptitle'] = 'Edit'
212 212 kwargs['button'] = 'Update'
213 213
214 214 return render(request, 'campaign_edit.html', kwargs)
215 215
216 216 def campaign_delete(request, id_camp):
217 217
218 218 campaign = get_object_or_404(Campaign, pk=id_camp)
219 219
220 220 if request.method=='POST':
221 221 if request.user.is_staff:
222 222 campaign.delete()
223 223 return redirect('url_campaigns')
224 224
225 225 return HttpResponse("Not enough permission to delete this object")
226 226
227 227 kwargs = {'object':campaign, 'camp_active':'active',
228 228 'url_cancel':'url_campaign', 'id_item':id_camp}
229 229
230 230 return render(request, 'item_delete.html', kwargs)
231 231
232 232 def experiments(request):
233 233
234 234 experiment_list = Experiment.objects.all().order_by('campaign')
235 235
236 236 keys = ['id', 'name', 'start_time', 'end_time', 'campaign']
237 237
238 238 kwargs = {}
239 239
240 240 kwargs['experiment_keys'] = keys[1:]
241 241 kwargs['experiments'] = experiment_list#.values(*keys)
242 242
243 243 kwargs['title'] = 'Experiment'
244 244 kwargs['suptitle'] = 'List'
245 245 kwargs['button'] = 'New Experiment'
246 246
247 247 return render(request, 'experiments.html', kwargs)
248 248
249 249 def experiment(request, id_exp):
250 250
251 251 experiment = get_object_or_404(Experiment, pk=id_exp)
252 252
253 253 experiments = Experiment.objects.filter(campaign=experiment.campaign)
254 254 configurations = Configuration.objects.filter(experiment=experiment)
255 255
256 256 kwargs = {}
257 257
258 258 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
259 259 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
260 260
261 261
262 262 kwargs['experiment_keys'] = exp_keys[1:]
263 263 kwargs['experiment'] = experiment
264 264
265 265 kwargs['experiments'] = experiments.values(*exp_keys)
266 266
267 267 kwargs['configuration_keys'] = conf_keys[1:]
268 268 kwargs['configurations'] = configurations.values(*conf_keys)
269 269
270 270 kwargs['title'] = 'Experiment'
271 271 kwargs['suptitle'] = 'Details'
272 272
273 273 kwargs['button'] = 'Add Device'
274 274
275 275 return render(request, 'experiment.html', kwargs)
276 276
277 277 def experiment_new(request, id_camp=0):
278 278
279 279 if request.method == 'GET':
280 280 form = ExperimentForm(initial={'campaign':id_camp})
281 281
282 282 if request.method == 'POST':
283 283 form = ExperimentForm(request.POST, initial={'campaign':id_camp})
284 284
285 285 if form.is_valid():
286 286 experiment = form.save()
287 287 return redirect('url_experiment', id_exp=experiment.id)
288 288
289 289 kwargs = {}
290 290 kwargs['form'] = form
291 291 kwargs['title'] = 'Experiment'
292 292 kwargs['suptitle'] = 'New'
293 293 kwargs['button'] = 'Create'
294 294
295 295 return render(request, 'experiment_edit.html', kwargs)
296 296
297 297 def experiment_edit(request, id_exp):
298 298
299 299 experiment = get_object_or_404(Experiment, pk=id_exp)
300 300
301 301 if request.method == 'GET':
302 302 form = ExperimentForm(instance=experiment)
303 303
304 304 if request.method=='POST':
305 305 form = ExperimentForm(request.POST, instance=experiment)
306 306
307 307 if form.is_valid():
308 308 experiment = form.save()
309 309 return redirect('url_experiment', id_exp=experiment.id)
310 310
311 311 kwargs = {}
312 312 kwargs['form'] = form
313 313 kwargs['title'] = 'Experiment'
314 314 kwargs['suptitle'] = 'Edit'
315 315 kwargs['button'] = 'Update'
316 316
317 317 return render(request, 'experiment_edit.html', kwargs)
318 318
319 319 def experiment_delete(request, id_exp):
320 320
321 321 experiment = get_object_or_404(Experiment, pk=id_exp)
322 322
323 323 if request.method=='POST':
324 324 if request.user.is_staff:
325 325 id_camp = experiment.campaign.id
326 326 experiment.delete()
327 327 return redirect('url_campaign', id_camp=id_camp)
328 328
329 329 return HttpResponse("Not enough permission to delete this object")
330 330
331 331 kwargs = {'object':experiment, 'exp_active':'active',
332 332 'url_cancel':'url_experiment', 'id_item':id_exp}
333 333
334 334 return render(request, 'item_delete.html', kwargs)
335 335
336 336 def dev_confs(request):
337 337
338 338 configurations = Configuration.objects.all().order_by('experiment')
339 339
340 340 # keys = ['id', 'device__device_type__name', 'device__name', 'experiment__campaign__name', 'experiment__name']
341 341
342 342 keys = ['id', 'device', 'experiment', 'type', 'programmed_date']
343 343
344 344 kwargs = {}
345 345
346 346 kwargs['configuration_keys'] = keys[1:]
347 347 kwargs['configurations'] = configurations#.values(*keys)
348 348
349 349 kwargs['title'] = 'Configuration'
350 350 kwargs['suptitle'] = 'List'
351 351 kwargs['button'] = 'New Configuration'
352 352
353 353 return render(request, 'dev_confs.html', kwargs)
354 354
355 355 def dev_conf(request, id_conf):
356 356
357 357 conf = get_object_or_404(Configuration, pk=id_conf)
358 358
359 359 DevConfModel = CONF_MODELS[conf.device.device_type.name]
360 360 dev_conf = DevConfModel.objects.get(pk=id_conf)
361 361
362 362 kwargs = {}
363 363 kwargs['dev_conf'] = dev_conf
364 364 kwargs['dev_conf_keys'] = ['experiment', 'device']
365 365
366 366 kwargs['title'] = 'Configuration'
367 367 kwargs['suptitle'] = 'Details'
368 368
369 369 kwargs['button'] = 'Edit Configuration'
370 370
371 371 ###### SIDEBAR ######
372 372 kwargs.update(sidebar(conf))
373 373
374 374 return render(request, 'dev_conf.html', kwargs)
375 375
376 376 def dev_conf_new(request, id_exp=0):
377 377
378 378 if request.method == 'GET':
379 379 form = ConfigurationForm(initial={'experiment':id_exp})
380 380
381 381 if request.method == 'POST':
382 382 form = ConfigurationForm(request.POST)
383 383
384 384 if form.is_valid():
385 385 experiment = Experiment.objects.get(pk=request.POST['experiment'])
386 386 device = Device.objects.get(pk=request.POST['device'])
387 387
388 388 exp_devices = Device.objects.filter(configuration__experiment=experiment)
389 389
390 390 if device.id not in exp_devices.values('id',):
391 391
392 392 DevConfModel = CONF_MODELS[device.device_type.name]
393 393 conf = DevConfModel(experiment=experiment, device=device)
394 394 conf.save()
395 395
396 396 return redirect('url_experiment', id_exp=experiment.id)
397 397
398 398 kwargs = {}
399 399 kwargs['form'] = form
400 400 kwargs['title'] = 'Configuration'
401 401 kwargs['suptitle'] = 'New'
402 402 kwargs['button'] = 'Create'
403 403
404 404 ###### SIDEBAR ######
405 405 kwargs.update(sidebar(conf))
406 406
407 407 return render(request, 'dev_conf_edit.html', kwargs)
408 408
409 409 def dev_conf_edit(request, id_conf):
410 410
411 411 conf = get_object_or_404(Configuration, pk=id_conf)
412 412
413 413 DevConfModel = CONF_MODELS[conf.device.device_type.name]
414 414 DevConfForm = CONF_FORMS[conf.device.device_type.name]
415 415
416 416 dev_conf = DevConfModel.objects.get(pk=id_conf)
417 417
418 418 if request.method=='GET':
419 419 form = DevConfForm(instance=dev_conf)
420 420
421 421 if request.method=='POST':
422 422 form = DevConfForm(request.POST, instance=dev_conf)
423 423
424 424 if form.is_valid():
425 425 form.save()
426 426 return redirect('url_dev_conf', id_conf=id_conf)
427 427
428 428 kwargs = {}
429 429 kwargs['form'] = form
430 430 kwargs['title'] = 'Device Configuration'
431 431 kwargs['suptitle'] = 'Edit'
432 432 kwargs['button'] = 'Update'
433 433
434 434 ###### SIDEBAR ######
435 435 kwargs.update(sidebar(conf))
436 436
437 437 return render(request, 'dev_conf_edit.html', kwargs)
438 438
439 439 def dev_conf_read(request, id_conf):
440 440
441 441 conf = get_object_or_404(Configuration, pk=id_conf)
442 442
443 DevConfModel = CONF_MODELS[conf.device.device_type.name]
444 dev_conf = DevConfModel.objects.get(pk=id_conf)
445
446 kwargs = {}
447 kwargs['dev_conf'] = dev_conf
448 kwargs['dev_conf_keys'] = ['experiment', 'device']
449
450 kwargs['title'] = 'Configuration'
451 kwargs['suptitle'] = 'Details'
452
453 kwargs['button'] = 'Edit Configuration'
454
455 ###### SIDEBAR ######
456 kwargs.update(sidebar(conf))
443 messages.error(request, "Read View not implemented yet")
457 444
458 messages.error(request, "Read View not implemented yet for this configuration")
459
460 return render(request, 'dev_conf.html', kwargs)
445 return redirect('url_dev_conf', id_conf=conf.id)
461 446
462 447 def dev_conf_write(request, id_conf):
463 448
464 449 conf = get_object_or_404(Configuration, pk=id_conf)
465 450
466 DevConfModel = CONF_MODELS[conf.device.device_type.name]
467 dev_conf = DevConfModel.objects.get(pk=id_conf)
468
469 kwargs = {}
470 kwargs['dev_conf'] = dev_conf
471 kwargs['dev_conf_keys'] = ['experiment', 'device']
472
473 kwargs['title'] = 'Configuration'
474 kwargs['suptitle'] = 'Details'
475
476 kwargs['button'] = 'Edit Configuration'
477
478 ###### SIDEBAR ######
479 kwargs.update(sidebar(conf))
451 messages.error(request, "Write View not implemented yet")
480 452
481 messages.error(request, "Write View not implemented yet for this configuration")
482
483 return render(request, 'dev_conf.html', kwargs)
453 return redirect('url_dev_conf', id_conf=conf.id)
484 454
485 455 def dev_conf_import(request, id_conf):
486 456
487 457 conf = get_object_or_404(Configuration, pk=id_conf)
488 458
489 DevConfModel = CONF_MODELS[conf.device.device_type.name]
490 dev_conf = DevConfModel.objects.get(pk=id_conf)
491
492 kwargs = {}
493 kwargs['dev_conf'] = dev_conf
494 kwargs['dev_conf_keys'] = ['experiment', 'device']
495
496 kwargs['title'] = 'Configuration'
497 kwargs['suptitle'] = 'Details'
498
499 kwargs['button'] = 'Edit Configuration'
500
501 ###### SIDEBAR ######
502 kwargs.update(sidebar(conf))
459 messages.error(request, "Import View not implemented yet")
503 460
504 messages.error(request, "Import View not implemented yet for this configuration")
505
506 return render(request, 'dev_conf.html', kwargs)
461 return redirect('url_dev_conf', id_conf=conf.id)
507 462
508 463 def dev_conf_export(request, id_conf):
509 464
510 465 conf = get_object_or_404(Configuration, pk=id_conf)
511 466
512 DevConfModel = CONF_MODELS[conf.device.device_type.name]
513 dev_conf = DevConfModel.objects.get(pk=id_conf)
514
515 kwargs = {}
516 kwargs['dev_conf'] = dev_conf
517 kwargs['dev_conf_keys'] = ['experiment', 'device']
518
519 kwargs['title'] = 'Configuration'
520 kwargs['suptitle'] = 'Details'
521
522 kwargs['button'] = 'Edit Configuration'
523
524 ###### SIDEBAR ######
525 kwargs.update(sidebar(conf))
467 messages.error(request, "Export View not implemented yet")
526 468
527 messages.error(request, "Export View not implemented yet for this configuration")
528
529 return render(request, 'dev_conf.html', kwargs)
469 return redirect('url_dev_conf', id_conf=conf.id)
530 470
531 471 def dev_conf_delete(request, id_conf):
532 472
533 473 conf = get_object_or_404(Configuration, pk=id_conf)
534 474
535 475 if request.method=='POST':
536 476 if request.user.is_staff:
537 477 id_exp = conf.experiment.id
538 478 conf.delete()
539 479 return redirect('url_experiment', id_exp=id_exp)
540 480
541 481 return HttpResponse("Not enough permission to delete this object")
542 482
543 483 kwargs = {'object':conf, 'conf_active':'active',
544 484 'url_cancel':'url_dev_conf', 'id_item':id_conf}
545 485
546 486 ###### SIDEBAR ######
547 487 kwargs.update(sidebar(conf))
548 488
549 489 return render(request, 'item_delete.html', kwargs)
550 490
551 491 def sidebar(conf):
552 492
553 493 experiments = Experiment.objects.filter(campaign=conf.experiment.campaign)
554 494 configurations = Configuration.objects.filter(experiment=conf.experiment, type=0)
555 495
556 496 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
557 497 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
558 498
559 499 kwargs = {}
560 500
561 501 kwargs['dev_conf'] = conf
562 502
563 503 kwargs['experiment_keys'] = exp_keys[1:]
564 504 kwargs['experiments'] = experiments.values(*exp_keys)
565 505
566 506 kwargs['configuration_keys'] = conf_keys[1:]
567 507 kwargs['configurations'] = configurations.values(*conf_keys)
568 508
569 509 return kwargs No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now