##// END OF EJS Templates
Buttons "Import", "Export, "Read" and "Write" added to Configuration View...
Miguel Urco -
r30:64b312519049
parent child
Show More
@@ -0,0 +1,13
1
2 function freq2Binary(mclock, frequency) {
3
4 var freq_bin = parseInt(frequency * (Math.pow(2,48)/mclock));
5 return freq_bin;
6
7 }
8
9 function binary2Freq(mclock, binary) {
10
11 var frequency = (1.0*binary) / (Math.pow(2,48)/mclock);
12 return frequency;
13 } No newline at end of file
@@ -1,6 +1,10
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.main.views.dev_conf', name='url_abs_conf'),
4 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_abs_conf'),
5 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_abs_conf'),
5 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_abs_conf'),
6 )
6 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_abs_conf'),
7 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_abs_conf'),
8 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_abs_conf'),
9 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_abs_conf'),
10 ) No newline at end of file
@@ -1,9 +1,13
1 from django.conf.urls import url
1 from django.conf.urls import url
2
2
3 urlpatterns = (
3 urlpatterns = (
4 #url(r'^configuration/$', 'apps.cgs.views.configurate_frequencies', name='new_device'),
4 #url(r'^configuration/$', 'apps.cgs.views.configurate_frequencies', name='new_device'),
5 # url(r'^(?P<id>-?\d+)/$', 'apps.cgs.views.configurate_frequencies', name='new_device'),
5 # url(r'^(?P<id>-?\d+)/$', 'apps.cgs.views.configurate_frequencies', name='new_device'),
6 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_cgs_conf'),
6 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_cgs_conf'),
7 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_cgs_conf'),
7 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_cgs_conf'),
8 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_cgs_conf'),
9 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_cgs_conf'),
10 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_cgs_conf'),
11 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_cgs_conf'),
8 )
12 )
9
13
@@ -1,77 +1,76
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 MOD_TYPES = (
8 MOD_TYPES = (
9 (None, 'Select a modulation type'),
10 (0, 'Single Tone'),
9 (0, 'Single Tone'),
11 (1, 'FSK'),
10 (1, 'FSK'),
12 (2, 'Ramped FSK'),
11 (2, 'Ramped FSK'),
13 (3, 'Chirp'),
12 (3, 'Chirp'),
14 (4, 'BPSK'),
13 (4, 'BPSK'),
15 )
14 )
16
15
17 class DDSConfiguration(Configuration):
16 class DDSConfiguration(Configuration):
18
17
19 DDS_NBITS = 48
18 DDS_NBITS = 48
20
19
21 clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)])
20 clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True)
22 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
21 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
23
22
24 frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15)
23 frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=18, decimal_places=16)
25 frequency_bin = models.BigIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)])
24 frequency_bin = models.BigIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)])
26
25
27 phase = models.FloatField(verbose_name='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)])
26 phase = models.FloatField(verbose_name='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], default=0)
28 # phase_binary = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)])
27 # phase_binary = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)])
29
28
30 amplitude_ch_A = models.PositiveIntegerField(verbose_name='Amplitude CHA',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
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_B = models.PositiveIntegerField(verbose_name='Amplitude CHB',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)
32
31
33 modulation = models.PositiveIntegerField(choices = MOD_TYPES, default = 0)
32 modulation = models.PositiveIntegerField(verbose_name='Modulation Type', choices = MOD_TYPES, default = 0)
34
33
35 frequency_mod = models.DecimalField(verbose_name='Frequency Mod. (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15, blank=True, null=True)
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_bin = models.BigIntegerField(verbose_name='Frequency Mod. (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], 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
36
38 phase_mod = models.FloatField(verbose_name='Phase Mod. (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
37 phase_mod = models.FloatField(verbose_name='Mod: Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
39 # phase_binary_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], 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
39
41 def get_nbits(self):
40 def get_nbits(self):
42
41
43 return self.DDS_NBITS
42 return self.DDS_NBITS
44
43
45 def clean(self):
44 def clean(self):
46
45
47 if self.modulation in [1,2,3]:
46 if self.modulation in [1,2,3]:
48 if self.frequency_mod is None or self.frequency_mod_bin is None:
47 if self.frequency_mod is None or self.frequency_mod_bin is None:
49 raise ValidationError({
48 raise ValidationError({
50 'frequency_mod': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
49 'frequency_mod': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
51 })
50 })
52
51
53 if self.modulation in [4,]:
52 if self.modulation in [4,]:
54 if self.phase_mod is None:
53 if self.phase_mod is None:
55 raise ValidationError({
54 raise ValidationError({
56 'phase_mod': 'Phase modulation has to be defined when BPSK modulation is selected'
55 'phase_mod': 'Phase modulation has to be defined when BPSK modulation is selected'
57 })
56 })
58
57
59 def verify_frequencies(self):
58 def verify_frequencies(self):
60
59
61 return True
60 return True
62
61
63 def freq2binary(self, freq, mclock):
62 def freq2binary(self, freq, mclock):
64
63
65 binary = (float(freq)/mclock)*(2**self.DDS_NBITS)
64 binary = (float(freq)/mclock)*(2**self.DDS_NBITS)
66
65
67 return binary
66 return binary
68
67
69 def binary2freq(self, binary, mclock):
68 def binary2freq(self, binary, mclock):
70
69
71 freq = (float(binary)/(2**self.DDS_NBITS))*mclock
70 freq = (float(binary)/(2**self.DDS_NBITS))*mclock
72
71
73 return freq
72 return freq
74
73
75 class Meta:
74 class Meta:
76 db_table = 'dds_configurations'
75 db_table = 'dds_configurations'
77 No newline at end of file
76
@@ -1,68 +1,1
1 {% extends "base.html" %}
1 {% extends "dev_conf.html" %} No newline at end of file
2 {% load bootstrap3 %}
3 {% load static %}
4 {% load main_tags %}
5
6 {% block conf-active %}active{% endblock %}
7
8 {% block content-title %}{{title}}{% endblock %}
9 {% block content-suptitle %}{{suptitle}}{% endblock %}
10
11 {% block content %}
12
13 <table class="table table-bordered">
14 <tr><th>Status</th><td>{%if connected == True %} &#9752; Connected {% else %} &#9940; Disconnected {% endif %}</td></tr>
15 {% for item in dev_conf_keys %}
16 <tr><th>{{item|title}}</th><td>{{dev_conf|attr:item}}</td></tr>
17 {% endfor %}
18
19 <tr><th>{{form.modulation.label}}</th><td>{{form.modulation}}</td></tr>
20
21 {% if form.modulation.value == 0 %}
22 {% endif %}
23
24 {% if form.modulation.value == 1 %}
25 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
26 {% endif %}
27
28 {% if form.modulation.value == 2 %}
29 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
30 {% endif %}
31
32 {% if form.modulation.value == 3 %}
33 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
34 {% endif %}
35
36 {% if form.modulation.value == 4 %}
37 <tr><th>{{form.phase_mod.label}}</th><td>{{form.phase_mod.value}}</td></tr>
38 {% endif %}
39 </table>
40
41 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_read">Read</button>
42 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_write">Write</button>
43 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_export">Export</button>
44 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_edit">Edit</button>
45 <br></br>
46 {% endblock %}
47
48 {% block sidebar%}
49 {% include "sidebar_devices.html" %}
50 {% endblock %}
51
52 {% block extra-js%}
53 <script type="text/javascript">
54
55 $("#bt_edit").click(function() {
56 document.location = "{% url 'url_edit_dds_conf' dev_conf.id%}";
57 });
58
59 $("#bt_write").click(function() {
60 document.location = "{% url 'url_dds_conf_write' dev_conf.id%}";
61 });
62
63 $("#bt_read").click(function() {
64 document.location = "{% url 'url_dds_conf_read' dev_conf.id%}";
65 });
66
67 </script>
68 {% endblock %} No newline at end of file
@@ -1,90 +1,83
1 {% extends "dev_conf_edit.html" %}
1 {% extends "dev_conf_edit.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 extra-js%}
6 {% block extra-js%}
7 <script src="{% static 'js/dds_conversion.js' %}"></script>
7 <script type="text/javascript">
8 <script type="text/javascript">
8
9
9 $("#bt_cancel").click(function() {
10 $("#bt_cancel").click(function() {
10 document.location = "{% url 'url_dds_conf' id_dev%}";
11 document.location = "{% url 'url_dds_conf' id_dev%}";
11 });
12 });
12
13
13 $("#bt_read").click(function() {
14 $("#bt_read").click(function() {
14 document.location = "{% url 'url_dds_conf_read' id_dev%}";
15 document.location = "{% url 'url_read_dds_conf' id_dev%}";
15 });
16 });
16
17
17 $("#id_clock").on('change', function() {
18 $("#id_clock").on('change', function() {
18 updateFrequencies();
19 updateFrequencies();
19 });
20 });
20
21
21 $("#id_multiplier").on('change', function() {
22 $("#id_multiplier").on('change', function() {
22 updateFrequencies();
23 updateFrequencies();
23 });
24 });
24
25
25 $("#id_frequency").on('change', function() {
26 $("#id_frequency").on('change', function() {
26 updateBinaryFrequencies();
27 updateBinaryFrequencies();
27 });
28 });
28
29
29 $("#id_frequency_bin").on('change', function() {
30 $("#id_frequency_bin").on('change', function() {
30 updateFrequencies();
31 updateFrequencies();
31 });
32 });
32
33
33 $("#id_frequency_mod").on('change', function() {
34 $("#id_frequency_mod").on('change', function() {
34 updateBinaryFrequencies();
35 updateBinaryFrequencies();
35 });
36 });
36
37
37 $("#id_frequency_mod_bin").on('change', function() {
38 $("#id_frequency_mod_bin").on('change', function() {
38 updateFrequencies();
39 updateFrequencies();
39 });
40 });
40
41
41 function updateBinaryFrequencies() {
42 function updateBinaryFrequencies() {
42
43
43 var clock = $("#id_clock").val();
44 var clock = $("#id_clock").val();
44 var multiplier = $("#id_multiplier").val();
45 var multiplier = $("#id_multiplier").val();
45 var freq = $("#id_frequency").val();
46 var freq = $("#id_frequency").val();
46 var freq_mod = $("#id_frequency_mod").val();
47 var freq_mod = $("#id_frequency_mod").val();
47
48
48 var mclock = clock*multiplier;
49 var mclock = clock*multiplier;
49 var k = Math.pow(2,48)/mclock;
50
50
51 var freq_bin = parseInt(freq*k);
51 var freq_bin = freq2Binary(mclock, freq);
52 var freq_mod_bin = parseInt(freq_mod*k);
52 var freq_mod_bin = freq2Binary(mclock, freq_mod);
53
53
54 $("#id_frequency_bin").val(freq_bin);
54 $("#id_frequency_bin").val(freq_bin);
55 $("#id_frequency_mod_bin").val(freq_mod_bin);
55 $("#id_frequency_mod_bin").val(freq_mod_bin);
56
56
57 freq = freq_bin/k;
57 freq = binary2Freq(mclock, freq_bin);
58 freq_mod = freq_mod_bin/k;
58 freq_mod = binary2Freq(mclock, freq_mod_bin);
59
59
60 $("#id_frequency").val(freq);
60 $("#id_frequency").val(freq);
61 $("#id_frequency_mod").val(freq_mod);
61 $("#id_frequency_mod").val(freq_mod);
62
62
63 }
63 }
64
64
65 function updateFrequencies() {
65 function updateFrequencies() {
66
66
67 var clock = $("#id_clock").val();
67 var clock = $("#id_clock").val();
68 var multiplier = $("#id_multiplier").val();
68 var multiplier = $("#id_multiplier").val();
69 var freq_bin = $("#id_frequency_bin").val();
69 var freq_bin = $("#id_frequency_bin").val();
70 var freq_mod_bin = $("#id_frequency_mod_bin").val();
70 var freq_mod_bin = $("#id_frequency_mod_bin").val();
71
71
72 var mclock = clock*multiplier;
72 var mclock = clock*multiplier;
73 var k = Math.pow(2,48)/mclock;
74
73
75 var freq = parseInt(freq_bin)/k;
74 var freq = binary2Freq(mclock, freq_bin);
76 var freq_mod = parseInt(freq_mod_bin)/k;
75 var freq_mod = binary2Freq(mclock, freq_mod_bin);
77
76
78 $("#id_frequency").val(freq);
77 $("#id_frequency").val(freq);
79 $("#id_frequency_mod").val(freq_mod);
78 $("#id_frequency_mod").val(freq_mod);
80
79
81 var freq_bin = parseInt(freq*k);
82 var freq_mod_bin = parseInt(freq_mod*k);
83
84 $("#id_frequency_bin").val(freq_bin);
85 $("#id_frequency_mod_bin").val(freq_mod_bin);
86
87 }
80 }
88
81
89 </script>
82 </script>
90 {% endblock %} No newline at end of file
83 {% endblock %}
@@ -1,9 +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_dds_conf_write'),
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_dds_conf_read'),
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'),
10 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_dds_conf'),
9 )
11 )
@@ -1,161 +1,163
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 apps.main.models import Experiment, Configuration
5 # from apps.main.models import Experiment, Configuration
6 from apps.main.views import sidebar
6 from apps.main.views import sidebar
7
7
8 from .models import DDSConfiguration
8 from .models import DDSConfiguration
9 from .forms import DDSConfigurationForm
9 from .forms import DDSConfigurationForm
10 # Create your views here.
10 # Create your views here.
11
11
12 from radarsys_api import jro_device, dds
12 from radarsys_api import dds
13
13
14 def dds_conf(request, id_conf):
14 def dds_conf(request, id_conf):
15
15
16 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
16 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
17
17
18 if request.method=='GET':
19 form = DDSConfigurationForm(instance=conf)
20
21 answer = dds.echo(ip=str(conf.device.ip_address), port=conf.device.port_address)
18 answer = dds.echo(ip=str(conf.device.ip_address), port=conf.device.port_address)
22
19
23 kwargs = {}
20 kwargs = {}
24 kwargs['connected'] = (answer[0] == "1")
21 kwargs['connected'] = (answer[0] == "1")
25 kwargs['form'] = form
26
22
27 kwargs['dev_conf'] = conf
23 kwargs['dev_conf'] = conf
28 kwargs['dev_conf_keys'] = ['experiment', 'device',
24 kwargs['dev_conf_keys'] = ['experiment', 'device',
29 'clock', 'multiplier',
25 'clock', 'multiplier',
30 'frequency',
26 'frequency',
31 # 'frequency_bin',
27 'frequency_bin',
32 'phase',
28 'phase',
33 # 'phase_binary',
29 # 'phase_binary',
34 'amplitude_ch_A', 'amplitude_ch_B']
30 'amplitude_ch_A', 'amplitude_ch_B',
35 # 'modulation',
31 'modulation',
36 # 'frequency_mod',
32 'frequency_mod',
37 # 'frequency_mod_bin',
33 'frequency_mod_bin',
38 # 'phase_mod']
34 'phase_mod']
39 # 'phase_binary_mod']
35 # 'phase_binary_mod']
40
36
41 kwargs['title'] = 'DDS Configuration'
37 kwargs['title'] = 'DDS Configuration'
42 kwargs['suptitle'] = 'Details'
38 kwargs['suptitle'] = 'Details'
43
39
44 kwargs['button'] = 'Edit Configuration'
40 kwargs['button'] = 'Edit Configuration'
45
41
46 ###### SIDEBAR ######
42 ###### SIDEBAR ######
47 kwargs.update(sidebar(conf))
43 kwargs.update(sidebar(conf))
48
44
49 return render(request, 'dds_conf.html', kwargs)
45 return render(request, 'dds_conf.html', kwargs)
50
46
51 def dds_conf_edit(request, id_conf):
47 def dds_conf_edit(request, id_conf):
52
48
53 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
49 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
54
50
55 if request.method=='GET':
51 if request.method=='GET':
56 form = DDSConfigurationForm(instance=conf)
52 form = DDSConfigurationForm(instance=conf)
57
53
58 if request.method=='POST':
54 if request.method=='POST':
59 form = DDSConfigurationForm(request.POST, instance=conf)
55 form = DDSConfigurationForm(request.POST, instance=conf)
60
56
61 if form.is_valid():
57 if form.is_valid():
62 conf = form.save(commit=False)
58 conf = form.save(commit=False)
63
59
64 if conf.verify_frequencies():
60 if conf.verify_frequencies():
65
61
66 conf.save()
62 conf.save()
67 return redirect('url_dds_conf', id_conf=conf.id)
63 return redirect('url_dds_conf', id_conf=conf.id)
68
64
69 ##ERRORS
65 ##ERRORS
70
66
71 kwargs = {}
67 kwargs = {}
72 kwargs['id_dev'] = conf.id
68 kwargs['id_dev'] = conf.id
73 kwargs['form'] = form
69 kwargs['form'] = form
74 kwargs['title'] = 'Device Configuration'
70 kwargs['title'] = 'Device Configuration'
75 kwargs['suptitle'] = 'Edit'
71 kwargs['suptitle'] = 'Edit'
76 kwargs['button'] = 'Save'
72 kwargs['button'] = 'Save'
77 kwargs['dds_nbits'] = conf.get_nbits()
78
73
79 ###### SIDEBAR ######
74 ###### SIDEBAR ######
80 kwargs.update(sidebar(conf))
75 kwargs.update(sidebar(conf))
81
76
82 return render(request, 'dds_conf_edit.html', kwargs)
77 return render(request, 'dds_conf_edit.html', kwargs)
83
78
84 def dds_conf_write(request, id_conf):
79 def dds_conf_write(request, id_conf):
85
80
86 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
81 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
87
82
88 answer = dds.write_config(ip=str(conf.device.ip_address),
83 answer = dds.write_config(ip=str(conf.device.ip_address),
89 port=conf.device.port_address,
84 port=conf.device.port_address,
90 clock=conf.clock,
85 clock=conf.clock,
91 multiplier=conf.multiplier,
86 multiplier=conf.multiplier,
92 freq_regA=conf.frequency_bin,
87 freq_regA=conf.frequency_bin,
93 freq_regB=conf.frequency_mod_bin,
88 freq_regB=conf.frequency_mod_bin,
94 modulation=conf.modulation,
89 modulation=conf.modulation,
95 phaseA=conf.phase,
90 phaseA=conf.phase,
96 phaseB=conf.phase_mod,
91 phaseB=conf.phase_mod,
97 amplitude0=conf.amplitude_ch_A,
92 amplitude0=conf.amplitude_ch_A,
98 amplitude1=conf.amplitude_ch_B)
93 amplitude1=conf.amplitude_ch_B)
99
94
100 if answer[0] == "1":
95 if answer[0] == "1":
101 messages.success(request, answer[2:])
96 messages.success(request, answer[2:])
97
98 conf.pk = None
99 conf.id = None
100 conf.type = 1
101 conf.save()
102
102 else:
103 else:
103 messages.error(request, answer)
104 messages.error(request, answer)
104
105
105 return redirect('url_dds_conf', id_conf=conf.id)
106 return redirect('url_dds_conf', id_conf=conf.id)
106
107
107 def dds_conf_read(request, id_conf):
108 def dds_conf_read(request, id_conf):
108
109
109 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
110 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
110
111
111 if request.method=='POST':
112 if request.method=='POST':
112 form = DDSConfigurationForm(request.POST, instance=conf)
113 form = DDSConfigurationForm(request.POST, instance=conf)
113
114
114 if form.is_valid():
115 if form.is_valid():
115 dds_model = form.save(commit=False)
116 dds_model = form.save(commit=False)
116
117
117 if dds_model.verify_frequencies():
118 if dds_model.verify_frequencies():
118
119
119 dds_model.save()
120 dds_model.save()
120 return redirect('url_dds_conf', id_conf=conf.id)
121 return redirect('url_dds_conf', id_conf=conf.id)
121
122
122 parms = None
123 messages.error(request, "Parameters could not be saved. Invalid parameters")
124
125 data = {}
123
126
124 if request.method=='GET':
127 if request.method=='GET':
125
126 #mult, freqA, freqB, modulation, phaseA, phaseB, amp0, amp1
128 #mult, freqA, freqB, modulation, phaseA, phaseB, amp0, amp1
127 parms = dds.read_config(ip=conf.device.ip_address,
129 parms = dds.read_config(ip=conf.device.ip_address,
128 port=conf.device.port_address)
130 port=conf.device.port_address)
129
130 if parms is None:
131 return redirect('url_dds_conf', id_conf=conf.id)
132
131
133 data = {'experiment' : conf.experiment.id,
132 if not parms:
134 'device' : conf.device.id,
133 messages.error(request, "Could not read parameters from Device")
135 'clock' : conf.clock,
134 return redirect('url_dds_conf', id_conf=conf.id)
136 'multiplier' : parms[0],
135
137 'frequency' : conf.binary2freq(parms[1], parms[0]*conf.clock),
136 data = {'experiment' : conf.experiment.id,
138 'frequency_bin' : parms[1],
137 'device' : conf.device.id,
139 'phase' : parms[4],
138 'clock' : conf.clock,
140 'amplitude_ch_A' : parms[6],
139 'multiplier' : parms[0],
141 'amplitude_ch_B' : parms[7],
140 'frequency' : conf.binary2freq(parms[1], parms[0]*conf.clock),
142 'modulation' : parms[3],
141 'frequency_bin' : parms[1],
143 'frequency_mod' : conf.binary2freq(parms[2], parms[0]*conf.clock),
142 'phase' : parms[4],
144 'frequency_mod_bin' : parms[2],
143 'amplitude_ch_A' : parms[6],
145 'phase_mod' : parms[5],
144 'amplitude_ch_B' : parms[7],
146 }
145 'modulation' : parms[3],
146 'frequency_mod' : conf.binary2freq(parms[2], parms[0]*conf.clock),
147 'frequency_mod_bin' : parms[2],
148 'phase_mod' : parms[5],
149 }
147
150
148 form = DDSConfigurationForm(data)
151 form = DDSConfigurationForm(data)
149
152
150 kwargs = {}
153 kwargs = {}
151 kwargs['id_dev'] = conf.id
154 kwargs['id_dev'] = conf.id
152 kwargs['form'] = form
155 kwargs['form'] = form
153 kwargs['title'] = 'Device Configuration'
156 kwargs['title'] = 'Device Configuration'
154 kwargs['suptitle'] = 'Parameters read from device'
157 kwargs['suptitle'] = 'Parameters read from device'
155 kwargs['button'] = 'Save'
158 kwargs['button'] = 'Save'
156 kwargs['dds_nbits'] = conf.get_nbits()
157
159
158 ###### SIDEBAR ######
160 ###### SIDEBAR ######
159 kwargs.update(sidebar(conf))
161 kwargs.update(sidebar(conf))
160
162
161 return render(request, 'dds_conf_edit.html', kwargs) No newline at end of file
163 return render(request, 'dds_conf_edit.html', kwargs)
@@ -1,7 +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>-?\d+)/$', 'apps.jars.views.jars_config', name='jars'),
4 # url(r'^(?P<id>-?\d+)/$', 'apps.jars.views.jars_config', name='jars'),
5 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_jars_conf'),
5 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_jars_conf'),
6 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_jars_conf'),
6 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_jars_conf'),
7 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_jars_conf'),
8 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_jars_conf'),
9 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_jars_conf'),
10 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_jars_conf'),
7 )
11 )
@@ -1,32 +1,35
1 from django.shortcuts import render_to_response
1 from django.shortcuts import render_to_response
2 from django.template import RequestContext
2 from django.template import RequestContext
3
3
4 from apps.main.models import Device
4 from apps.main.models import Device
5 from apps.main.views import sidebar
6
5 from .models import JARSConfiguration
7 from .models import JARSConfiguration
6 from .forms import JARSConfigurationForm
8 from .forms import JARSConfigurationForm
7 # Create your views here.
9 # Create your views here.
8
10
9 def jars_config(request, id):
11 def jars_config(request, id):
10
12
11 if id:
13 if id:
12 conf = JARSConfiguration.objects.get(pk=id)
14 conf = JARSConfiguration.objects.get(pk=id)
13 devices = Device.objects.filter(configuration__experiment=conf.experiment)
15 devices = Device.objects.filter(configuration__experiment=conf.experiment)
14 devices = devices.values('configuration__id', 'device_type__name')
16 devices = devices.values('configuration__id', 'device_type__name')
15 for device in devices:
17 for device in devices:
16 if device['device_type__name']=='jars':
18 if device['device_type__name']=='jars':
17 device['active'] = 'active'
19 device['active'] = 'active'
18 form = JARSConfigurationForm(instance=conf)
20 # form = JARSConfigurationForm(instance=conf)
19 else:
21 # else:
20 form = JARSConfigurationForm()
22 # form = JARSConfigurationForm()
21
23
22 kwargs = {
24 kwargs = {
23 'form': form,
24 'devices':devices,
25 'dev_conf': conf
25 'dev_conf': conf
26 }
26 }
27
27
28 ###### SIDEBAR ######
29 kwargs.update(sidebar(conf))
30
28 return render_to_response('jars.html', kwargs, context_instance=RequestContext(request))
31 return render_to_response('jars.html', kwargs, context_instance=RequestContext(request))
29
32
30
33
31
34
32
35
@@ -1,112 +1,131
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 CONF_TYPES = (
5 CONF_TYPES = (
6 (0, 'Active'),
6 (0, 'Active'),
7 (1, 'Historical'),
7 (1, 'Historical'),
8 )
8 )
9
9
10 DEV_STATES = (
10 DEV_STATES = (
11 (0, 'No connected'),
11 (0, 'No connected'),
12 (1, 'Connected'),
12 (1, 'Connected'),
13 (2, 'Configured'),
13 (2, 'Configured'),
14 (3, 'Running'),
14 (3, 'Running'),
15 )
15 )
16
16
17 DEV_TYPES = (
17 DEV_TYPES = (
18 ('', 'Select a device type'),
18 ('', 'Select a device type'),
19 ('rc', 'Radar Controller'),
19 ('rc', 'Radar Controller'),
20 ('dds', 'Direct Digital Synthesizer'),
20 ('dds', 'Direct Digital Synthesizer'),
21 ('jars', 'Jicamarca Radar Acquisition System'),
21 ('jars', 'Jicamarca Radar Acquisition System'),
22 ('usrp', 'Universal Software Radio Peripheral'),
22 ('usrp', 'Universal Software Radio Peripheral'),
23 ('cgs', 'Clock Generator System'),
23 ('cgs', 'Clock Generator System'),
24 ('abs', 'Automatic Beam Switching'),
24 ('abs', 'Automatic Beam Switching'),
25 )
25 )
26
26
27 # Create your models here.
27 # Create your models here.
28
28
29 class DeviceType(models.Model):
29 class DeviceType(models.Model):
30
30
31 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
31 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
32
32
33 description = models.TextField(blank=True, null=True)
33 description = models.TextField(blank=True, null=True)
34
34
35 # info = models.TextField(blank=True, null=True)
35 # info = models.TextField(blank=True, null=True)
36 # status = models.PositiveSmallIntegerField(default=1, choices=STATES)
36 # status = models.PositiveSmallIntegerField(default=1, choices=STATES)
37
37
38 class Meta:
38 class Meta:
39 db_table = 'db_device_types'
39 db_table = 'db_device_types'
40
40
41 def __unicode__(self):
41 def __unicode__(self):
42 return u'%s' % self.get_name_display()
42 return u'%s' % self.get_name_display()
43
43
44 class Device(models.Model):
44 class Device(models.Model):
45
45
46 device_type = models.ForeignKey(DeviceType)
46 device_type = models.ForeignKey(DeviceType)
47 name = models.CharField(max_length=40, default='')
47 name = models.CharField(max_length=40, default='')
48 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
48 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
49 port_address = models.PositiveSmallIntegerField(default=2000)
49 port_address = models.PositiveSmallIntegerField(default=2000)
50 description = models.TextField(blank=True, null=True)
50 description = models.TextField(blank=True, null=True)
51 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
51 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
52
52
53 # serial_number = models.CharField(max_length=40, default='')
53 # serial_number = models.CharField(max_length=40, default='')
54 # mac_address = models.CharField(max_length = 20, null=True, blank=True)
54 # mac_address = models.CharField(max_length = 20, null=True, blank=True)
55
55
56
56
57 class Meta:
57 class Meta:
58 db_table = 'db_devices'
58 db_table = 'db_devices'
59
59
60 def __unicode__(self):
60 def __unicode__(self):
61 return u'%s | %s' % (self.name, self.ip_address)
61 return u'%s | %s' % (self.name, self.ip_address)
62
62
63 class Campaign(models.Model):
63 class Campaign(models.Model):
64
64
65 name = models.CharField(max_length=40, unique=True)
65 name = models.CharField(max_length=40, unique=True)
66 start_date = models.DateTimeField(blank=True, null=True)
66 start_date = models.DateTimeField(blank=True, null=True)
67 end_date = models.DateTimeField(blank=True, null=True)
67 end_date = models.DateTimeField(blank=True, null=True)
68 tags = models.CharField(max_length=40)
68 tags = models.CharField(max_length=40)
69 description = models.TextField(blank=True, null=True)
69 description = models.TextField(blank=True, null=True)
70 template = models.BooleanField(default=False)
70 template = models.BooleanField(default=False)
71
71
72 class Meta:
72 class Meta:
73 db_table = 'db_campaigns'
73 db_table = 'db_campaigns'
74
74
75 def __unicode__(self):
75 def __unicode__(self):
76 return u'%s' % (self.name)
76 return u'%s' % (self.name)
77
77
78 class Experiment(models.Model):
78 class Experiment(models.Model):
79
79
80 campaign = models.ForeignKey(Campaign)
80 campaign = models.ForeignKey(Campaign)
81 name = models.CharField(max_length=40, default='')
81 name = models.CharField(max_length=40, default='')
82 start_time = models.TimeField(default='00:00:00')
82 start_time = models.TimeField(default='00:00:00')
83 end_time = models.TimeField(default='23:59:59')
83 end_time = models.TimeField(default='23:59:59')
84
84
85 class Meta:
85 class Meta:
86 db_table = 'db_experiments'
86 db_table = 'db_experiments'
87
87
88 def __unicode__(self):
88 def __unicode__(self):
89 return u'[%s]: %s' % (self.campaign.name, self.name)
89 return u'[%s]: %s' % (self.campaign.name, self.name)
90
90
91 class Configuration(PolymorphicModel):
91 class Configuration(PolymorphicModel):
92
92
93 experiment = models.ForeignKey(Experiment)
93 experiment = models.ForeignKey(Experiment)
94 device = models.ForeignKey(Device)
94 device = models.ForeignKey(Device)
95 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
95 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
96
96
97 created_date = models.DateTimeField(auto_now_add=True)
97 created_date = models.DateTimeField(auto_now_add=True)
98 programmed_date = models.DateTimeField(auto_now=True)
98 programmed_date = models.DateTimeField(auto_now=True)
99
99
100 parameters = models.TextField(default='{}')
100 parameters = models.TextField(default='{}')
101
101
102 class Meta:
102 class Meta:
103 db_table = 'db_configurations'
103 db_table = 'db_configurations'
104
104
105 def __unicode__(self):
105 def __unicode__(self):
106 return u'[%s - %s]: %s' % (self.experiment.campaign.name,
106 return u'[%s - %s]: %s' % (self.experiment.campaign.name,
107 self.experiment.name,
107 self.experiment.name,
108 self.device.name)
108 self.device.name)
109 def get_absolute_url(self):
109 def get_absolute_url(self):
110 from django.core.urlresolvers import reverse
110 from django.core.urlresolvers import reverse
111 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
111 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
112 No newline at end of file
112
113 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
117 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)])
120
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)])
124
125 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)])
128
129 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
@@ -1,126 +1,127
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 {% endif %}
93 <br>
94 {% endif %}
94 {% endblock %}
95 {% endblock %}
95 <br>
96
96 {% block content %}
97 {% block content %}
97 {% endblock %}
98 {% endblock %}
98 <br>
99 <br>
99 </div>
100 </div>
100
101
101
102
102 </div><!--/row-->
103 </div><!--/row-->
103 </div> <!-- container -->
104 </div> <!-- container -->
104
105
105 <div id="debug">{{debug}}</div>
106 <div id="debug">{{debug}}</div>
106
107
107 {% block footer %}
108 {% block footer %}
108 <footer class="footer">
109 <footer class="footer">
109 <div class="container">
110 <div class="container">
110 <p><hr></p>
111 <p><hr></p>
111 <p>
112 <p>
112 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
113 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
113 </p>
114 </p>
114 </div>
115 </div>
115 </footer>
116 </footer>
116 {% endblock %}
117 {% endblock %}
117
118
118 {# bootstrap_javascript jquery=True #}
119 {# bootstrap_javascript jquery=True #}
119 <script src="{% static 'js/jquery.min.js' %}"></script>
120 <script src="{% static 'js/jquery.min.js' %}"></script>
120 <script src="{% static 'js/bootstrap.min.js' %}"></script>
121 <script src="{% static 'js/bootstrap.min.js' %}"></script>
121 <script src="{% static 'js/jquery-ui.min.js' %}"></script>
122 <script src="{% static 'js/jquery-ui.min.js' %}"></script>
122 {% block extra-js %}
123 {% block extra-js %}
123 {% endblock%}
124 {% endblock%}
124 </body>
125 </body>
125 </html>
126 </html>
126
127
@@ -1,38 +1,64
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
12
13 <table class="table table-bordered">
13 <table class="table table-bordered">
14 <tr><th>Status</th><td>{%if connected == True %} &#9752; Connected {% else %} &#9940; Disconnected {% endif %}</td></tr>
14 <tr>
15 {% for key in dev_conf_keys %}
15 <th>Status</th>
16 <tr><th>{{key|title}}</th><td>{{dev_conf|attr:key}}</td></tr>
16 <td>{%if connected == True %} &#9752; Connected {% else %} &#9940; Disconnected {% endif %}</td>
17 {% endfor %}
17 </tr>
18
19 {% for key in dev_conf_keys %}
20 <tr>
21 <th>{% get_verbose_field_name dev_conf key %}</th>
22 <td>{{dev_conf|attr:key}}</td>
23 </tr>
24 {% endfor %}
18 </table>
25 </table>
19
26
20 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_send">Send</button>
21 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_export">Export</button>
27 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_export">Export</button>
28 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_import">Import</button>
22 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit">Edit</button>
29 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit">Edit</button>
23 <br></br>
30
31 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_read">Read</button>
32 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_write">Write</button>
33
24 {% endblock %}
34 {% endblock %}
25
35
26 {% block sidebar%}
36 {% block sidebar%}
27 {% include "sidebar_devices.html" %}
37 {% include "sidebar_devices.html" %}
28 {% endblock %}
38 {% endblock %}
29
39
30 {% block extra-js%}
40 {% block extra-js%}
31 <script type="text/javascript">
41 <script type="text/javascript">
32
42
33 $("#bt_edit").click(function() {
43 $("#bt_edit").click(function() {
34 document.location = "{% url 'url_edit_dev_conf' dev_conf.id%}";
44 document.location = "{{ dev_conf.get_absolute_url_edit }}";
45 });
46
47 $("#bt_read").click(function() {
48 document.location = "{{ dev_conf.get_absolute_url_read }}";
49 });
50
51 $("#bt_write").click(function() {
52 document.location = "{{ dev_conf.get_absolute_url_write }}";
53 });
54
55 $("#bt_import").click(function() {
56 document.location = "{{ dev_conf.get_absolute_url_import }}";
57 });
58
59 $("#bt_export").click(function() {
60 document.location = "{{ dev_conf.get_absolute_url_export }}";
35 });
61 });
36
62
37 </script>
63 </script>
38 {% endblock %} No newline at end of file
64 {% endblock %}
@@ -1,50 +1,50
1 {% extends "base.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
2 {% load bootstrap3 %}
3 {% load static %}
3 {% load static %}
4 {% load main_tags %}
4 {% load main_tags %}
5 {% block extra-head %}
5 {% block extra-head %}
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
7 {% endblock %}
7 {% endblock %}
8
8
9 {% block conf-active %}active{% endblock %}
9 {% block conf-active %}active{% endblock %}
10
10
11 {% block content-title %}{{title}}{% endblock %}
11 {% block content-title %}{{title}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
13
13
14 {% block content %}
14 {% block content %}
15 <table class="table table-hover">
15 <table class="table table-hover">
16 <tr>
16 <tr>
17 <th>#</th>
17 <th>#</th>
18 {% for key in configuration_keys %}
18 {% for key in configuration_keys %}
19 <th>{{ key|title }}</th>
19 <th>{{ key|title }}</th>
20 {% endfor%}
20 {% endfor%}
21 </tr>
21 </tr>
22 {% for item in configurations %}
22 {% for item in configurations %}
23 <tr class="clickable-row" data-href="/{{item.device.device_type.name}}/{{item.id}}/">
23 <tr class="clickable-row" data-href="{{item.get_absolute_url}}">
24 <td>{{ forloop.counter }}</td>
24 <td>{{ forloop.counter }}</td>
25 {% for key in configuration_keys %}
25 {% for key in configuration_keys %}
26 <td>{{ item|attr:key }}</td>
26 <td>{{ item|attr:key }}</td>
27 {% endfor %}
27 {% endfor %}
28 </tr>
28 </tr>
29 {% endfor %}
29 {% endfor %}
30 </table>
30 </table>
31 <button class="btn btn-primary pull-right" id="bt_add">{{button}}</button>
31 <button class="btn btn-primary pull-right" id="bt_add">{{button}}</button>
32 {% endblock %}
32 {% endblock %}
33
33
34 {% block sidebar%}
34 {% block sidebar%}
35 {% include "sidebar_devices.html" %}
35 {% include "sidebar_devices.html" %}
36 {% endblock %}
36 {% endblock %}
37
37
38 {% block extra-js%}
38 {% block extra-js%}
39 <script type="text/javascript">
39 <script type="text/javascript">
40
40
41 $("#bt_add").click(function() {
41 $("#bt_add").click(function() {
42 document.location = "{% url 'url_add_dev_conf' 0%}";
42 document.location = "{% url 'url_add_dev_conf' 0%}";
43 });
43 });
44
44
45 $(".clickable-row").click(function() {
45 $(".clickable-row").click(function() {
46 document.location = $(this).data("href");
46 document.location = $(this).data("href");
47 });
47 });
48
48
49 </script>
49 </script>
50 {% endblock %} No newline at end of file
50 {% endblock %}
@@ -1,11 +1,25
1 from django.template.defaulttags import register
1 from django.template.defaulttags import register
2
2
3 @register.filter
3 @register.filter
4 def attr(object, key):
4 def attr(instance, key):
5 if hasattr(object, key):
5
6 return getattr(object, key)
6 display_key = "get_" + key + "_display"
7 return object.get(key)
7
8 if hasattr(instance, display_key):
9 return getattr(instance, display_key)()
10
11 if hasattr(instance, key):
12 return getattr(instance, key)
13
14 return instance.get(key)
8
15
9 @register.filter
16 @register.filter
10 def title(s):
17 def title(s):
11 return s.replace('_', ' ').title() No newline at end of file
18 return s.replace('_', ' ').title()
19
20 @register.simple_tag
21 def get_verbose_field_name(instance, field_name):
22 """
23 Returns verbose_name for a field.
24 """
25 return instance._meta.get_field(field_name).verbose_name.title() No newline at end of file
@@ -1,477 +1,569
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
3
3 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm
4 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm
4 from apps.cgs.forms import CGSConfigurationForm
5 from apps.cgs.forms import CGSConfigurationForm
5 from apps.jars.forms import JARSConfigurationForm
6 from apps.jars.forms import JARSConfigurationForm
6 from apps.usrp.forms import USRPConfigurationForm
7 from apps.usrp.forms import USRPConfigurationForm
7 from apps.abs.forms import ABSConfigurationForm
8 from apps.abs.forms import ABSConfigurationForm
8 from apps.rc.forms import RCConfigurationForm
9 from apps.rc.forms import RCConfigurationForm
9 from apps.dds.forms import DDSConfigurationForm
10 from apps.dds.forms import DDSConfigurationForm
10
11
11 from .models import Campaign, Experiment, Device, Configuration
12 from .models import Campaign, Experiment, Device, Configuration
12 from apps.cgs.models import CGSConfiguration
13 from apps.cgs.models import CGSConfiguration
13 from apps.jars.models import JARSConfiguration
14 from apps.jars.models import JARSConfiguration
14 from apps.usrp.models import USRPConfiguration
15 from apps.usrp.models import USRPConfiguration
15 from apps.abs.models import ABSConfiguration
16 from apps.abs.models import ABSConfiguration
16 from apps.rc.models import RCConfiguration
17 from apps.rc.models import RCConfiguration
17 from apps.dds.models import DDSConfiguration
18 from apps.dds.models import DDSConfiguration
18
19
19 # Create your views here.
20 # Create your views here.
20
21
21 CONF_FORMS = {
22 CONF_FORMS = {
22 'rc': RCConfigurationForm,
23 'rc': RCConfigurationForm,
23 'dds': DDSConfigurationForm,
24 'dds': DDSConfigurationForm,
24 'jars': JARSConfigurationForm,
25 'jars': JARSConfigurationForm,
25 'cgs': CGSConfigurationForm,
26 'cgs': CGSConfigurationForm,
26 'abs': ABSConfigurationForm,
27 'abs': ABSConfigurationForm,
27 'usrp': USRPConfigurationForm,
28 'usrp': USRPConfigurationForm,
28 }
29 }
29
30
30 CONF_MODELS = {
31 CONF_MODELS = {
31 'rc': RCConfiguration,
32 'rc': RCConfiguration,
32 'dds': DDSConfiguration,
33 'dds': DDSConfiguration,
33 'jars': JARSConfiguration,
34 'jars': JARSConfiguration,
34 'cgs': CGSConfiguration,
35 'cgs': CGSConfiguration,
35 'abs': ABSConfiguration,
36 'abs': ABSConfiguration,
36 'usrp': USRPConfiguration,
37 'usrp': USRPConfiguration,
37 }
38 }
38
39
39 def index(request):
40 def index(request):
40 kwargs = {}
41 kwargs = {}
41
42
42 return render(request, 'index.html', kwargs)
43 return render(request, 'index.html', kwargs)
43
44
44 def devices(request):
45 def devices(request):
45
46
46 devices = Device.objects.all().order_by('device_type__name')
47 devices = Device.objects.all().order_by('device_type__name')
47
48
48 # keys = ['id', 'device_type__name', 'name', 'ip_address']
49 # keys = ['id', 'device_type__name', 'name', 'ip_address']
49 keys = ['id', 'name', 'ip_address', 'device_type']
50 keys = ['id', 'name', 'ip_address', 'device_type']
50
51
51 kwargs = {}
52 kwargs = {}
52 kwargs['device_keys'] = keys[1:]
53 kwargs['device_keys'] = keys[1:]
53 kwargs['devices'] = devices#.values(*keys)
54 kwargs['devices'] = devices#.values(*keys)
54 kwargs['title'] = 'Device'
55 kwargs['title'] = 'Device'
55 kwargs['suptitle'] = 'List'
56 kwargs['suptitle'] = 'List'
56 kwargs['button'] = 'New Device'
57 kwargs['button'] = 'New Device'
57
58
58 return render(request, 'devices.html', kwargs)
59 return render(request, 'devices.html', kwargs)
59
60
60 def device(request, id_dev):
61 def device(request, id_dev):
61
62
62 device = get_object_or_404(Device, pk=id_dev)
63 device = get_object_or_404(Device, pk=id_dev)
63
64
64 kwargs = {}
65 kwargs = {}
65 kwargs['device'] = device
66 kwargs['device'] = device
66 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
67 kwargs['device_keys'] = ['device_type', 'name', 'ip_address', 'port_address', 'description']
67
68
68 kwargs['title'] = 'Device'
69 kwargs['title'] = 'Device'
69 kwargs['suptitle'] = 'Details'
70 kwargs['suptitle'] = 'Details'
70
71
71 kwargs['button'] = 'Add Device'
72 kwargs['button'] = 'Add Device'
72
73
73 return render(request, 'device.html', kwargs)
74 return render(request, 'device.html', kwargs)
74
75
75 def device_new(request):
76 def device_new(request):
76
77
77 if request.method == 'GET':
78 if request.method == 'GET':
78 form = DeviceForm()
79 form = DeviceForm()
79
80
80 if request.method == 'POST':
81 if request.method == 'POST':
81 form = DeviceForm(request.POST)
82 form = DeviceForm(request.POST)
82
83
83 if form.is_valid():
84 if form.is_valid():
84 form.save()
85 form.save()
85 return redirect('url_devices')
86 return redirect('url_devices')
86
87
87 kwargs = {}
88 kwargs = {}
88 kwargs['form'] = form
89 kwargs['form'] = form
89 kwargs['title'] = 'Device'
90 kwargs['title'] = 'Device'
90 kwargs['suptitle'] = 'New'
91 kwargs['suptitle'] = 'New'
91 kwargs['button'] = 'Create'
92 kwargs['button'] = 'Create'
92
93
93 return render(request, 'device_edit.html', kwargs)
94 return render(request, 'device_edit.html', kwargs)
94
95
95 def device_edit(request, id_dev):
96 def device_edit(request, id_dev):
96
97
97 device = get_object_or_404(Device, pk=id_dev)
98 device = get_object_or_404(Device, pk=id_dev)
98
99
99 if request.method=='GET':
100 if request.method=='GET':
100 form = DeviceForm(instance=device)
101 form = DeviceForm(instance=device)
101
102
102 if request.method=='POST':
103 if request.method=='POST':
103 form = DeviceForm(request.POST, instance=device)
104 form = DeviceForm(request.POST, instance=device)
104
105
105 if form.is_valid():
106 if form.is_valid():
106 form.save()
107 form.save()
107 return redirect('url_devices')
108 return redirect('url_devices')
108
109
109 kwargs = {}
110 kwargs = {}
110 kwargs['form'] = form
111 kwargs['form'] = form
111 kwargs['title'] = 'Device'
112 kwargs['title'] = 'Device'
112 kwargs['suptitle'] = 'Edit'
113 kwargs['suptitle'] = 'Edit'
113 kwargs['button'] = 'Update'
114 kwargs['button'] = 'Update'
114
115
115 return render(request, 'device_edit.html', kwargs)
116 return render(request, 'device_edit.html', kwargs)
116
117
117 def device_delete(request, id_dev):
118 def device_delete(request, id_dev):
118
119
119 device = get_object_or_404(Device, pk=id_dev)
120 device = get_object_or_404(Device, pk=id_dev)
120
121
121 if request.method=='POST':
122 if request.method=='POST':
122
123
123 if request.user.is_staff:
124 if request.user.is_staff:
124 device.delete()
125 device.delete()
125 return redirect('url_devices')
126 return redirect('url_devices')
126
127
127 return HttpResponse("Not enough permission to delete this object")
128 return HttpResponse("Not enough permission to delete this object")
128
129
129 kwargs = {'object':device, 'dev_active':'active',
130 kwargs = {'object':device, 'dev_active':'active',
130 'url_cancel':'url_device', 'id_item':id_dev}
131 'url_cancel':'url_device', 'id_item':id_dev}
131
132
132 return render(request, 'item_delete.html', kwargs)
133 return render(request, 'item_delete.html', kwargs)
133
134
134 def campaigns(request):
135 def campaigns(request):
135
136
136 campaigns = Campaign.objects.all().order_by('start_date')
137 campaigns = Campaign.objects.all().order_by('start_date')
137
138
138 keys = ['id', 'name', 'start_date', 'end_date']
139 keys = ['id', 'name', 'start_date', 'end_date']
139
140
140 kwargs = {}
141 kwargs = {}
141 kwargs['campaign_keys'] = keys[1:]
142 kwargs['campaign_keys'] = keys[1:]
142 kwargs['campaigns'] = campaigns#.values(*keys)
143 kwargs['campaigns'] = campaigns#.values(*keys)
143 kwargs['title'] = 'Campaign'
144 kwargs['title'] = 'Campaign'
144 kwargs['suptitle'] = 'List'
145 kwargs['suptitle'] = 'List'
145 kwargs['button'] = 'New Campaign'
146 kwargs['button'] = 'New Campaign'
146
147
147 return render(request, 'campaigns.html', kwargs)
148 return render(request, 'campaigns.html', kwargs)
148
149
149 def campaign(request, id_camp):
150 def campaign(request, id_camp):
150
151
151 campaign = get_object_or_404(Campaign, pk=id_camp)
152 campaign = get_object_or_404(Campaign, pk=id_camp)
152 experiments = Experiment.objects.filter(campaign=campaign)
153 experiments = Experiment.objects.filter(campaign=campaign)
153
154
154 form = CampaignForm(instance=campaign)
155 form = CampaignForm(instance=campaign)
155
156
156 kwargs = {}
157 kwargs = {}
157 kwargs['campaign'] = campaign
158 kwargs['campaign'] = campaign
158 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
159 kwargs['campaign_keys'] = ['name', 'start_date', 'end_date', 'tags', 'description']
159
160
160 keys = ['id', 'name', 'start_time', 'end_time']
161 keys = ['id', 'name', 'start_time', 'end_time']
161
162
162 kwargs['experiment_keys'] = keys[1:]
163 kwargs['experiment_keys'] = keys[1:]
163 kwargs['experiments'] = experiments.values(*keys)
164 kwargs['experiments'] = experiments.values(*keys)
164
165
165 kwargs['title'] = 'Campaign'
166 kwargs['title'] = 'Campaign'
166 kwargs['suptitle'] = 'Details'
167 kwargs['suptitle'] = 'Details'
167
168
168 kwargs['form'] = form
169 kwargs['form'] = form
169 kwargs['button'] = 'Add Experiment'
170 kwargs['button'] = 'Add Experiment'
170
171
171 return render(request, 'campaign.html', kwargs)
172 return render(request, 'campaign.html', kwargs)
172
173
173 def campaign_new(request):
174 def campaign_new(request):
174
175
175 if request.method == 'GET':
176 if request.method == 'GET':
176 form = CampaignForm()
177 form = CampaignForm()
177
178
178 if request.method == 'POST':
179 if request.method == 'POST':
179 form = CampaignForm(request.POST)
180 form = CampaignForm(request.POST)
180
181
181 if form.is_valid():
182 if form.is_valid():
182 campaign = form.save()
183 campaign = form.save()
183 return redirect('url_campaign', id_camp=campaign.id)
184 return redirect('url_campaign', id_camp=campaign.id)
184
185
185 kwargs = {}
186 kwargs = {}
186 kwargs['form'] = form
187 kwargs['form'] = form
187 kwargs['title'] = 'Campaign'
188 kwargs['title'] = 'Campaign'
188 kwargs['suptitle'] = 'New'
189 kwargs['suptitle'] = 'New'
189 kwargs['button'] = 'Create'
190 kwargs['button'] = 'Create'
190
191
191 return render(request, 'campaign_edit.html', kwargs)
192 return render(request, 'campaign_edit.html', kwargs)
192
193
193 def campaign_edit(request, id_camp):
194 def campaign_edit(request, id_camp):
194
195
195 campaign = get_object_or_404(Campaign, pk=id_camp)
196 campaign = get_object_or_404(Campaign, pk=id_camp)
196
197
197 if request.method=='GET':
198 if request.method=='GET':
198 form = CampaignForm(instance=campaign)
199 form = CampaignForm(instance=campaign)
199
200
200 if request.method=='POST':
201 if request.method=='POST':
201 form = CampaignForm(request.POST, instance=campaign)
202 form = CampaignForm(request.POST, instance=campaign)
202
203
203 if form.is_valid():
204 if form.is_valid():
204 form.save()
205 form.save()
205 return redirect('url_campaign', id_camp=id_camp)
206 return redirect('url_campaign', id_camp=id_camp)
206
207
207 kwargs = {}
208 kwargs = {}
208 kwargs['form'] = form
209 kwargs['form'] = form
209 kwargs['title'] = 'Campaign'
210 kwargs['title'] = 'Campaign'
210 kwargs['suptitle'] = 'Edit'
211 kwargs['suptitle'] = 'Edit'
211 kwargs['button'] = 'Update'
212 kwargs['button'] = 'Update'
212
213
213 return render(request, 'campaign_edit.html', kwargs)
214 return render(request, 'campaign_edit.html', kwargs)
214
215
215 def campaign_delete(request, id_camp):
216 def campaign_delete(request, id_camp):
216
217
217 campaign = get_object_or_404(Campaign, pk=id_camp)
218 campaign = get_object_or_404(Campaign, pk=id_camp)
218
219
219 if request.method=='POST':
220 if request.method=='POST':
220 if request.user.is_staff:
221 if request.user.is_staff:
221 campaign.delete()
222 campaign.delete()
222 return redirect('url_campaigns')
223 return redirect('url_campaigns')
223
224
224 return HttpResponse("Not enough permission to delete this object")
225 return HttpResponse("Not enough permission to delete this object")
225
226
226 kwargs = {'object':campaign, 'camp_active':'active',
227 kwargs = {'object':campaign, 'camp_active':'active',
227 'url_cancel':'url_campaign', 'id_item':id_camp}
228 'url_cancel':'url_campaign', 'id_item':id_camp}
228
229
229 return render(request, 'item_delete.html', kwargs)
230 return render(request, 'item_delete.html', kwargs)
230
231
231 def experiments(request):
232 def experiments(request):
232
233
233 experiment_list = Experiment.objects.all().order_by('campaign')
234 experiment_list = Experiment.objects.all().order_by('campaign')
234
235
235 keys = ['id', 'name', 'start_time', 'end_time', 'campaign']
236 keys = ['id', 'name', 'start_time', 'end_time', 'campaign']
236
237
237 kwargs = {}
238 kwargs = {}
238
239
239 kwargs['experiment_keys'] = keys[1:]
240 kwargs['experiment_keys'] = keys[1:]
240 kwargs['experiments'] = experiment_list#.values(*keys)
241 kwargs['experiments'] = experiment_list#.values(*keys)
241
242
242 kwargs['title'] = 'Experiment'
243 kwargs['title'] = 'Experiment'
243 kwargs['suptitle'] = 'List'
244 kwargs['suptitle'] = 'List'
244 kwargs['button'] = 'New Experiment'
245 kwargs['button'] = 'New Experiment'
245
246
246 return render(request, 'experiments.html', kwargs)
247 return render(request, 'experiments.html', kwargs)
247
248
248 def experiment(request, id_exp):
249 def experiment(request, id_exp):
249
250
250 experiment = get_object_or_404(Experiment, pk=id_exp)
251 experiment = get_object_or_404(Experiment, pk=id_exp)
251
252
252 experiments = Experiment.objects.filter(campaign=experiment.campaign)
253 experiments = Experiment.objects.filter(campaign=experiment.campaign)
253 configurations = Configuration.objects.filter(experiment=experiment)
254 configurations = Configuration.objects.filter(experiment=experiment)
254
255
255 kwargs = {}
256 kwargs = {}
256
257
257 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
258 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
258 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']
259
260
260
261
261 kwargs['experiment_keys'] = exp_keys[1:]
262 kwargs['experiment_keys'] = exp_keys[1:]
262 kwargs['experiment'] = experiment
263 kwargs['experiment'] = experiment
263
264
264 kwargs['experiments'] = experiments.values(*exp_keys)
265 kwargs['experiments'] = experiments.values(*exp_keys)
265
266
266 kwargs['configuration_keys'] = conf_keys[1:]
267 kwargs['configuration_keys'] = conf_keys[1:]
267 kwargs['configurations'] = configurations.values(*conf_keys)
268 kwargs['configurations'] = configurations.values(*conf_keys)
268
269
269 kwargs['title'] = 'Experiment'
270 kwargs['title'] = 'Experiment'
270 kwargs['suptitle'] = 'Details'
271 kwargs['suptitle'] = 'Details'
271
272
272 kwargs['button'] = 'Add Device'
273 kwargs['button'] = 'Add Device'
273
274
274 return render(request, 'experiment.html', kwargs)
275 return render(request, 'experiment.html', kwargs)
275
276
276 def experiment_new(request, id_camp=0):
277 def experiment_new(request, id_camp=0):
277
278
278 if request.method == 'GET':
279 if request.method == 'GET':
279 form = ExperimentForm(initial={'campaign':id_camp})
280 form = ExperimentForm(initial={'campaign':id_camp})
280
281
281 if request.method == 'POST':
282 if request.method == 'POST':
282 form = ExperimentForm(request.POST, initial={'campaign':id_camp})
283 form = ExperimentForm(request.POST, initial={'campaign':id_camp})
283
284
284 if form.is_valid():
285 if form.is_valid():
285 experiment = form.save()
286 experiment = form.save()
286 return redirect('url_experiment', id_exp=experiment.id)
287 return redirect('url_experiment', id_exp=experiment.id)
287
288
288 kwargs = {}
289 kwargs = {}
289 kwargs['form'] = form
290 kwargs['form'] = form
290 kwargs['title'] = 'Experiment'
291 kwargs['title'] = 'Experiment'
291 kwargs['suptitle'] = 'New'
292 kwargs['suptitle'] = 'New'
292 kwargs['button'] = 'Create'
293 kwargs['button'] = 'Create'
293
294
294 return render(request, 'experiment_edit.html', kwargs)
295 return render(request, 'experiment_edit.html', kwargs)
295
296
296 def experiment_edit(request, id_exp):
297 def experiment_edit(request, id_exp):
297
298
298 experiment = get_object_or_404(Experiment, pk=id_exp)
299 experiment = get_object_or_404(Experiment, pk=id_exp)
299
300
300 if request.method == 'GET':
301 if request.method == 'GET':
301 form = ExperimentForm(instance=experiment)
302 form = ExperimentForm(instance=experiment)
302
303
303 if request.method=='POST':
304 if request.method=='POST':
304 form = ExperimentForm(request.POST, instance=experiment)
305 form = ExperimentForm(request.POST, instance=experiment)
305
306
306 if form.is_valid():
307 if form.is_valid():
307 experiment = form.save()
308 experiment = form.save()
308 return redirect('url_experiment', id_exp=experiment.id)
309 return redirect('url_experiment', id_exp=experiment.id)
309
310
310 kwargs = {}
311 kwargs = {}
311 kwargs['form'] = form
312 kwargs['form'] = form
312 kwargs['title'] = 'Experiment'
313 kwargs['title'] = 'Experiment'
313 kwargs['suptitle'] = 'Edit'
314 kwargs['suptitle'] = 'Edit'
314 kwargs['button'] = 'Update'
315 kwargs['button'] = 'Update'
315
316
316 return render(request, 'experiment_edit.html', kwargs)
317 return render(request, 'experiment_edit.html', kwargs)
317
318
318 def experiment_delete(request, id_exp):
319 def experiment_delete(request, id_exp):
319
320
320 experiment = get_object_or_404(Experiment, pk=id_exp)
321 experiment = get_object_or_404(Experiment, pk=id_exp)
321
322
322 if request.method=='POST':
323 if request.method=='POST':
323 if request.user.is_staff:
324 if request.user.is_staff:
324 id_camp = experiment.campaign.id
325 id_camp = experiment.campaign.id
325 experiment.delete()
326 experiment.delete()
326 return redirect('url_campaign', id_camp=id_camp)
327 return redirect('url_campaign', id_camp=id_camp)
327
328
328 return HttpResponse("Not enough permission to delete this object")
329 return HttpResponse("Not enough permission to delete this object")
329
330
330 kwargs = {'object':experiment, 'exp_active':'active',
331 kwargs = {'object':experiment, 'exp_active':'active',
331 'url_cancel':'url_experiment', 'id_item':id_exp}
332 'url_cancel':'url_experiment', 'id_item':id_exp}
332
333
333 return render(request, 'item_delete.html', kwargs)
334 return render(request, 'item_delete.html', kwargs)
334
335
335 def dev_confs(request):
336 def dev_confs(request):
336
337
337 configurations = Configuration.objects.all().order_by('experiment')
338 configurations = Configuration.objects.all().order_by('experiment')
338
339
339 # 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']
340
341
341 keys = ['id', 'device', 'experiment']
342 keys = ['id', 'device', 'experiment', 'type', 'programmed_date']
342
343
343 kwargs = {}
344 kwargs = {}
344
345
345 kwargs['configuration_keys'] = keys[1:]
346 kwargs['configuration_keys'] = keys[1:]
346 kwargs['configurations'] = configurations#.values(*keys)
347 kwargs['configurations'] = configurations#.values(*keys)
347
348
348 kwargs['title'] = 'Configuration'
349 kwargs['title'] = 'Configuration'
349 kwargs['suptitle'] = 'List'
350 kwargs['suptitle'] = 'List'
350 kwargs['button'] = 'New Configuration'
351 kwargs['button'] = 'New Configuration'
351
352
352 return render(request, 'dev_confs.html', kwargs)
353 return render(request, 'dev_confs.html', kwargs)
353
354
354 def dev_conf(request, id_conf):
355 def dev_conf(request, id_conf):
355
356
356 conf = get_object_or_404(Configuration, pk=id_conf)
357 conf = get_object_or_404(Configuration, pk=id_conf)
357
358
358 DevConfModel = CONF_MODELS[conf.device.device_type.name]
359 DevConfModel = CONF_MODELS[conf.device.device_type.name]
359 dev_conf = DevConfModel.objects.get(pk=id_conf)
360 dev_conf = DevConfModel.objects.get(pk=id_conf)
360
361
361 kwargs = {}
362 kwargs = {}
362 kwargs['dev_conf'] = dev_conf
363 kwargs['dev_conf'] = dev_conf
363 kwargs['dev_conf_keys'] = ['experiment', 'device']
364 kwargs['dev_conf_keys'] = ['experiment', 'device']
364
365
365 kwargs['title'] = 'Configuration'
366 kwargs['title'] = 'Configuration'
366 kwargs['suptitle'] = 'Details'
367 kwargs['suptitle'] = 'Details'
367
368
368 kwargs['button'] = 'Edit Configuration'
369 kwargs['button'] = 'Edit Configuration'
369
370
370 ###### SIDEBAR ######
371 ###### SIDEBAR ######
371 experiments = Experiment.objects.filter(campaign=conf.experiment.campaign)
372 kwargs.update(sidebar(conf))
372 configurations = Configuration.objects.filter(experiment=conf.experiment)
373
374 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
375 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
376
377 kwargs['experiment_keys'] = exp_keys[1:]
378 kwargs['experiments'] = experiments.values(*exp_keys)
379
380 kwargs['configuration_keys'] = conf_keys[1:]
381 kwargs['configurations'] = configurations.values(*conf_keys)
382
373
383 return render(request, 'dev_conf.html', kwargs)
374 return render(request, 'dev_conf.html', kwargs)
384
375
385 def dev_conf_new(request, id_exp=0):
376 def dev_conf_new(request, id_exp=0):
386
377
387 if request.method == 'GET':
378 if request.method == 'GET':
388 form = ConfigurationForm(initial={'experiment':id_exp})
379 form = ConfigurationForm(initial={'experiment':id_exp})
389
380
390 if request.method == 'POST':
381 if request.method == 'POST':
391 form = ConfigurationForm(request.POST)
382 form = ConfigurationForm(request.POST)
392
383
393 if form.is_valid():
384 if form.is_valid():
394 experiment = Experiment.objects.get(pk=request.POST['experiment'])
385 experiment = Experiment.objects.get(pk=request.POST['experiment'])
395 device = Device.objects.get(pk=request.POST['device'])
386 device = Device.objects.get(pk=request.POST['device'])
396
387
397 exp_devices = Device.objects.filter(configuration__experiment=experiment)
388 exp_devices = Device.objects.filter(configuration__experiment=experiment)
398
389
399 if device.id not in exp_devices.values('id',):
390 if device.id not in exp_devices.values('id',):
400
391
401 DevConfModel = CONF_MODELS[device.device_type.name]
392 DevConfModel = CONF_MODELS[device.device_type.name]
402 conf = DevConfModel(experiment=experiment, device=device)
393 conf = DevConfModel(experiment=experiment, device=device)
403 conf.save()
394 conf.save()
404
395
405 return redirect('url_experiment', id_exp=experiment.id)
396 return redirect('url_experiment', id_exp=experiment.id)
406
397
407 kwargs = {}
398 kwargs = {}
408 kwargs['form'] = form
399 kwargs['form'] = form
409 kwargs['title'] = 'Configuration'
400 kwargs['title'] = 'Configuration'
410 kwargs['suptitle'] = 'New'
401 kwargs['suptitle'] = 'New'
411 kwargs['button'] = 'Create'
402 kwargs['button'] = 'Create'
412
403
404 ###### SIDEBAR ######
405 kwargs.update(sidebar(conf))
406
413 return render(request, 'dev_conf_edit.html', kwargs)
407 return render(request, 'dev_conf_edit.html', kwargs)
414
408
415 def dev_conf_edit(request, id_conf):
409 def dev_conf_edit(request, id_conf):
416
410
417 conf = get_object_or_404(Configuration, pk=id_conf)
411 conf = get_object_or_404(Configuration, pk=id_conf)
418
412
419 DevConfModel = CONF_MODELS[conf.device.device_type.name]
413 DevConfModel = CONF_MODELS[conf.device.device_type.name]
420 DevConfForm = CONF_FORMS[conf.device.device_type.name]
414 DevConfForm = CONF_FORMS[conf.device.device_type.name]
421
415
422 dev_conf = DevConfModel.objects.get(pk=id_conf)
416 dev_conf = DevConfModel.objects.get(pk=id_conf)
423
417
424 if request.method=='GET':
418 if request.method=='GET':
425 form = DevConfForm(instance=dev_conf)
419 form = DevConfForm(instance=dev_conf)
426
420
427 if request.method=='POST':
421 if request.method=='POST':
428 form = DevConfForm(request.POST, instance=dev_conf)
422 form = DevConfForm(request.POST, instance=dev_conf)
429
423
430 if form.is_valid():
424 if form.is_valid():
431 form.save()
425 form.save()
432 return redirect('url_dev_conf', id_conf=id_conf)
426 return redirect('url_dev_conf', id_conf=id_conf)
433
427
434 kwargs = {}
428 kwargs = {}
435 kwargs['form'] = form
429 kwargs['form'] = form
436 kwargs['title'] = 'Device Configuration'
430 kwargs['title'] = 'Device Configuration'
437 kwargs['suptitle'] = 'Edit'
431 kwargs['suptitle'] = 'Edit'
438 kwargs['button'] = 'Update'
432 kwargs['button'] = 'Update'
439
433
434 ###### SIDEBAR ######
435 kwargs.update(sidebar(conf))
436
440 return render(request, 'dev_conf_edit.html', kwargs)
437 return render(request, 'dev_conf_edit.html', kwargs)
441
438
439 def dev_conf_read(request, id_conf):
440
441 conf = get_object_or_404(Configuration, pk=id_conf)
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))
457
458 messages.error(request, "Read View not implemented yet for this configuration")
459
460 return render(request, 'dev_conf.html', kwargs)
461
462 def dev_conf_write(request, id_conf):
463
464 conf = get_object_or_404(Configuration, pk=id_conf)
465
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))
480
481 messages.error(request, "Write View not implemented yet for this configuration")
482
483 return render(request, 'dev_conf.html', kwargs)
484
485 def dev_conf_import(request, id_conf):
486
487 conf = get_object_or_404(Configuration, pk=id_conf)
488
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))
503
504 messages.error(request, "Import View not implemented yet for this configuration")
505
506 return render(request, 'dev_conf.html', kwargs)
507
508 def dev_conf_export(request, id_conf):
509
510 conf = get_object_or_404(Configuration, pk=id_conf)
511
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))
526
527 messages.error(request, "Export View not implemented yet for this configuration")
528
529 return render(request, 'dev_conf.html', kwargs)
530
442 def dev_conf_delete(request, id_conf):
531 def dev_conf_delete(request, id_conf):
443
532
444 conf = get_object_or_404(Configuration, pk=id_conf)
533 conf = get_object_or_404(Configuration, pk=id_conf)
445
534
446 if request.method=='POST':
535 if request.method=='POST':
447 if request.user.is_staff:
536 if request.user.is_staff:
448 id_exp = conf.experiment.id
537 id_exp = conf.experiment.id
449 conf.delete()
538 conf.delete()
450 return redirect('url_experiment', id_exp=id_exp)
539 return redirect('url_experiment', id_exp=id_exp)
451
540
452 return HttpResponse("Not enough permission to delete this object")
541 return HttpResponse("Not enough permission to delete this object")
453
542
454 kwargs = {'object':conf, 'conf_active':'active',
543 kwargs = {'object':conf, 'conf_active':'active',
455 'url_cancel':'url_dev_conf', 'id_item':id_conf}
544 'url_cancel':'url_dev_conf', 'id_item':id_conf}
456
545
546 ###### SIDEBAR ######
547 kwargs.update(sidebar(conf))
548
457 return render(request, 'item_delete.html', kwargs)
549 return render(request, 'item_delete.html', kwargs)
458
550
459 def sidebar(conf):
551 def sidebar(conf):
460
552
461 experiments = Experiment.objects.filter(campaign=conf.experiment.campaign)
553 experiments = Experiment.objects.filter(campaign=conf.experiment.campaign)
462 configurations = Configuration.objects.filter(experiment=conf.experiment)
554 configurations = Configuration.objects.filter(experiment=conf.experiment, type=0)
463
555
464 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
556 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
465 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
557 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
466
558
467 kwargs = {}
559 kwargs = {}
468
560
469 kwargs['dev_conf'] = conf
561 kwargs['dev_conf'] = conf
470
562
471 kwargs['experiment_keys'] = exp_keys[1:]
563 kwargs['experiment_keys'] = exp_keys[1:]
472 kwargs['experiments'] = experiments.values(*exp_keys)
564 kwargs['experiments'] = experiments.values(*exp_keys)
473
565
474 kwargs['configuration_keys'] = conf_keys[1:]
566 kwargs['configuration_keys'] = conf_keys[1:]
475 kwargs['configurations'] = configurations.values(*conf_keys)
567 kwargs['configurations'] = configurations.values(*conf_keys)
476
568
477 return kwargs No newline at end of file
569 return kwargs
@@ -1,11 +1,16
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>-?\d+)/$', 'apps.rc.views.conf', name='url_rc_conf'),
4 url(r'^(?P<id>-?\d+)/$', 'apps.rc.views.conf', name='url_rc_conf'),
5 url(r'^(?P<id>-?\d+)/edit/$', 'apps.rc.views.conf_edit', name='url_edit_rc_conf'),
5 url(r'^(?P<id>-?\d+)/edit/$', 'apps.rc.views.conf_edit', name='url_edit_rc_conf'),
6 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_rc_conf'),
7 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_rc_conf'),
8 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_rc_conf'),
9 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_rc_conf'),
10
6 url(r'^(?P<conf_id>-?\d+)/add_line/$', 'apps.rc.views.add_line', name='url_add_rc_line'),
11 url(r'^(?P<conf_id>-?\d+)/add_line/$', 'apps.rc.views.add_line', name='url_add_rc_line'),
7 url(r'^(?P<conf_id>-?\d+)/update_lines/$', 'apps.rc.views.update_lines', name='url_update_rc_lines'),
12 url(r'^(?P<conf_id>-?\d+)/update_lines/$', 'apps.rc.views.update_lines', name='url_update_rc_lines'),
8 url(r'^(?P<conf_id>-?\d+)/edit_lines/$', 'apps.rc.views.edit_lines', name='url_edit_rc_lines'),
13 url(r'^(?P<conf_id>-?\d+)/edit_lines/$', 'apps.rc.views.edit_lines', name='url_edit_rc_lines'),
9 url(r'^(?P<conf_id>-?\d+)/add_line/(?P<line_type_id>-?\d+)/$', 'apps.rc.views.add_line', name='url_add_rc_line'),
14 url(r'^(?P<conf_id>-?\d+)/add_line/(?P<line_type_id>-?\d+)/$', 'apps.rc.views.add_line', name='url_add_rc_line'),
10 url(r'^(?P<conf_id>-?\d+)/line/(?P<line_id>-?\d+)/delete/$', 'apps.rc.views.remove_line', name='url_remove_rc_line'),
15 url(r'^(?P<conf_id>-?\d+)/line/(?P<line_id>-?\d+)/delete/$', 'apps.rc.views.remove_line', name='url_remove_rc_line'),
11 )
16 )
@@ -1,6 +1,10
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.main.views.dev_conf', name='url_usrp_conf'),
4 url(r'^(?P<id_conf>-?\d+)/$', 'apps.main.views.dev_conf', name='url_usrp_conf'),
5 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_usrp_conf'),
5 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.main.views.dev_conf_edit', name='url_edit_usrp_conf'),
6 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_usrp_conf'),
7 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_usrp_conf'),
8 url(r'^(?P<id_conf>-?\d+)/import/$', 'apps.main.views.dev_conf_import', name='url_import_usrp_conf'),
9 url(r'^(?P<id_conf>-?\d+)/export/$', 'apps.main.views.dev_conf_export', name='url_export_usrp_conf'),
6 )
10 )
General Comments 0
You need to be logged in to leave comments. Login now