##// END OF EJS Templates
Review updata app
jespinoza -
r8:9c1b6919a8a9
parent child
Show More
@@ -8,14 +8,14 services:
8 8 image: madrigal
9 9 working_dir: /madrigal/source/madpy/djangoMad
10 10 command: gunicorn djangoMad.wsgi --bind 0.0.0.0:8000
11 # command: python manage.py runserver 0.0.0.0:8000
11 # command: python manage.py runserver 0.0.0.0:8888
12 12 env_file: .env
13 13 # ports:
14 # - 8080:8080
14 # - 8888:8888
15 15 volumes:
16 16 - '${EXP_DIR}:/madrigal/experiments'
17 - '/usr/local/madrigal/metadata:/madrigal/metadata'
18 - '/usr/local/madrigal/source/madpy/djangoMad:/madrigal/source/madpy/djangoMad'
17 # - '/usr/local/madrigal/metadata:/madrigal/metadata'
18 - '/home/jespinoza/workspace/madrigal/source/madpy/djangoMad:/madrigal/source/madpy/djangoMad'
19 19
20 20 nginx:
21 21 container_name: 'madrigal-nginx'
@@ -6,6 +6,7 upstream djangomad {
6 6
7 7 server {
8 8 listen 8080;
9 client_max_body_size 50M;
9 10
10 11 location /madrigal {
11 12 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -23,7 +23,7 def login_view(request):
23 23 if user.is_active:
24 24 login(request, user)
25 25
26 return redirect('/updata')
26 return redirect(request.GET.get('next'))
27 27 else:
28 28 return render(request, "login/login.html" )
29 29 else:
@@ -35,4 +35,4 def login_view(request):
35 35 def logout_view(request):
36 36
37 37 logout(request)
38 return redirect('/') No newline at end of file
38 return redirect('index') No newline at end of file
@@ -20,42 +20,24 import madweb.forms
20 20
21 21 import datetime, time
22 22
23 def getSelection(keyword, args, kwargs):
24 """getSelection returns '0' if keyword not a key in either args[0] or kwargs,
25 otherwise the value
26
27 args, kwargs - arguments as passed into SingleExpDefaultForm __init__
28 """
29 if len(args) == 0 and len(list(kwargs.keys())) == 0:
30 return('0') # default case when no data passed in
31 elif len(args) > 0:
32 # args[0] is data dict argument to bind data
33 if keyword in args[0]:
34 return(args[0][keyword])
35 else:
36 return('0')
37 elif keyword in kwargs:
38 return(kwargs[keyword])
39 elif 'data' in kwargs:
40 if keyword in kwargs['data']:
41 return(kwargs['data'][keyword])
42 else:
43 return('0')
44 else:
45 return('0')
46 23
47 def getExperimentList(args, kwargs, madWeb, header='Select experiment: '):
24 def getExperimentList(instrumentId=None):
48 25
49 instrumentsId= int(getSelection('instruments', args, kwargs))
26 madDB = madrigal.metadata.MadrigalDB()
27 madWeb = madrigal.ui.web.MadrigalWeb(madDB)
28
29 if instrumentId:
30 kinstList = [int(instrumentId)]
31 else:
32 kinstList = [0]
50 33
51 kinstList = [int(instrumentsId)]
52 34 startDate = datetime.datetime(1950,1,1)
53 35 startDT = datetime.datetime(startDate.year, startDate.month, startDate.day, 0, 0, 0)
54 36 now = datetime.datetime.now()
55 37 endDate = datetime.datetime(now.year, 12, 31, 23, 59, 59)
56 38 endDT = datetime.datetime(endDate.year, endDate.month, endDate.day, 23, 59, 59)
57 39 experiments = madWeb.getExperimentList(kinstList,startDT, endDT, True)
58 expListin = [('0', header),]
40 expListin = [('0', 'Select experiment: '),]
59 41 for exp in experiments:
60 42 expListin.append((exp[0], exp[2]))
61 43
@@ -68,31 +50,49 def getExperimentList(args, kwargs, madWeb, header='Select experiment: '):
68 50
69 51 return(expList)
70 52
53 def getInstrumentList():
54
55 madDB = madrigal.metadata.MadrigalDB()
56 madInstData = madrigal.metadata.MadrigalInstrumentData(madDB)
57 instruments = madInstData.getInstruments(0, True)
58 instList = [('0', "Select Instrument"), ]
59 for kinst, instDesc, siteID in instruments:
60 instList.append((str(kinst), instDesc))
61
62 return(instList)
63
71 64 class UpdataForm(forms.Form):
72 def __init__(self, *args, **kwargs):
73 super(UpdataForm, self).__init__(*args, **kwargs)
74 madDB = madrigal.metadata.MadrigalDB()
75 madInstData = madrigal.metadata.MadrigalInstrumentData(madDB)
76 instruments = madInstData.getInstruments(0, True)
77 instList = [('0', "Select Instrument"), ]
78 for kinst, instDesc, siteID in instruments:
79 instList.append((str(kinst), instDesc))
80 65
81 instrumentSelection = getSelection('instruments', args, kwargs)
82 self.fields['instruments'] = django.forms.ChoiceField(widget = django.forms.Select(attrs={"onChange":'populateExp(this)'}),
83 choices=instList,
84 initial=instrumentSelection,
85 label='Instrument:')
86
87 madWebObj = madrigal.ui.web.MadrigalWeb(madDB)
88 experimentSelection = getSelection('experiments', args, kwargs)
89 self.fields['experiments'] = django.forms.ChoiceField(choices=getExperimentList(args, kwargs, madWebObj),
90 initial=experimentSelection,
91 required=False, label='Experiment:')
92
93 description = forms.CharField(widget=forms.Textarea(attrs={'cols': 40,'rows': 3, 'style': 'resize:none'}), label='Description')
94 type = forms.ChoiceField(choices=[('0', 'Public'),('1', 'Private')], initial=0,widget=forms.RadioSelect(attrs={'class': 'custom-radio'}))
95 file = forms.FileField(label='Select Files', widget=forms.ClearableFileInput(attrs={'multiple': True}))
66 CHOICES=[('new','New Instrument/Experiment'),
67 ('existing','Existing')]
68 choose = forms.ChoiceField(
69 choices=CHOICES,
70 widget=forms.RadioSelect(attrs={'class': 'custom-radio', 'onClick': 'updateRadio(this);'}),
71 initial='existing')
72 inst = forms.IntegerField(min_value=1, label='Instrument ID:', disabled=True, required=False)
73 exp = forms.CharField(max_length=40, label='Experiment Title:', disabled=True, required=False)
74 instruments = forms.ChoiceField(
75 widget = django.forms.Select(attrs={"onChange":'populateExp(this);'}),
76 choices=getInstrumentList(),
77 required=False,
78 label='Instruments:')
79
80 experiments = forms.ChoiceField(
81 choices=[],
82 required=False,
83 label='Experiments:')
84 permission = forms.ChoiceField(
85 choices=[('0', 'Public'),('1', 'Private')],
86 initial=0,
87 widget=forms.RadioSelect(attrs={'class': 'custom-radio'}))
88 description = forms.CharField(
89 widget=forms.Textarea(attrs={'cols': 40,'rows': 3, 'style': 'resize:none'}),
90 required=False,
91 label='Description')
92 optchar = forms.CharField(max_length=1, label='Optional Char:', required=False)
93 file = forms.FileField(
94 label='Select Files',
95 widget=forms.ClearableFileInput(attrs={'multiple': True}))
96 96
97 97 class ExpForm(forms.Form):
98 98 """SingleExpInstForm is a Form class for the instrument select field in the Single Experiment interface.
@@ -100,9 +100,7 class ExpForm(forms.Form):
100 100 """
101 101 def __init__(self, *args, **kwargs):
102 102 super(ExpForm, self).__init__(*args, **kwargs)
103 madDB = madrigal.metadata.MadrigalDB()
104 madWebObj = madrigal.ui.web.MadrigalWeb(madDB)
105 experimentSelection = getSelection('experiments', args, kwargs)
106 self.fields['experiments'] = django.forms.ChoiceField(choices=getExperimentList(args, kwargs, madWebObj),
107 initial=experimentSelection,
108 required=False, label='Experiment')
103 self.fields['experiments'] = forms.ChoiceField(
104 choices=getExperimentList(args[0]['instrument']),
105 # initial=kwargs['exp'],
106 required=False, label='Experiments')
@@ -1,6 +1,4
1 <div class="row">
2 {{ form.experiments.label }}
3 </div>
1
4 2 <!-- Instrument select is its own row in selections column -->
5 3 <div class="row">
6 4 <div class="col-md-12">
@@ -6,14 +6,31
6 6 function populateExp(select) {
7 7
8 8 var kinst = select.options[select.selectedIndex].value;
9 var url = "{% url 'updata:get_experiments' %}" + '?instruments=' + kinst;
9 var url = "{% url 'updata:get_experiments' %}" + '?instrument=' + kinst;
10 10 // first delete all forms that are now out of date
11 divIndex = $(".single_form").index($("#experiments"))
12 $(".single_form").slice(divIndex).empty()
11 //divIndex = $(".single_form").index($("#id_experiments"))
12 //$(".single_form").slice(divIndex).empty()
13 13 // second populate the categories html
14 $(".single_form").slice(divIndex, divIndex + 1).load(url);
14 //$(".single_form").slice(divIndex, divIndex + 1).load(url);
15 $("#id_experiments").load(url);
15 16 }
16 17
18 function updateRadio(myRadio) {
19 if (myRadio.value == 'new') {
20 $( "#id_exp" ).prop( "disabled", false );
21 $( "#id_inst" ).prop( "disabled", false );
22 $( "#id_experiments" ).prop( "disabled", true );
23 $( "#id_instruments" ).prop( "disabled", true );
24 } else {
25 $( "#id_exp" ).prop( "disabled", true );
26 $( "#id_inst" ).prop( "disabled", true );
27 $( "#id_experiments" ).prop( "disabled", false );
28 $( "#id_instruments" ).prop( "disabled", false );
29 }
30
31 }
32
33
17 34 </script>
18 35
19 36 <style>
@@ -22,6 +39,10
22 39 margin: 0;
23 40 padding: 0;
24 41 }
42
43 .errorlist {
44 color: red;
45 }
25 46 </style>
26 47 {% endblock %}
27 48
@@ -32,70 +53,7
32 53
33 54 {% csrf_token %}
34 55
35 {% block description %}
36 <!-- subdivide selection column for instruments to be possibly filled in by ajax - single_form 0 -->
37 <div class="col-md-12 single_form" id="description">
38 <div class="row">
39 {{ form.description.label }}
40 </div>
41 <!-- Instrument select is its own row in selections column -->
42 <div class="row">
43 <div class="col-md-12">
44 {{ form.description }}
45 </div> <!-- end span -->
46 </div> <!-- end row -->
47 </div> <!-- end subdivide -->
48
49 {% endblock %}
50
51 {% block file %}
52 <div class="col-md-12 single_form" style="margin-top: 15px;" id="description">
53 <div class="row">
54 {{ form.file.label }}
55 </div>
56 <!-- Instrument select is its own row in selections column -->
57 <div class="row">
58 <div class="col-md-12">
59 {{ form.file }}
60 </div> <!-- end span -->
61 </div> <!-- end row -->
62 </div> <!-- end subdivide -->
63
64 {% endblock %}
65
66 {% block type %}
67 <div class="col-md-12 single_form" style="margin-top: 15px;" id="description">
68 <!-- Instrument select is its own row in selections column -->
69 <div class="row">
70 <div class="col-md-12">
71 {{ form.type }}
72 </div> <!-- end span -->
73 </div> <!-- end row -->
74 </div> <!-- end subdivide -->
75
76 {% endblock %}
77
78 {% block instruments %}
79 <!-- subdivide selection column for instruments to be possibly filled in by ajax - single_form 0 -->
80 <div class="col-md-12 single_form" style="margin-top: 15px;" id="instruments">
81
82 {% if form.instruments %}
83 {% include "madweb/instruments.html" %}
84 {% endif %}
85
86 </div> <!-- end subdivide -->
87 {% endblock %}
88
89 {% block experiments %}
90 <!-- subdivide selection column for experiments to be possibly filled in by ajax - single_form 0 -->
91 <div class="col-md-12 single_form" style="margin-top: 15px;" id="experiments">
92
93 {% if form.experiments %}
94 {% include "updata/experiments.html" %}
95 {% endif %}
96
97 </div> <!-- end subdivide -->
98 {% endblock %}
56 {{ form.as_p }}
99 57 <button style="margin-top: 15px;" type="submit">Load</button>
100 58
101 59 </form>
@@ -1,7 +1,7
1 1
2 2 from django.contrib.auth.decorators import login_required
3 3 from django.shortcuts import render
4 from .forms import UpdataForm, ExpForm
4 from apps.updata.forms import UpdataForm, ExpForm
5 5 from django.core.files.storage import FileSystemStorage
6 6 from django.contrib import messages
7 7
@@ -22,45 +22,77 def index(request):
22 22 madDB = madrigal.metadata.MadrigalDB()
23 23 madWebObj = madrigal.ui.web.MadrigalWeb(madDB)
24 24 siteName, siteList = madWebObj.getSiteInfo()
25
25 err = False
26 26 if request.method == 'POST':
27 27 form = UpdataForm(request.POST, request.FILES)
28 28 files = request.FILES.getlist('file')
29 files.sort()
30 filenames = []
31
32 choose = request.POST.get('choose')
33 if choose == 'new':
34 instCode = int(request.POST.get('inst'))
35 expTitle = request.POST.get('exp')
36 else:
37 instCode = int(request.POST.get('instruments'))
38 expId = request.POST.get('experiments')
39 madExp = madrigal.metadata.MadrigalExperiment()
40 expTitle = madExp.getExpNameByExpId(expId)
29 41
30 if form.is_valid():
31 try:
32 description = form.cleaned_data['description']
33 instCode = int(form.cleaned_data['instruments'])
34 expId = form.cleaned_data['experiments']
35 perm = int(form.cleaned_data['type'])
36
37 #saving file
38 for f in files:
39 fs = FileSystemStorage(location='/tmp')
40 fs.save(f.name, f)
41 madExp = madrigal.metadata.MadrigalExperiment()
42 filepath = os.path.join('/tmp', f.name)
43 expTitle = madExp.getExpNameByExpId(expId)
44
45 dbAdminObj.createMadrigalExperiment(filepath,expTitle, perm, description, instCode)
46
42 description = request.POST.get('description')
43 perm = int(request.POST.get('permission'))
44 optchar = request.POST.get('optchar').strip()
45 first = True
46 for f in files:
47 fs = FileSystemStorage(location='/tmp')
48 fs.save(f.name, f)
49 filename = os.path.join('/tmp', f.name)
50 ext = filename.split('.')[-1]
51 if ext not in ('hdf5', 'h5'):
52 convert = True
53 else:
54 convert = False
55
56 if first:
57 first = False
58 try:
59 expDir = dbAdminObj.createMadrigalExperiment(filename, expTitle, perm, description,
60 instCode, optChar=optchar, updateToMad3=convert)
61 except Exception as e:
62 err = True
63 messages.error(request,
64 'An error occur creating the experiment {}: {}'.format(expTitle, e)
65 )
66 break
67 else:
68 try:
69 dbAdminObj.addMadrigalFile(expDir, filename, perm, description, updateToMad3=convert)
70 except Exception as e:
71 err = True
72 messages.error(request,
73 'An error occur adding file {}: {}'.format(filename.split('/')[-1], e)
74 )
75
76 filenames.append(filename.split('/')[-1])
77 os.remove(filename)
78
79 if not err:
80 messages.success(request,
81 'Experiment {} created succesfully with files: {}'.format(expTitle, filenames)
82 )
83
84 madInstParams = madrigal.metadata.MadrigalInstrumentParameters()
85 madInstKindats = madrigal.metadata.MadrigalInstrumentKindats()
86
87 print('*** Updating local metadata ***')
88 dbAdminObj.__updateLocalMetadata__()
89 print('*** Rebuilding instParmTab.txt ***')
90 madInstParams.rebuildInstParmTable()
91 print('*** Rebuilding instKindatTab.txt ***')
92 madInstKindats.rebuildInstKindatTable()
93
94 form = UpdataForm()
47 95
48 madInstParams = madrigal.metadata.MadrigalInstrumentParameters()
49 madInstKindats = madrigal.metadata.MadrigalInstrumentKindats()
50
51 print('*** Updating local metadata ***')
52 dbAdminObj.__updateLocalMetadata__()
53 print('*** Rebuilding instParmTab.txt ***')
54 madInstParams.rebuildInstParmTable()
55 print('*** Rebuilding instKindatTab.txt ***')
56 madInstKindats.rebuildInstKindatTable()
57 messages.success(
58 request, 'Experimento(s) creado(s) exitosamente')
59 form = UpdataForm()
60
61 except Exception as e:
62 messages.error(
63 request, str(e))
64 96 else:
65 97 form = UpdataForm()
66 98
General Comments 0
You need to be logged in to leave comments. Login now