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