##// END OF EJS Templates
main updated...
Fiorella Quino -
r162:100e11c0e8bf
parent child
Show More
@@ -1,612 +1,612
1 1 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
2 2 from datetime import datetime
3 3
4 4 from django.db import models
5 5 from polymorphic import PolymorphicModel
6 6
7 7 from django.core.urlresolvers import reverse
8 8
9 9
10 10 CONF_STATES = (
11 11 (0, 'Disconnected'),
12 12 (1, 'Connected'),
13 13 (2, 'Running'),
14 14 )
15 15
16 16 EXP_STATES = (
17 17 (0,'Error'), #RED
18 18 (1,'Configured'), #BLUE
19 19 (2,'Running'), #GREEN
20 20 (3,'Waiting'), #YELLOW
21 21 (4,'Not Configured'), #WHITE
22 22 )
23 23
24 24 CONF_TYPES = (
25 25 (0, 'Active'),
26 26 (1, 'Historical'),
27 27 )
28 28
29 29 DEV_STATES = (
30 30 (0, 'No connected'),
31 31 (1, 'Connected'),
32 32 (2, 'Configured'),
33 33 (3, 'Running'),
34 34 )
35 35
36 36 DEV_TYPES = (
37 37 ('', 'Select a device type'),
38 38 ('rc', 'Radar Controller'),
39 39 ('rc_mix', 'Radar Controller (Mix)'),
40 40 ('dds', 'Direct Digital Synthesizer'),
41 41 ('jars', 'Jicamarca Radar Acquisition System'),
42 42 ('usrp', 'Universal Software Radio Peripheral'),
43 43 ('cgs', 'Clock Generator System'),
44 44 ('abs', 'Automatic Beam Switching'),
45 45 )
46 46
47 47 DEV_PORTS = {
48 48 'rc' : 2000,
49 49 'rc_mix': 2000,
50 50 'dds' : 2000,
51 51 'jars' : 2000,
52 52 'usrp' : 2000,
53 53 'cgs' : 8080,
54 54 'abs' : 8080
55 55 }
56 56
57 57 RADAR_STATES = (
58 58 (0, 'No connected'),
59 59 (1, 'Connected'),
60 60 (2, 'Configured'),
61 61 (3, 'Running'),
62 62 (4, 'Scheduled'),
63 63 )
64 64 # Create your models here.
65
65
66 66 class Location(models.Model):
67 67
68 68 name = models.CharField(max_length = 30)
69 69 description = models.TextField(blank=True, null=True)
70 70
71 71 class Meta:
72 72 db_table = 'db_location'
73
73
74 74 def __unicode__(self):
75 75 return u'%s' % self.name
76 76
77 77 def get_absolute_url(self):
78 78 return reverse('url_location', args=[str(self.id)])
79 79
80 80
81 81 class DeviceType(models.Model):
82 82
83 83 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'rc')
84 84 description = models.TextField(blank=True, null=True)
85 85
86 86 class Meta:
87 87 db_table = 'db_device_types'
88
88
89 89 def __unicode__(self):
90 90 return u'%s' % self.get_name_display()
91
91
92 92 class Device(models.Model):
93 93
94 94 device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE)
95 95 location = models.ForeignKey(Location, on_delete=models.CASCADE)
96
96
97 97 name = models.CharField(max_length=40, default='')
98 98 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
99 99 port_address = models.PositiveSmallIntegerField(default=2000)
100 100 description = models.TextField(blank=True, null=True)
101 101 status = models.PositiveSmallIntegerField(default=0, choices=DEV_STATES)
102 102
103 103 class Meta:
104 104 db_table = 'db_devices'
105
105
106 106 def __unicode__(self):
107 return u'[{}]: {}'.format(self.device_type.name.upper(),
107 return u'[{}]: {}'.format(self.device_type.name.upper(),
108 108 self.name)
109
110 def get_status(self):
109
110 def get_status(self):
111 111 return self.status
112
112
113 113 @property
114 114 def status_color(self):
115 115 color = 'muted'
116 116 if self.status == 0:
117 117 color = "danger"
118 118 elif self.status == 1:
119 119 color = "warning"
120 120 elif self.status == 2:
121 121 color = "info"
122 122 elif self.status == 3:
123 123 color = "success"
124
124
125 125 return color
126
126
127 127 def get_absolute_url(self):
128 128 return reverse('url_device', args=[str(self.id)])
129
129
130 130
131 131 class Campaign(models.Model):
132 132
133 template = models.BooleanField(default=False)
133 template = models.BooleanField(default=False)
134 134 name = models.CharField(max_length=60, unique=True)
135 135 start_date = models.DateTimeField(blank=True, null=True)
136 136 end_date = models.DateTimeField(blank=True, null=True)
137 137 tags = models.CharField(max_length=40)
138 138 description = models.TextField(blank=True, null=True)
139 139 experiments = models.ManyToManyField('Experiment', blank=True)
140 140
141 141 class Meta:
142 142 db_table = 'db_campaigns'
143 143 ordering = ('name',)
144
144
145 145 def __unicode__(self):
146 146 if self.template:
147 147 return u'{} (template)'.format(self.name)
148 148 else:
149 149 return u'{}'.format(self.name)
150 150
151
151
152 152 def parms_to_dict(self):
153
153
154 154 import json
155
155
156 156 parameters = {}
157 157 exp_parameters = {}
158 158 experiments = Experiment.objects.filter(campaign = self)
159
159
160 160 i=1
161 161 for experiment in experiments:
162 162 exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict())
163 163 i += 1
164
165
164
165
166 166 parameters['experiments'] = exp_parameters
167 167 parameters['end_date'] = self.end_date.strftime("%Y-%m-%d")
168 168 parameters['start_date'] = self.start_date.strftime("%Y-%m-%d")
169 169 parameters['campaign'] = self.__unicode__()
170 170 parameters['tags'] =self.tags
171
171
172 172 parameters = json.dumps(parameters, indent=2, sort_keys=False)
173
173
174 174 return parameters
175
175
176 176 def import_from_file(self, fp):
177
177
178 178 import os, json
179
179
180 180 parms = {}
181
181
182 182 path, ext = os.path.splitext(fp.name)
183
183
184 184 if ext == '.json':
185 185 parms = json.load(fp)
186
186
187 187 return parms
188
188
189 189 def dict_to_parms(self, parms, CONF_MODELS):
190
190
191 191 experiments = Experiment.objects.filter(campaign = self)
192 192 configurations = Configuration.objects.filter(experiment = experiments)
193
193
194 194 if configurations:
195 195 for configuration in configurations:
196 196 configuration.delete()
197
197
198 198 if experiments:
199 199 for experiment in experiments:
200 200 experiment.delete()
201
201
202 202 for parms_exp in parms['experiments']:
203 203 location = Location.objects.get(name = parms['experiments'][parms_exp]['radar'])
204 204 new_exp = Experiment(
205 205 name = parms['experiments'][parms_exp]['experiment'],
206 206 location = location,
207 207 start_time = parms['experiments'][parms_exp]['start_time'],
208 208 end_time = parms['experiments'][parms_exp]['end_time'],
209 209 )
210 210 new_exp.save()
211 211 new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS)
212 212 new_exp.save()
213
213
214 214 self.name = parms['campaign']
215 215 self.start_date = parms['start_date']
216 216 self.end_date = parms['end_date']
217 217 self.tags = parms['tags']
218 218 self.experiments.add(new_exp)
219 219 self.save()
220
221 return self
222
220
221 return self
222
223 223 def get_absolute_url(self):
224 224 return reverse('url_campaign', args=[str(self.id)])
225
225
226 226 def get_absolute_url_edit(self):
227 227 return reverse('url_edit_campaign', args=[str(self.id)])
228
228
229 229 def get_absolute_url_export(self):
230 230 return reverse('url_export_campaign', args=[str(self.id)])
231
231
232 232 def get_absolute_url_import(self):
233 233 return reverse('url_import_campaign', args=[str(self.id)])
234
235
236
234
235
236
237 237 class RunningExperiment(models.Model):
238 238 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
239 239 running_experiment = models.ManyToManyField('Experiment', blank = True)
240 240 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
241
242
241
242
243 243 class Experiment(models.Model):
244 244
245 template = models.BooleanField(default=False)
245 template = models.BooleanField(default=False)
246 246 name = models.CharField(max_length=40, default='', unique=True)
247 247 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
248 248 start_time = models.TimeField(default='00:00:00')
249 249 end_time = models.TimeField(default='23:59:59')
250 250 status = models.PositiveSmallIntegerField(default=0, choices=EXP_STATES)
251 251
252 252 class Meta:
253 253 db_table = 'db_experiments'
254 254 ordering = ('template', 'name')
255
255
256 256 def __unicode__(self):
257 257 if self.template:
258 258 return u'%s (template)' % (self.name)
259 259 else:
260 260 return u'%s' % (self.name)
261
261
262 262 @property
263 263 def radar_system(self):
264 264 return self.location
265
265
266 266 def clone(self, **kwargs):
267
267
268 268 confs = Configuration.objects.filter(experiment=self, type=0)
269 269 self.pk = None
270 270 self.name = '{} [{:%Y/%m/%d}]'.format(self.name, datetime.now())
271 271 for attr, value in kwargs.items():
272 272 setattr(self, attr, value)
273
273
274 274 self.save()
275
275
276 276 for conf in confs:
277 277 conf.clone(experiment=self, template=False)
278
279 return self
280
278
279 return self
280
281 281 def get_status(self):
282 282 configurations = Configuration.objects.filter(experiment=self)
283 283 exp_status=[]
284 284 for conf in configurations:
285 285 print conf.status_device()
286 286 exp_status.append(conf.status_device())
287
287
288 288 if not exp_status: #No Configuration
289 289 self.status = 4
290 290 self.save()
291 return
292
291 return
292
293 293 total = 1
294 294 for e_s in exp_status:
295 295 total = total*e_s
296
296
297 297 if total == 0: #Error
298 298 status = 0
299 299 elif total == (3**len(exp_status)): #Running
300 300 status = 2
301 301 else:
302 302 status = 1 #Configurated
303
303
304 304 self.status = status
305 305 self.save()
306
306
307 307 def status_color(self):
308 308 color = 'muted'
309 309 if self.status == 0:
310 310 color = "danger"
311 311 elif self.status == 1:
312 312 color = "info"
313 313 elif self.status == 2:
314 314 color = "success"
315 315 elif self.status == 3:
316 316 color = "warning"
317
317
318 318 return color
319
319
320 320 def get_absolute_url(self):
321 321 return reverse('url_experiment', args=[str(self.id)])
322
322
323 323 def parms_to_dict(self):
324
324
325 325 import json
326
326
327 327 configurations = Configuration.objects.filter(experiment=self)
328 328 conf_parameters = {}
329 329 parameters={}
330
330
331 331 for configuration in configurations:
332 332 if 'cgs' in configuration.device.device_type.name:
333 333 conf_parameters['cgs'] = configuration.parms_to_dict()
334 334 if 'dds' in configuration.device.device_type.name:
335 335 conf_parameters['dds'] = configuration.parms_to_dict()
336 336 if 'rc' in configuration.device.device_type.name:
337 337 conf_parameters['rc'] = configuration.parms_to_dict()
338 338 if 'jars' in configuration.device.device_type.name:
339 339 conf_parameters['jars'] = configuration.parms_to_dict()
340 340 if 'usrp' in configuration.device.device_type.name:
341 341 conf_parameters['usrp'] = configuration.parms_to_dict()
342 342 if 'abs' in configuration.device.device_type.name:
343 343 conf_parameters['abs'] = configuration.parms_to_dict()
344
344
345 345 parameters['configurations'] = conf_parameters
346 346 parameters['end_time'] = self.end_time.strftime("%H:%M:%S")
347 347 parameters['start_time'] = self.start_time.strftime("%H:%M:%S")
348 348 parameters['radar'] = self.radar_system.name
349 349 parameters['experiment'] = self.name
350 350 parameters = json.dumps(parameters, indent=2)
351
351
352 352 return parameters
353
353
354 354 def import_from_file(self, fp):
355
355
356 356 import os, json
357
357
358 358 parms = {}
359
359
360 360 path, ext = os.path.splitext(fp.name)
361
361
362 362 if ext == '.json':
363 363 parms = json.load(fp)
364
364
365 365 return parms
366
366
367 367 def dict_to_parms(self, parms, CONF_MODELS):
368
368
369 369 configurations = Configuration.objects.filter(experiment=self)
370
370
371 371 if configurations:
372 372 for configuration in configurations:
373 373 configuration.delete()
374
374
375 375 for conf_type in parms['configurations']:
376 376 #--For ABS Device:
377 377 #--For USRP Device:
378 378 #--For JARS Device:
379 379 if conf_type == 'jars':
380 380 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
381 381 DevConfModel = CONF_MODELS[conf_type]
382 382 confjars_form = DevConfModel(
383 383 experiment = self,
384 384 name = 'JARS',
385 385 device=device,
386 386 )
387 387 confjars_form.dict_to_parms(parms['configurations']['jars'])
388 388 confjars_form.save()
389 389 #--For RC Device:
390 390 if conf_type == 'rc':
391 391 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
392 392 DevConfModel = CONF_MODELS[conf_type]
393 393 confrc_form = DevConfModel(
394 394 experiment = self,
395 395 name = 'RC',
396 396 device=device,
397 397 )
398 398 confrc_form.dict_to_parms(parms['configurations']['rc'])
399 399 confrc_form.save()
400 400 #--For DDS Device:
401 401 if conf_type == 'dds':
402 402 device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id'])
403 403 DevConfModel = CONF_MODELS[conf_type]
404 404 confdds_form = DevConfModel(
405 405 experiment = self,
406 406 name = 'DDS',
407 407 device=device,
408 408 )
409 409 confdds_form.dict_to_parms(parms['configurations']['dds'])
410 410 confdds_form.save()
411 411 #--For CGS Device:
412 412 if conf_type == 'cgs':
413 413 device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id'])
414 414 DevConfModel = CONF_MODELS[conf_type]
415 415 confcgs_form = DevConfModel(
416 416 experiment = self,
417 417 name = 'CGS',
418 418 device=device,
419 419 )
420 420 confcgs_form.dict_to_parms(parms['configurations']['cgs'])
421 421 confcgs_form.save()
422
423 location = Location.objects.get(name = parms['radar'])
422
423 location = Location.objects.get(name = parms['radar'])
424 424 self.name = parms['experiment']
425 425 self.location = location
426 426 self.start_time = parms['start_time']
427 427 self.end_time = parms['end_time']
428 428 self.save()
429
429
430 430 return self
431
431
432 432 def get_absolute_url_edit(self):
433 433 return reverse('url_edit_experiment', args=[str(self.id)])
434
434
435 435 def get_absolute_url_import(self):
436 436 return reverse('url_import_experiment', args=[str(self.id)])
437
437
438 438 def get_absolute_url_export(self):
439 439 return reverse('url_export_experiment', args=[str(self.id)])
440
441
440
441
442 442 class Configuration(PolymorphicModel):
443 443
444 444 template = models.BooleanField(default=False)
445
445
446 446 name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
447
447
448 448 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
449 449 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
450
450
451 451 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
452
452
453 453 created_date = models.DateTimeField(auto_now_add=True)
454 454 programmed_date = models.DateTimeField(auto_now=True)
455
455
456 456 parameters = models.TextField(default='{}')
457
457
458 458 message = ""
459
459
460 460 class Meta:
461 461 db_table = 'db_configurations'
462
462
463 463 def __unicode__(self):
464
464
465 465 device = '{}:'.format(self.device.device_type.name.upper())
466
466
467 467 if 'mix' in self._meta.get_all_field_names():
468 468 if self.mix:
469 device = '{} MIXED:'.format(self.device.device_type.name.upper())
470
469 device = '{} MIXED:'.format(self.device.device_type.name.upper())
470
471 471 if self.template:
472 472 return u'{} {} (template)'.format(device, self.name)
473 473 else:
474 474 return u'{} {}'.format(device, self.name)
475 475
476 476 def clone(self, **kwargs):
477
477
478 478 self.pk = None
479 479 self.id = None
480 480 for attr, value in kwargs.items():
481 481 setattr(self, attr, value)
482
483 self.save()
482
483 self.save()
484 484
485 485 return self
486
486
487 487 def parms_to_dict(self):
488
488
489 489 parameters = {}
490
490
491 491 for key in self.__dict__.keys():
492 492 parameters[key] = getattr(self, key)
493
493
494 494 return parameters
495
495
496 496 def parms_to_text(self):
497
497
498 498 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
499
499
500 500 return ''
501
501
502 502 def parms_to_binary(self):
503
503
504 504 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
505
505
506 506 return ''
507
507
508 508 def dict_to_parms(self, parameters):
509
509
510 510 if type(parameters) != type({}):
511 511 return
512
512
513 513 for key in parameters.keys():
514 514 setattr(self, key, parameters[key])
515
515
516 516 def export_to_file(self, format="json"):
517
517
518 518 import json
519
519
520 520 content_type = ''
521
521
522 522 if format == 'text':
523 523 content_type = 'text/plain'
524 524 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
525 525 content = self.parms_to_text()
526
526
527 527 if format == 'binary':
528 528 content_type = 'application/octet-stream'
529 529 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
530 530 content = self.parms_to_binary()
531
531
532 532 if not content_type:
533 533 content_type = 'application/json'
534 534 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
535 535 content = json.dumps(self.parms_to_dict(), indent=2)
536
536
537 537 fields = {'content_type':content_type,
538 538 'filename':filename,
539 539 'content':content
540 540 }
541
541
542 542 return fields
543
543
544 544 def import_from_file(self, fp):
545
545
546 546 import os, json
547
547
548 548 parms = {}
549
549
550 550 path, ext = os.path.splitext(fp.name)
551
551
552 552 if ext == '.json':
553 553 parms = json.load(fp)
554
554
555 555 return parms
556
556
557 557 def status_device(self):
558
558
559 559 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
560
560
561 561 return None
562
562
563 563 def stop_device(self):
564
564
565 565 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
566
566
567 567 return None
568
568
569 569 def start_device(self):
570
570
571 571 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
572
572
573 573 return None
574
574
575 575 def write_device(self, parms):
576
576
577 577 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
578
578
579 579 return None
580
580
581 581 def read_device(self):
582
582
583 583 raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()
584
584
585 585 return None
586
586
587 587 def get_absolute_url(self):
588 588 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
589
589
590 590 def get_absolute_url_edit(self):
591 591 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
592
592
593 593 def get_absolute_url_import(self):
594 594 return reverse('url_import_dev_conf', args=[str(self.id)])
595
595
596 596 def get_absolute_url_export(self):
597 597 return reverse('url_export_dev_conf', args=[str(self.id)])
598
598
599 599 def get_absolute_url_write(self):
600 600 return reverse('url_write_dev_conf', args=[str(self.id)])
601
601
602 602 def get_absolute_url_read(self):
603 603 return reverse('url_read_dev_conf', args=[str(self.id)])
604
604
605 605 def get_absolute_url_start(self):
606 606 return reverse('url_start_dev_conf', args=[str(self.id)])
607
607
608 608 def get_absolute_url_stop(self):
609 609 return reverse('url_stop_dev_conf', args=[str(self.id)])
610
610
611 611 def get_absolute_url_status(self):
612 return reverse('url_status_dev_conf', args=[str(self.id)]) No newline at end of file
612 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,143 +1,152
1 1 <!DOCTYPE html>
2 2 {% load static %}
3 3 <html lang="en">
4 4 <head>
5 5 <meta charset="utf-8">
6 6 <title>{% block title %}Jicamarca Integrated Radar System:::::{% endblock %}</title>
7 7 <meta name="description" content="">
8 8 <meta name="author" content="">
9 9 <meta name="viewport" content="width=device-width, initial-scale=1">
10 10 {# bootstrap_css #}
11 11 <link href="{% static 'css/bootstrap-flatly.min.css' %}" media="all" rel="stylesheet">
12 12 <style type="text/css">
13 13 body {padding-top: 60px}
14 14 .logo {padding-top: 5px; height: 50px}
15 15 .clickable-row {cursor: pointer;}
16 16 .col-no-padding { padding-left:0;}
17 17 .gi-2x{font-size: 2em;}
18 18 .gi-3x{font-size: 3em;}
19 19 .gi-4x{font-size: 4em;}
20 20 .gi-5x{font-size: 5em;}
21 21 </style>
22 22 <!--[if lt IE 9]>
23 23 <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
24 <![endif]-->
24 <![endif]-->
25 25 <script src="{% static 'js/jquery.min.js' %}"></script>
26 26 {% block extra-head %}
27 27 {% endblock %}
28 28 </head>
29 29
30 30 <body>
31 31
32 32 {% block main_menu %}
33 33 <nav class="navbar navbar-default navbar-fixed-top" role="banner">
34 34 <div class="container-fluid">
35 35 <div class="navbar-header">
36 36 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navigationbar">
37 37 <span class="sr-only">Toggle navigation</span>
38 38 <span class="icon-bar"></span>
39 39 <span class="icon-bar"></span>
40 40 <span class="icon-bar"></span>
41 41 </button>
42 <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>
42 <a class="navbar-brand" href="{% url 'index' %}" style="padding-top:1px"><img class="logo" alt="JRO" src="{% static "images/logo-jro-color-trans.png" %}"></a>
43 43 </div>
44 44 <div class="collapse navbar-collapse" id="navigationbar">
45 <ul class="nav navbar-nav">
45 <ul class="nav navbar-nav">
46 46 <li class=" dropdown {% block operation-active %}{% endblock %}"><a href="{% url 'url_operation'%}">Operation</a>
47 47 </li>
48 48 <li class=" dropdown {% block new-active %}{% endblock %}">
49 <a href="#" class="dropdown-toggle" data-toggle="dropdown">New<span class="caret"></span></a>
49 <a href="#" class="dropdown-toggle" data-toggle="dropdown">New<span class="caret"></span></a>
50 50 <ul class="dropdown-menu" role="menu">
51 51 <li><a href="{% url 'url_add_campaign' %}">Campaign</a></li>
52 52 <li><a href="{% url 'url_add_experiment' %}">Experiment</a></li>
53 53 <li><a href="{% url 'url_add_dev_conf' 0%}">Device Configuration</a></li>
54 54 <li><a href="{% url 'url_add_device'%}">Device</a></li>
55 55 <li><a href="{% url 'url_add_location'%}">Radar System</a></li>
56 </ul>
56 </ul>
57 57 </li>
58 58 <li class=" dropdown {% block search-active %}{% endblock %}">
59 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Search<span class="caret"></span></a>
59 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Search<span class="caret"></span></a>
60 60 <ul class="dropdown-menu" role="menu">
61 <li><a href="{% url 'url_campaigns' %}">Campaigns</a></li>
61 <li><a href="{% url 'url_campaigns' %}">Campaigns</a></li>
62 62 <li><a href="{% url 'url_experiments' %}">Experiments</a></li>
63 63 <li><a href="{% url 'url_dev_confs' %}">Configurations</a></li>
64 64 <li><a href="{% url 'url_devices' %}">Devices</a></li>
65 65 <li><a href="{% url 'url_locations' %}">Radar Systems</a></li>
66 66 </ul>
67 </li>
67 </li>
68 68 </ul>
69 69 <ul class="nav navbar-nav navbar-right">
70 70 <li class="nav-divider"></li>
71 71 {% if user.is_authenticated %}
72 72 <li class="dropdown">
73 73 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Hi {{ user.username }}<span class="caret"></span></a>
74 74 <ul class="dropdown-menu" role="menu">
75 75 <li><a href="#">Control Panel</a></li>
76 76 <li><a href="{% url 'django.contrib.auth.views.logout' %}">Logout</a></li>
77 77 </ul>
78 78 </li>
79 79 {% else %}
80 80 <li><a href="{% url 'django.contrib.auth.views.login' %}?next={{request.get_full_path}}">Login</a></li>
81 {% endif %}
81 {% endif %}
82 82 </ul>
83 83 </div>
84 84 </div>
85 85 </nav>
86 86 <div style="clear: both;"></div>
87 87 {% endblock %}
88 88
89 89 <div class="container">
90 90 <div id="page" class="row" style="min-height:600px">
91 91
92 <div class="col-md-3 hidden-xs hidden-sm" role="complementary">
92 {% if no_sidebar %}
93 <div class="col-md-0 hidden-xs hidden-sm" role="complementary">
94
95 {% else %}
96 <div class="col-md-3 hidden-xs hidden-sm" role="complementary">
97 {% endif %}
93 98 <br><br>
94 99 <div id="sidebar">
95 {% block sidebar%}
100 {% block sidebar%}
96 101 {% endblock %}
97 102 </div>
98 103 </div>
99
100 <div class="col-md-9 col-xs-12" role="main">
104
105 {% if no_sidebar %}
106 <div class="col-md-12 col-xs-12" role="main">
107 {% else %}
108 <div class="col-md-9 col-xs-12" role="main">
109 {% endif %}
101 110 <div class="page-header">
102 111 <h1>{% block content-title %}{% endblock %} <small>{% block content-suptitle %}{% endblock %}</small></h1>
103 112 </div>
104 113 {% block messages %}
105 114 {% if messages %}
106 115 {% for message in messages %}
107 116 <div class="alert alert-{% if message.tags %}{% if 'error' in message.tags %}danger{% else %}{{ message.tags }}{% endif %}{% else %}info{% endif %} alert-dismissible" role="alert">
108 117 <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
109 118 <strong>{{message.tags|title}}!</strong> {{ message }}
110 119 </div>
111 120 {% endfor %}
112 121 {% endif %}
113 122 {% endblock %}
114
123
115 124 {% block content %}
116 125 {% endblock %}
117
126
118 127 </div>
119
120 </div><!--/row-->
128
129
130 </div><!--/row-->
121 131 </div> <!-- container -->
122 132
123 133 <div id="debug">{{debug}}</div>
124 134
125 135 {% block footer %}
126 136 <footer class="footer">
127 137 <div class="container">
128 138 <p><hr></p>
129 139 <p>
130 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
140 &copy; <a href="http://jro.igp.gob.pe">Jicamarca Radio Observatory</a> - {% now "Y" %}
131 141 </p>
132 142 </div>
133 143 </footer>
134 144 {% endblock %}
135 145
136 146 {# bootstrap_javascript jquery=True #}
137 147
138 148 <script src="{% static 'js/bootstrap.min.js' %}"></script>
139 149 {% block extra-js %}
140 150 {% endblock%}
141 151 </body>
142 152 </html>
143
General Comments 0
You need to be logged in to leave comments. Login now