"""Forms for cedar application $Id: forms.py 7033 2019-10-03 20:15:55Z brideout $ """ # standard python imports import os.path import datetime # django imports import django.forms import django.utils.html import django.utils.safestring # Madrigal imports import madrigal.metadata import madrigal.ui.userData class AdminLogForm(django.forms.Form): """AdminLogForm is a Form class for the get log admin interface """ def __init__(self, *args, **kwargs): super(AdminLogForm, self).__init__(*args, **kwargs) selectedSite = None kinstChoices = [('0', 'Select a site first'),] if len(args) > 0: try: if 'site' in args[0]: selectedSite = int(args[0]['site']) except: pass madDB = madrigal.metadata.MadrigalDB() madSiteObj = madrigal.metadata.MadrigalSite(madDB) madInstObj = madrigal.metadata.MadrigalInstrument(madDB) self.madUserObj = madrigal.ui.userData.MadrigalUserData(madDB) madExpObj = madrigal.metadata.MadrigalExperiment(madDB, os.path.join(madDB.getMadroot(), 'metadata/expTabAll.txt')) siteDict = {} # temp dict with key = siteId, value = list of kinst where there is data at that site for i in range(madExpObj.getExpCount()): siteId = madExpObj.getExpSiteIdByPosition(i) kinst = madExpObj.getKinstByPosition(i) try: if kinst in siteDict[siteId]: continue except KeyError: pass expUrl = madExpObj.getExpUrlByPosition(i) if madDB.isTestExperiment(expUrl): continue if siteId in siteDict: siteDict[siteId].append(kinst) else: siteDict[siteId] = [kinst] # make siteList, which is sorted list of (siteid, kinst, instName) and siteChoices # which is (siteID, siteName) self.siteList = [] self.siteChoices = [("0", "Select your site")] sites = list(siteDict.keys()) sites.sort() for site in sites: if site not in (10,): #skip CEDAR site self.siteChoices.append((site, madSiteObj.getSiteName(site))) kinstList = siteDict[site] kinstList.sort() for kinst in kinstList: self.siteList.append((site, kinst, madInstObj.getInstrumentName(kinst))) if not selectedSite is None: if selectedSite == site: kinstChoices.append((kinst, madInstObj.getInstrumentName(kinst))) # now add to self.siteList and self.siteChoices from hostSite.txt file filename = os.path.join(madDB.getMadroot(), 'metadata/hostSite.txt') f = open(filename) lines = f.readlines() for line in lines: items = line.strip().split(',') if len(items) < 3: continue siteId = int(items[0]) # check this is unique siteId if siteId in siteDict: raise IOError('File hostSite.txt has siteId %i from siteTab.txt' % (siteId)) kinstList = [] for item in items[2:]: kinst = int(item) kinstList.append(kinst) self.siteList.append((siteId, kinst, madInstObj.getInstrumentName(kinst))) if not selectedSite is None: if selectedSite == siteId: kinstChoices.append((kinst, madInstObj.getInstrumentName(kinst))) self.siteChoices.append((str(siteId), items[1])) self.fields['site'] = django.forms.ChoiceField(widget = django.forms.Select(attrs={"onChange":'selectSite(this.form)'}), choices=self.siteChoices, initial='0') self.fields['password'] = django.forms.CharField(widget = django.forms.PasswordInput()) self.fields['kinst'] = django.forms.CharField(widget=django.forms.SelectMultiple(choices=kinstChoices)) # time selection self.fields['startDate'] = django.forms.DateField(input_formats=['%Y-%m-%d'], initial=datetime.datetime(2011,1,1,0,0,0)) now = datetime.datetime.now() self.fields['endDate'] = django.forms.DateField(input_formats=['%Y-%m-%d'], initial=datetime.datetime(now.year,12,31,0,0,0)) def clean(self): """clean verifies password """ siteId = int(self.cleaned_data['site']) siteName = None for id, name in self.siteChoices: if int(id) == siteId: siteName = name break if siteName is None: raise django.forms.ValidationError('Illegal site choosen') if not self.madUserObj.verifyUser(siteName, self.cleaned_data['password']): raise django.forms.ValidationError('Incorrect password')