diff --git a/apache/apache_radarsys.conf b/apache/apache_radarsys.conf
index 0ba60e5..a0928fc 100644
--- a/apache/apache_radarsys.conf
+++ b/apache/apache_radarsys.conf
@@ -3,10 +3,7 @@
WSGIScriptAlias / /usr/local/radarsys/radarsys/wsgi.py
WSGIPythonPath /usr/local/radarsys/:/usr/local/virtuals/radarsys/lib/python2.7/site-packages
-Alias /static/ /usr/local/radarsys/apps/main/static/
-
- Require all granted
-
+Alias /static/ /var/www/html/static/
@@ -14,6 +11,4 @@ Alias /static/ /usr/local/radarsys/apps/main/static/
Require all granted
#Allow from all
-
-
-
+
\ No newline at end of file
diff --git a/apps/cgs/forms.py b/apps/cgs/forms.py
index 254745f..8385de0 100644
--- a/apps/cgs/forms.py
+++ b/apps/cgs/forms.py
@@ -3,7 +3,7 @@ from apps.main.models import Device
from .models import CGSConfiguration
class CGSConfigurationForm(forms.ModelForm):
- #freq0.widget = te
+
def __init__(self, *args, **kwargs):
#request = kwargs.pop('request')
super(CGSConfigurationForm, self).__init__(*args, **kwargs)
@@ -13,10 +13,11 @@ class CGSConfigurationForm(forms.ModelForm):
if instance and instance.pk:
devices = Device.objects.filter(device_type__name='cgs')
- items = devices.values('id', 'name', 'device_type__name', 'ip_address')
- self.fields['experiment'].widget.attrs['readonly'] = True
- self.fields['device'].widget.choices = [(item['id'], '[%s]: %s | %s' % (item['device_type__name'], item['name'], item['ip_address'])) for item in items]
+ if instance.experiment:
+ self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
+
+ self.fields['device'].widget.choices = [(device.id, device) for device in devices]
def clean(self):
return
@@ -24,9 +25,8 @@ class CGSConfigurationForm(forms.ModelForm):
class Meta:
model = CGSConfiguration
- #exclude = ('freqs', 'clk_in', 'mult','div',)
-# exclude = ('freqs',)
- fields = ('experiment', 'device', 'freq0', 'freq1', 'freq2', 'freq3')
+ exclude = ('type', 'parameters', 'status')
+ #fields = ('experiment', 'device', 'freq0', 'freq1', 'freq2', 'freq3')
class UploadFileForm(forms.Form):
diff --git a/apps/cgs/models.py b/apps/cgs/models.py
index 04765cb..3ec678f 100644
--- a/apps/cgs/models.py
+++ b/apps/cgs/models.py
@@ -15,8 +15,6 @@ class CGSConfiguration(Configuration):
freq1 = models.IntegerField(verbose_name='Frequency 1',validators=[MinValueValidator(0), MaxValueValidator(450e6)], blank=True, null=True)
freq2 = models.IntegerField(verbose_name='Frequency 2',validators=[MinValueValidator(0), MaxValueValidator(450e6)], blank=True, null=True)
freq3 = models.IntegerField(verbose_name='Frequency 3',validators=[MinValueValidator(0), MaxValueValidator(450e6)], blank=True, null=True)
- #jfreqs = JSONField(default={"frequencies":[{"f0":freq0,"f1":freq1,"f2":freq2,"f3":freq3}]}, blank=True)
-
def verify_frequencies(self):
diff --git a/apps/cgs/views.py b/apps/cgs/views.py
index e3e799e..c38d214 100644
--- a/apps/cgs/views.py
+++ b/apps/cgs/views.py
@@ -66,7 +66,7 @@ def cgs_conf(request, id_conf):
kwargs['no_play'] = True
###### SIDEBAR ######
- kwargs.update(sidebar(conf))
+ kwargs.update(sidebar(conf=conf))
return render(request, 'cgs_conf.html', kwargs)
@@ -101,10 +101,6 @@ def cgs_conf_edit(request, id_conf):
kwargs['suptitle'] = 'Edit'
kwargs['button'] = 'Save'
-
- ###### SIDEBAR ######
- kwargs.update(sidebar(conf))
-
return render(request, 'cgs_conf_edit.html', kwargs)
#
# def cgs_conf_write(request, id_conf):
diff --git a/apps/dds/forms.py b/apps/dds/forms.py
index 26a4b91..28c4395 100644
--- a/apps/dds/forms.py
+++ b/apps/dds/forms.py
@@ -16,10 +16,8 @@ class DDSConfigurationForm(forms.ModelForm):
devices = Device.objects.filter(device_type__name='dds')
- self.fields['experiment'].widget.attrs['readonly'] = True
-
- if instance.experiment is not None:
- self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
+ if instance.experiment:
+ self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
self.fields['device'].widget.choices = [(device.id, device) for device in devices]
diff --git a/apps/dds/views.py b/apps/dds/views.py
index 8cb7d4b..9c5fd45 100644
--- a/apps/dds/views.py
+++ b/apps/dds/views.py
@@ -42,7 +42,7 @@ def dds_conf(request, id_conf):
kwargs['button'] = 'Edit Configuration'
###### SIDEBAR ######
- kwargs.update(sidebar(conf))
+ kwargs.update(sidebar(conf=conf))
return render(request, 'dds_conf.html', kwargs)
@@ -73,9 +73,6 @@ def dds_conf_edit(request, id_conf):
kwargs['suptitle'] = 'Edit'
kwargs['button'] = 'Save'
- ###### SIDEBAR ######
- kwargs.update(sidebar(conf))
-
return render(request, 'dds_conf_edit.html', kwargs)
# def dds_conf_import(request, id_conf):
diff --git a/apps/main/fixtures/main_initial_data.json b/apps/main/fixtures/main_initial_data.json
index 64cc4be..3cebba3 100644
--- a/apps/main/fixtures/main_initial_data.json
+++ b/apps/main/fixtures/main_initial_data.json
@@ -1,7 +1,8 @@
[
-{"fields": {"name": "JRO", "description": ""}, "model": "main.location", "pk": 1},
-{"fields": {"name": "JASMET", "description": ""}, "model": "main.location", "pk": 2},
-{"fields": {"name": "SOUSY", "description": ""}, "model": "main.location", "pk": 3},
+{"fields": {"name": "MAIN RADAR", "description": ""}, "model": "main.location", "pk": 1},
+{"fields": {"name": "JASMET", "description": ""}, "model": "main.location", "pk": 2},
+{"fields": {"name": "SOUSY", "description": ""}, "model": "main.location", "pk": 3},
+{"fields": {"name": "JULIA", "description": ""}, "model": "main.location", "pk": 4},
{"fields": {"name": "rc", "description": ""}, "model": "main.devicetype", "pk": 1},
{"fields": {"name": "dds", "description": ""}, "model": "main.devicetype", "pk": 2},
{"fields": {"name": "cgs", "description": ""}, "model": "main.devicetype", "pk": 3},
diff --git a/apps/main/forms.py b/apps/main/forms.py
index afda942..42446bc 100644
--- a/apps/main/forms.py
+++ b/apps/main/forms.py
@@ -39,10 +39,16 @@ class TimepickerWidget(forms.widgets.TextInput):
return mark_safe(html)
class CampaignForm(forms.ModelForm):
+
+ experiments = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
+ queryset=Experiment.objects.filter(template=True),
+ required=False)
+
def __init__(self, *args, **kwargs):
super(CampaignForm, self).__init__(*args, **kwargs)
self.fields['start_date'].widget = DatepickerWidget(self.fields['start_date'].widget.attrs)
self.fields['end_date'].widget = DatepickerWidget(self.fields['end_date'].widget.attrs)
+ self.fields['description'].widget.attrs = {'rows': 2}
class Meta:
model = Campaign
@@ -54,8 +60,6 @@ class ExperimentForm(forms.ModelForm):
super(ExperimentForm, self).__init__(*args, **kwargs)
self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs)
self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs)
-
- self.fields['campaign'].widget.attrs['readonly'] = True
class Meta:
model = Experiment
@@ -72,6 +76,13 @@ class DeviceForm(forms.ModelForm):
exclude = ['status']
class ConfigurationForm(forms.ModelForm):
+
+ def __init__(self, *args, **kwargs):
+ super(ConfigurationForm, self).__init__(*args, **kwargs)
+
+ if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
+ self.fields['experiment'].widget.attrs['disabled'] = 'disabled'
+
class Meta:
model = Configuration
exclude = ['type', 'created_date', 'programmed_date', 'parameters']
@@ -124,4 +135,17 @@ class OperationSearchForm(forms.Form):
def __init__(self, *args, **kwargs):
super(OperationSearchForm, self).__init__(*args, **kwargs)
self.fields['campaign'].choices=Campaign.objects.all().order_by('-start_date').values_list('id', 'name')
+
+class NewForm(forms.Form):
+
+ create_from = forms.ChoiceField(choices=((0, '-----'),
+ (1, 'Empty (blank)'),
+ (2, 'Template')))
+ choose_template = forms.ChoiceField()
+
+ def __init__(self, *args, **kwargs):
+
+ template_choices = kwargs.pop('template_choices', [])
+ super(NewForm, self).__init__(*args, **kwargs)
+ self.fields['choose_template'].choices = add_empty_choice(template_choices)
\ No newline at end of file
diff --git a/apps/main/models.py b/apps/main/models.py
index 94b01a0..fe7d81e 100644
--- a/apps/main/models.py
+++ b/apps/main/models.py
@@ -1,3 +1,6 @@
+
+from datetime import datetime
+
from django.db import models
from polymorphic import PolymorphicModel
@@ -103,35 +106,22 @@ class Device(models.Model):
class Campaign(models.Model):
- template = models.BooleanField(default=False)
-
- name = models.CharField(max_length=40, unique=True)
- experiment = models.ManyToManyField('Experiment')
-
+ template = models.BooleanField(default=False)
+ name = models.CharField(max_length=60, unique=True)
start_date = models.DateTimeField(blank=True, null=True)
end_date = models.DateTimeField(blank=True, null=True)
tags = models.CharField(max_length=40)
description = models.TextField(blank=True, null=True)
+ experiments = models.ManyToManyField('Experiment', blank=True)
class Meta:
db_table = 'db_campaigns'
+ ordering = ('name',)
def __unicode__(self):
return u'%s' % (self.name)
-
-# class Radar(models.Model):
-#
-# # name = models.CharField(max_length = 30)
-# experiment = models.ForeignKey('Experiment', on_delete=models.CASCADE)
-# location = models.OneToOneField('Location', on_delete=models.CASCADE)
-# status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
-#
-# class Meta:
-# db_table = 'db_radar'
-#
-# def __unicode__(self):
-# return u'%s' % self.location
+
class RunningExperiment(models.Model):
radar = models.OneToOneField('Location', on_delete=models.CASCADE)
running_experiment = models.ManyToManyField('Experiment')
@@ -140,22 +130,35 @@ class RunningExperiment(models.Model):
class Experiment(models.Model):
- template = models.BooleanField(default=False)
-
- #campaign = models.ForeignKey('Campaign', null=True, blank=True, on_delete=models.CASCADE)
+ template = models.BooleanField(default=False)
+ location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
+ name = models.CharField(max_length=40, default='', unique=True)
location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
-
- name = models.CharField(max_length=40, default='')
start_time = models.TimeField(default='00:00:00')
end_time = models.TimeField(default='23:59:59')
status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
class Meta:
db_table = 'db_experiments'
+ ordering = ('name',)
def __unicode__(self):
return u'%s' % (self.name)
+ def clone(self, **kwargs):
+
+ confs = Configuration.objects.filter(experiment=self, type=0)
+ self.pk = None
+ self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
+ for attr, value in kwargs.items():
+ setattr(self, attr, value)
+
+ self.save()
+
+ for conf in confs:
+ conf.clone(experiment=self, template=False)
+
+ return self
def get_status(self):
configurations = Configuration.objects.filter(experiment=self)
@@ -198,6 +201,7 @@ class Experiment(models.Model):
return color
+
class Configuration(PolymorphicModel):
template = models.BooleanField(default=False)
@@ -228,7 +232,16 @@ class Configuration(PolymorphicModel):
else:
return u'%s' % self.device.name
+ def clone(self, **kwargs):
+ self.pk = None
+ self.id = None
+ for attr, value in kwargs.items():
+ setattr(self, attr, value)
+
+ self.save()
+
+ return self
def parms_to_dict(self):
diff --git a/apps/main/templates/base.html b/apps/main/templates/base.html
index 1ccdf7e..2047838 100644
--- a/apps/main/templates/base.html
+++ b/apps/main/templates/base.html
@@ -13,7 +13,11 @@
body {padding-top: 60px}
.logo {padding-top: 5px; height: 50px}
.clickable-row {cursor: pointer;}
- .col-no-padding { padding-left:0; }
+ .col-no-padding { padding-left:0;}
+ .gi-2x{font-size: 2em;}
+ .gi-3x{font-size: 3em;}
+ .gi-4x{font-size: 4em;}
+ .gi-5x{font-size: 5em;}