from django.contrib.auth.decorators import login_required from django.shortcuts import render from apps.updata.forms import UpdataForm, ExpForm from django.core.files.storage import FileSystemStorage from django.contrib import messages import os # madrigal imports import madrigal.metadata import madrigal.ui.web import madrigal.admin @login_required(login_url='/madrigal/accounts/login/') 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) siteName, siteList = madWebObj.getSiteInfo() err = False if request.method == 'POST': form = UpdataForm(request.POST, request.FILES) files = request.FILES.getlist('file') #files.sort() 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) description = request.POST.get('description') perm = int(request.POST.get('permission')) optchar = request.POST.get('optchar').strip() first = True for f in files: fs = FileSystemStorage(location='/tmp') fs.save(f.name, f) filename = os.path.join('/tmp', f.name) 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, instCode, optChar=optchar, updateToMad3=convert) except Exception as e: err = True messages.error(request, 'An error occur creating the experiment {}: {}'.format(expTitle, e) ) break else: try: dbAdminObj.addMadrigalFile(expDir, filename, perm, description, updateToMad3=convert) 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) 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() 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})