@@ -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:8 |
|
|
11 | # command: python manage.py runserver 0.0.0.0:8888 | |
|
12 | 12 | env_file: .env |
|
13 | 13 | # ports: |
|
14 |
# - 8 |
|
|
14 | # - 8888:8888 | |
|
15 | 15 | volumes: |
|
16 | 16 | - '${EXP_DIR}:/madrigal/experiments' |
|
17 | - '/usr/local/madrigal/metadata:/madrigal/metadata' | |
|
18 |
- '/ |
|
|
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(' |
|
|
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(' |
|
|
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 | 23 | |
|
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') | |
|
24 | def getExperimentList(instrumentId=None): | |
|
46 | 25 | |
|
47 | def getExperimentList(args, kwargs, madWeb, header='Select experiment: '): | |
|
26 | madDB = madrigal.metadata.MadrigalDB() | |
|
27 | madWeb = madrigal.ui.web.MadrigalWeb(madDB) | |
|
48 | 28 | |
|
49 | instrumentsId= int(getSelection('instruments', args, kwargs)) | |
|
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', |
|
|
40 | expListin = [('0', 'Select experiment: '),] | |
|
59 | 41 | for exp in experiments: |
|
60 | 42 | expListin.append((exp[0], exp[2])) |
|
61 | 43 | |
@@ -68,9 +50,8 def getExperimentList(args, kwargs, madWeb, header='Select experiment: '): | |||
|
68 | 50 | |
|
69 | 51 | return(expList) |
|
70 | 52 | |
|
71 | class UpdataForm(forms.Form): | |
|
72 | def __init__(self, *args, **kwargs): | |
|
73 | super(UpdataForm, self).__init__(*args, **kwargs) | |
|
53 | def getInstrumentList(): | |
|
54 | ||
|
74 | 55 |
|
|
75 | 56 |
|
|
76 | 57 |
|
@@ -78,21 +59,40 class UpdataForm(forms.Form): | |||
|
78 | 59 |
|
|
79 | 60 |
|
|
80 | 61 |
|
|
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:') | |
|
62 | return(instList) | |
|
86 | 63 | |
|
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:') | |
|
64 | class UpdataForm(forms.Form): | |
|
92 | 65 | |
|
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' %}" + '?instrument |
|
|
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 |
|
|
|
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,28 +22,64 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 = [] | |
|
29 | 31 | |
|
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']) | |
|
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) | |
|
36 | 41 |
|
|
37 | #saving file | |
|
42 | description = request.POST.get('description') | |
|
43 | perm = int(request.POST.get('permission')) | |
|
44 | optchar = request.POST.get('optchar').strip() | |
|
45 | first = True | |
|
38 | 46 |
|
|
39 | 47 |
|
|
40 | 48 |
|
|
41 | madExp = madrigal.metadata.MadrigalExperiment() | |
|
42 | filepath = os.path.join('/tmp', f.name) | |
|
43 | expTitle = madExp.getExpNameByExpId(expId) | |
|
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 | |
|
44 | 55 |
|
|
45 | dbAdminObj.createMadrigalExperiment(filepath,expTitle, perm, description, instCode) | |
|
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) | |
|
46 | 78 | |
|
79 | if not err: | |
|
80 | messages.success(request, | |
|
81 | 'Experiment {} created succesfully with files: {}'.format(expTitle, filenames) | |
|
82 | ) | |
|
47 | 83 | |
|
48 | 84 |
|
|
49 | 85 |
|
@@ -54,13 +90,9 def index(request): | |||
|
54 | 90 |
|
|
55 | 91 |
|
|
56 | 92 |
|
|
57 | messages.success( | |
|
58 | request, 'Experimento(s) creado(s) exitosamente') | |
|
93 | ||
|
59 | 94 |
|
|
60 | 95 |
|
|
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