##// END OF EJS Templates
Review updata app
jespinoza -
r8:9c1b6919a8a9
parent child
Show More
@@ -1,31 +1,31
1 1 version: '3'
2 2
3 3 services:
4 4 web:
5 5 container_name: 'madrigal'
6 6 build: .
7 7 restart: always
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'
22 22 image: nginx:1.15-alpine
23 23 volumes:
24 24 - ./source/madpy/djangoMad/madweb/static:/static
25 25 - ./nginx:/etc/nginx/conf.d
26 26 ports:
27 27 - "${MAD_PORT}:8080"
28 28 depends_on:
29 29 - web
30 30 command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
31 31
@@ -1,21 +1,22
1 1 # configuration
2 2
3 3 upstream djangomad {
4 4 server web:8000;
5 5 }
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;
12 13 proxy_set_header Host $host;
13 14 proxy_redirect off;
14 15 proxy_set_header X-Script-Name /madrigal;
15 16 proxy_pass http://djangomad;
16 17 }
17 18
18 19 location /madrigal/static/ {
19 20 alias /static/;
20 21 }
21 22 }
@@ -1,38 +1,38
1 1 from django.contrib.auth import authenticate
2 2 from django.contrib.auth import login, logout
3 3 from django.contrib.auth.forms import AuthenticationForm
4 4 from django.shortcuts import render, redirect
5 5
6 6 ''' Login to updata app for ROJ staff'''
7 7
8 8 def login_view(request):
9 9
10 10 form = AuthenticationForm()
11 11 if request.method == "POST":
12 12 form = AuthenticationForm(data=request.POST)
13 13
14 14 if form.is_valid():
15 15
16 16 username = form.cleaned_data['username']
17 17 password = form.cleaned_data['password']
18 18
19 19 user = authenticate(username=username, password=password)
20 20
21 21 if user is not None:
22 22
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:
30 30 context = {'error_login': "error"}
31 31 return render(request, "login/login.html", context )
32 32
33 33 return render(request, "login/login.html", {'form': form})
34 34
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
@@ -1,108 +1,106
1 1 from django import forms
2 2 import django.utils.html
3 3 import django.utils.safestring
4 4 import django.template.defaulttags
5 5
6 6 # third party imports
7 7 import numpy
8 8
9 9 # Madrigal imports
10 10 import madrigal.metadata
11 11 import madrigal.ui.web
12 12
13 13 # madrigal imports
14 14 import madrigal._derive
15 15 import madrigal.metadata
16 16 import madrigal.ui.web
17 17 import madrigal.cedar
18 18 import madrigal.isprint
19 19 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
62 44 # Using set
63 45 seen = set()
64 46
65 47 # using list comprehension
66 48 expList = [(a, b) for a, b in expListin
67 49 if not (b in seen or seen.add(b))]
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.
99 99 Use this because its faster to create than the full SingleExpDefaultForm
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,9 +1,7
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">
7 5 {{ form.experiments }}
8 6 </div> <!-- end span -->
9 7 </div> <!-- end row --> No newline at end of file
@@ -1,102 +1,60
1 1 {% extends "base.html" %}
2 2 {% block title %}Upload Data{% endblock %}
3 3
4 4 {% block extra_head %}
5 5 <script type="text/javascript">
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>
20 37 .custom-radio {
21 38 list-style: none;
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
28 49 {% block content %}
29 50
30 51 <center><h4>Upload Data</h4></center>
31 52 <form method="post" enctype="multipart/form-data">
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>
102 60 {% endblock %} No newline at end of file
@@ -1,83 +1,115
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
8 8 import os
9 9
10 10 # madrigal imports
11 11 import madrigal.metadata
12 12 import madrigal.ui.web
13 13 import madrigal.admin
14 14
15 15 @login_required(login_url='/madrigal/accounts/login/')
16 16 def index(request):
17 17 '''
18 18 Uploading experiments data view. Allows user to upload experiment files
19 19
20 20 '''
21 21 dbAdminObj = madrigal.admin.MadrigalDBAdmin()
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
67 99 return render(request, 'updata/index.html', {
68 100 'form': form,
69 101 'site_name': siteName,
70 102 'site_list': siteList,
71 103 })
72 104
73 105
74 106 def get_experiments(request):
75 107 """get_experiments is a Ajax call that returns the experiments select html to support the
76 108 updata UI. Called when a user modifies the intruments select field.
77 109
78 110 Inputs:
79 111 request
80 112 """
81 113 form = ExpForm(request.GET)
82 114
83 115 return render(request, 'updata/experiments.html', {'form': form})
General Comments 0
You need to be logged in to leave comments. Login now