views.py
167 lines
| 7.1 KiB
| text/x-python
|
PythonLexer
r2 | ||||
from django.contrib.auth.decorators import login_required | ||||
from django.shortcuts import render | ||||
r8 | from apps.updata.forms import UpdataForm, ExpForm | |||
r2 | from django.core.files.storage import FileSystemStorage | |||
from django.contrib import messages | ||||
import os | ||||
r11 | import glob | |||
import datetime | ||||
r2 | ||||
# madrigal imports | ||||
import madrigal.metadata | ||||
import madrigal.ui.web | ||||
import madrigal.admin | ||||
r6 | @login_required(login_url='/madrigal/accounts/login/') | |||
r2 | def index(request): | |||
''' | ||||
Uploading experiments data view. Allows user to upload experiment files | ||||
''' | ||||
dbAdminObj = madrigal.admin.MadrigalDBAdmin() | ||||
madDB = madrigal.metadata.MadrigalDB() | ||||
madWebObj = madrigal.ui.web.MadrigalWeb(madDB) | ||||
r17 | madMeta = madrigal.metadata.MadrigalInstrument(madDB) | |||
r2 | siteName, siteList = madWebObj.getSiteInfo() | |||
r8 | err = False | |||
r2 | if request.method == 'POST': | |||
r16 | for root, folders, tmp_files in os.walk('/madrigal/experiments/tmp/'): | |||
r11 | for f in tmp_files: | |||
os.remove(os.path.join(root, f)) | ||||
r2 | form = UpdataForm(request.POST, request.FILES) | |||
r16 | files = request.FILES.getlist('file') | |||
# files.sort() | ||||
r8 | filenames = [] | |||
choose = request.POST.get('choose') | ||||
if choose == 'new': | ||||
instCode = int(request.POST.get('inst')) | ||||
expTitle = request.POST.get('exp') | ||||
else: | ||||
instCode = int(request.POST.get('instruments')) | ||||
expId = request.POST.get('experiments') | ||||
madExp = madrigal.metadata.MadrigalExperiment() | ||||
expTitle = madExp.getExpNameByExpId(expId) | ||||
r2 | ||||
r8 | description = request.POST.get('description') | |||
perm = int(request.POST.get('permission')) | ||||
optchar = request.POST.get('optchar').strip() | ||||
r17 | category = int(request.POST.get('category')) | |||
r8 | first = True | |||
r11 | if len(files) == 1: | |||
r16 | fs = FileSystemStorage(location='/madrigal/experiments/tmp') | |||
r11 | fs.save(files[0].name, files[0]) | |||
r16 | filename = os.path.join('/madrigal/experiments/tmp', files[0].name) | |||
r11 | fileInfo = madrigal.data.MadrigalFile(filename, madDB) | |||
sTime = fileInfo.getEarliestTime() | ||||
startTime = datetime.datetime(sTime[0],sTime[1],sTime[2],sTime[3],sTime[4],sTime[5]) | ||||
exp_list = madWebObj.getExpsOnDate(instCode, startTime.year, startTime.month, startTime.day) | ||||
r17 | ext = filename.split('.')[-1] | |||
if ext not in ('hdf5', 'h5'): | ||||
convert = True | ||||
else: | ||||
convert = False | ||||
expDir = os.path.join('/madrigal/experiments/', startTime.strftime('%Y'), madMeta.getInstrumentMnemonic(instCode), startTime.strftime('%d%b%y').lower()) | ||||
if os.path.exists(expDir): | ||||
#expDir = exp_list[0][2] | ||||
r8 | try: | |||
r17 | if category==1 and os.path.exists(os.path.join(expDir, files[0].name)): | |||
dbAdminObj.overwriteMadrigalFile(expDir, filename, notify=True) | ||||
messages.warning(request, | ||||
'Filename {} has been overwritten'.format(files[0].name) | ||||
) | ||||
else: | ||||
dbAdminObj.addMadrigalFile(expDir, filename, perm, description, category=category, updateToMad3=convert) | ||||
messages.warning(request, | ||||
'Filename {} has been added with category={}'.format(files[0].name, category) | ||||
) | ||||
r8 | except Exception as e: | |||
err = True | ||||
messages.error(request, | ||||
r11 | 'An error occur adding file {}: {}'.format(filename.split('/')[-1], e) | |||
r8 | ) | |||
else: | ||||
r16 | if os.path.exists(os.path.join('/madrigal/experiments/tmp', 'overview', files[0].name + '.summary')): | |||
os.remove(os.path.join('/madrigal/experiments/tmp', 'overview', files[0].name + '.summary')) | ||||
r8 | try: | |||
r11 | expDir = dbAdminObj.createMadrigalExperiment(filename, expTitle, perm, description, | |||
r17 | instCode, category=category, optChar=optchar, updateToMad3=convert) | |||
r8 | except Exception as e: | |||
err = True | ||||
messages.error(request, | ||||
r11 | 'An error occur creating the experiment {}: {}'.format(expTitle, e) | |||
r8 | ) | |||
filenames.append(filename.split('/')[-1]) | ||||
r11 | else: | |||
for f in files: | ||||
r16 | fs = FileSystemStorage(location='/madrigal/experiments/tmp') | |||
r11 | fs.save(f.name, f) | |||
r16 | filename = os.path.join('/madrigal/experiments/tmp', f.name) | |||
r11 | ext = filename.split('.')[-1] | |||
if ext not in ('hdf5', 'h5'): | ||||
convert = True | ||||
else: | ||||
convert = False | ||||
if first: | ||||
first = False | ||||
try: | ||||
expDir = dbAdminObj.createMadrigalExperiment(filename, expTitle, perm, description, | ||||
r17 | instCode, category=category, optChar=optchar, updateToMad3=convert) | |||
r11 | except Exception as e: | |||
err = True | ||||
messages.error(request, | ||||
'An error occur creating the experiment {}: {}'.format(expTitle, e) | ||||
) | ||||
break | ||||
else: | ||||
try: | ||||
r17 | dbAdminObj.addMadrigalFile(expDir, filename, perm, description, category=category, updateToMad3=convert) | |||
r11 | except Exception as e: | |||
err = True | ||||
messages.error(request, | ||||
'An error occur adding file {}: {}'.format(filename.split('/')[-1], e) | ||||
) | ||||
filenames.append(filename.split('/')[-1]) | ||||
os.remove(filename) | ||||
r8 | ||||
if not err: | ||||
messages.success(request, | ||||
'Experiment {} created succesfully with files: {}'.format(expTitle, filenames) | ||||
) | ||||
madInstParams = madrigal.metadata.MadrigalInstrumentParameters() | ||||
madInstKindats = madrigal.metadata.MadrigalInstrumentKindats() | ||||
print('*** Updating local metadata ***') | ||||
dbAdminObj.__updateLocalMetadata__() | ||||
print('*** Rebuilding instParmTab.txt ***') | ||||
madInstParams.rebuildInstParmTable() | ||||
print('*** Rebuilding instKindatTab.txt ***') | ||||
madInstKindats.rebuildInstKindatTable() | ||||
form = UpdataForm() | ||||
r2 | ||||
else: | ||||
form = UpdataForm() | ||||
return render(request, 'updata/index.html', { | ||||
'form': form, | ||||
'site_name': siteName, | ||||
'site_list': siteList, | ||||
}) | ||||
def get_experiments(request): | ||||
"""get_experiments is a Ajax call that returns the experiments select html to support the | ||||
updata UI. Called when a user modifies the intruments select field. | ||||
Inputs: | ||||
request | ||||
""" | ||||
form = ExpForm(request.GET) | ||||
return render(request, 'updata/experiments.html', {'form': form}) | ||||