def clean(self): cleaned_data = super().clean() b_file = cleaned_data.get('rinex_base_file') r_file = cleaned_data.get('rinex_rover_file') if b_file and r_file: (b_isOK, b_erroMsg, b_header) = readRinexObs(b_file) (r_isOK, r_erroMsg, r_header) = readRinexObs(r_file) else: b_isOK = False r_isOK = False b_erroMsg = 'Arquivo rinex invalido.' r_erroMsg = '' if not b_isOK or not r_isOK: raise forms.ValidationError(b_erroMsg + r_erroMsg) # # Verificando se os dois arquivos são do mesmo dia b_Date = b_header['TIME OF FIRST OBS'].split() b_day = date(year=int(b_Date[0]),month=int(b_Date[1]),day=int(b_Date[2])) r_Date = r_header['TIME OF FIRST OBS'].split() r_day = date(year=int(r_Date[0]),month=int(r_Date[1]),day=int(r_Date[2])) if b_day != r_day: erroMsg = 'As observações não são do mesmo dia.' raise forms.ValidationError(erroMsg) # # Verificando o nome das estações for header in [r_header, b_header]: if not header['MARKER NAME']: erroMsg = 'Favor definir o nome da estação do arquivo ' erroMsg += header['RAW_NAME'] raise forms.ValidationError(erroMsg) if r_header['MARKER NAME'] == b_header['MARKER NAME']: erroMsg = 'Arquivos da mesma estação (' + b_header['MARKER NAME'] + ').' raise forms.ValidationError(erroMsg) # # Verificando as coordenadas de referencia if self.cleaned_data['coord_ref_type'] == 'header_rinex': self.cleaned_data['coord_X'] = float(b_header['APPROX POSITION XYZ'][0]) self.cleaned_data['coord_Y'] = float(b_header['APPROX POSITION XYZ'][1]) self.cleaned_data['coord_Z'] = float(b_header['APPROX POSITION XYZ'][2]) if (not self.cleaned_data['coord_X'] or not self.cleaned_data['coord_Y'] or not self.cleaned_data['coord_Z']): raise forms.ValidationError( 'Favor definir as coordenadas de referência')
def clean(self): cleaned_data = super().clean() rfile = cleaned_data.get('rinex_file') if not rfile: f_isOK = False erroMsg = 'Arquivo invalido.' elif is_zipfile(rfile): # verifica se os arquivos compactados são validos with ZipFile(rfile) as zfile: for file in zfile.namelist(): with zfile.open(file) as rzfile: (f_isOK, erroMsg, header) = readRinexObs(rzfile) if not f_isOK: raise forms.ValidationError(erroMsg) else: (f_isOK, erroMsg, header) = readRinexObs(rfile) if not f_isOK: raise forms.ValidationError(erroMsg)
def save_coord_form(self): coord_context = { 'datum': self.cleaned_data['datum'], 'epoch': float(self.cleaned_data['epoch']), 'devX': 0.0, 'devY': 0.0, 'devZ': 0.0, } # Leitura do arq rinex rFile = self.cleaned_data['rinex_base_file'].open('rb') (is_ok, erroMsg, header) = readRinexObs(rFile) if not is_ok: raise forms.ValidationError( 'Erro ao persistir as coordenadas de referencia. ' + 'Erro ao ler o arquivo rinex! ' + erroMsg) # TODO usar outra exception # Atribuindo nome da estação coord_context['station_name'] = header['MARKER NAME'] # Leitura das coordenadas no cabecalho do arquivo rinex ou do formulário # conforme especificado pelo usuário coord_context['X'] = self.cleaned_data['coord_X'] coord_context['Y'] = self.cleaned_data['coord_Y'] coord_context['Z'] = self.cleaned_data['coord_Z'] if self.cleaned_data['coord_ref_type'] not in [ 'header_rinex', 'user_set' ]: raise forms.ValidationError( 'Favor definir a origem das coordenadas' + ' de referência.') # TODO usar outra exception # Criando uma instancia da Classe coordenadas com os atributos do coord_context coord_ref = Coordinates(**coord_context) # Persistindo coordenadas no bando de dados coord_ref.save() #fim com sucesso da função save_coord_form return coord_ref # Retornando uma instancia da classe coordenadas
def clean(self): cleaned_data = super().clean() rfile = cleaned_data.get('rinex_rover_file') headers = [] if not rfile: f_isOK = False erroMsg = 'Arquivo invalido.' elif is_zipfile(rfile): # verifica se os arquivos compactados são validos with ZipFile(rfile) as zfile: for file in zfile.namelist(): with zfile.open(file) as rzfile: (f_isOK, erroMsg, header) = readRinexObs(rzfile) if not f_isOK: raise forms.ValidationError(erroMsg) else: headers.append(header) else: (f_isOK, erroMsg, header) = readRinexObs(rfile) headers = [header] if not f_isOK: raise forms.ValidationError(erroMsg) self.bases = {} for header in headers: # # Verificando o nome das estações if not header['MARKER NAME']: erroMsg = 'Favor definir o nome da estação do arquivo ' erroMsg += header['RAW_NAME'] raise forms.ValidationError(erroMsg) # # Verificando as coordenadas aproximadas coord_X = 0 coord_Y = 0 coord_Z = 0 if self.cleaned_data['coord_ref_type'] == 'header_rinex': coord_X = float(header['APPROX POSITION XYZ'][0]) coord_Y = float(header['APPROX POSITION XYZ'][1]) coord_Z = float(header['APPROX POSITION XYZ'][2]) if (not coord_X or not coord_Y or not coord_Z): raise forms.ValidationError( 'Favor definir as coordenadas aproximadas da estação no arquivo ' + header['RAW_NAME']) # Pré-seleção das bases da RBMC (Validação da existencia do arquivo na API do Bernese) bases_names = '' if self.cleaned_data['base_select_type'] == 'auto': bases = basesRBMC(coord_X, coord_Y, coord_Z, cleaned_data['base_select_max_distance']) elif self.cleaned_data['base_select_type'] == 'manual': bases = cleaned_data['bases_rbmc_choices'].replace( " ", "").replace("'", "").replace('[', '').replace(']', '').split(',') for base in bases: if base != header['MARKER NAME']: bases_names += base bases_names += ' ' if bases_names: self.bases[header['RAW_NAME']] = bases_names else: raise forms.ValidationError( 'Não foram encontradas bases da RBMC para o arquivo ' + header['RAW_NAME'] + ' em um raio de {}km'.format( cleaned_data['base_select_max_distance']))