def georeferenceGetProcess(request): log.info('Receive request GetGeoreferenceProcess') try: request_data = None if request.method == 'POST': request_data = request.json_body if 'georeferenceid' in request_data: georeferenceid = int(request_data['georeferenceid']) log.debug('Parsed parameters - georeferenceid: %s'%georeferenceid) mapObj = Map.by_id(int(Georeferenzierungsprozess.by_id(georeferenceid, request.db).mapid), request.db) response = createResponseForSpecificGeoreferenceProcess(mapObj, request, georeferenceid) elif 'objectid' in request_data: mapObjId = request_data['objectid'] log.debug('Parsed parameters - mapid: %s'%mapObjId) mapObj = Map.by_id(int(mapObjId), request.db) response = createGeneralResponse(mapObj, request) else: log.error('Could not find a georeferenceid or and objectid in the post request parameters ...') raise GeoreferenceParameterError return response except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except ProcessIsInvalideException as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest('This georeference process is blocked for further work!') except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def georeferenceGetProcess(request): log.info('Receive request GetGeoreferenceProcess') try: request_data = None if request.method == 'POST': request_data = request.json_body objectid = None if 'objectid' in request_data: validateId(request_data['objectid']) objectid = int(request_data['objectid']) log.debug('Objectid is valide: %s'%request_data) georeferenceid = None if 'georeferenceid' in request_data: georeferenceid = int(request_data['georeferenceid']) if georeferenceid: response = createResponseForSpecificGeoreferenceProcess(objectid, georeferenceid, request) else: response = createGeneralResponse(objectid, request) return json.dumps(response, ensure_ascii=False, encoding='utf-8') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s'%e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while creating response for getprocess request - %s'%e log.error(message) return HTTPInternalServerError(message)
def getAdminEvaluationPage(request): log.info('Request - Get georeference profile page.') try: resultSet = request.db.execute(georeference_evaluation_query) log.debug('Create response list') georef_profile = [] for record in resultSet: encoded_clip_params = str( convertUnicodeDictToUtf(ast.literal_eval( record['clip_params']))).replace('\'', '"') georef_profile.append({ 'georef_id': record['georef_id'], 'mtb_id': record['mtbid'], 'clip_params': encoded_clip_params, 'time': record['time'], 'transformed': record['isttransformiert'], 'isvalide': record['isvalide'], 'titel': record['titel'], 'key': record['key'], 'time_georef': record['time_georef'], 'type': record['type'], 'userid': record['userid'], 'published': record['published'] }) log.debug('Response: %s' % georef_profile) return {'georef_profile': georef_profile} except Exception as e: log.error( 'Error while trying to request georeference history information') log.error(e) return {}
def resetGeorefParameters(request): try: log.info('Receive a reset georeference parameter requests.') login = checkIsUser(request) dbsession = request.db messtischblatt_id = request.params['mtbid'] georeference_process = Georeferenzierungsprozess.by_messtischblattid(messtischblatt_id, dbsession) referenz = georeference_process.clipparameter fehlerbeschreibung = 'Zuruecksetzen von Georeferenzierungsparameter für GeorefId=%s'%georeference_process.id if login and messtischblatt_id and referenz and fehlerbeschreibung and Users.by_username(login, dbsession): log.debug('Save reset process in table fehlermeldungen ...') newFehlermeldung = Fehlermeldung(objektid = messtischblatt_id, referenz = referenz, nutzerid = login, fehlerbeschreibung = fehlerbeschreibung, timestamp = getTimestampAsPGStr()) dbsession.add(newFehlermeldung) log.debug('Remove georeference process ...') dbsession.delete(georeference_process) log.debug('Remove refmtblayer ...') try: refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt_id, dbsession) dbsession.delete(refmtblayer) except: log.debug('No entry for refmtblayer found ...') pass log.debug('Update messtischblatt db ...') messtischblatt = Messtischblatt.by_id(messtischblatt_id, dbsession) messtischblatt.isttransformiert = False return json.dumps({'status':'confirmed'}, ensure_ascii=False, encoding='utf-8') except DBAPIError: log.error('Problems while trying to remove georeference parameter from the database ...') return Response(conn_err_msg, content_type='text/plain', status_int=500)
def publishGeorefParameters(request): log.info('Request - Publish georeference result.') try: log.debug('Parse parameters ...') objectid = request.params['objectid'] georeferenceid = request.params['georeferenceid'] messtischblatt = Messtischblatt.by_id(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id( georeferenceid, request.db) log.debug('Udpate parameters') georeferenceprocess.publish = True messtischblatt.updated = False return json.dumps( { 'message': 'The georeference process is now published. The georeference map will soon be updated and than ready for accessing.' }, ensure_ascii=False, encoding='utf-8') except Exception as e: log.error( 'Error while trying to request georeference history information') log.error(e) return {}
def georeferenceGetProcess(request): log.info('Receive request GetGeoreferenceProcess') try: request_data = None if request.method == 'POST': request_data = request.json_body objectid = None if 'objectid' in request_data: validateId(request_data['objectid']) objectid = int(request_data['objectid']) log.debug('Objectid is valide: %s' % request_data) georeferenceid = None if 'georeferenceid' in request_data: georeferenceid = int(request_data['georeferenceid']) if georeferenceid: response = createResponseForSpecificGeoreferenceProcess( objectid, georeferenceid, request) else: response = createGeneralResponse(objectid, request) return json.dumps(response, ensure_ascii=False, encoding='utf-8') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s' % e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while creating response for getprocess request - %s' % e log.error(message) return HTTPInternalServerError(message)
def createResponseForSpecificGeoreferenceProcess(objectid, georeferenceid, request): log.debug('Create response for specific georeference process ...') messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) pure_clipparameters = ast.literal_eval(str(georeferenceprocess.clipparameter)) gcps = None if 'new' in pure_clipparameters: # in case of an update process gcps = pure_clipparameters['new'] else: # in case of a new registered clip_parameter gcps = pure_clipparameters # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type':'update', 'objectid': messtischblatt.id, 'georeferenceid':georeferenceid, 'timestamp':str(georeferenceprocess.timestamp), 'gcps':gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def registerNewGeoreferenceProcessInDb(objectid, userid, gcps, type, dbsession): log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georefProcess = Georeferenzierungsprozess(messtischblattid = objectid, nutzerid = userid, clipparameter = gcps, timestamp = timestamp, isvalide = True, type = type, refzoomify = True, publish = False, processed = False) dbsession.add(georefProcess) dbsession.flush() return georefProcess
def __queryParameterWithGeorefIdAreValide__(self, isValideMtb, isValideGeorefId): if isValideMtb and isValideGeorefId: log.debug("MtbId: %s, Georefid: %s - are valide"%(self.mtbid,self.georefid)) return True else: message = "The query parameter are not valide" log.error(message) raise GeoreferenceParameterError(message)
def __queryParameterAreValide__(self, isValideMtb, isValidePoints): if isValideMtb and isValidePoints: log.debug("MtbId: %s, Points: %s - are valide"%(self.mtbid,self.points)) return True else: message = "The query parameter are not valide" log.error(message) raise GeoreferenceParameterError(message)
def registerUpdateGeoreferenceProcessInDb(mapObj, userid, gcps, dbsession): log.debug('Create georeference process record ...') activeGeorefProcess = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId(mapObj.id, dbsession) georefProcess = Georeferenzierungsprozess(messtischblattid = mapObj.apsobjectid, nutzerid = userid, georefparams = ast.literal_eval(gcps), clipparameter = gcps, timestamp = getTimestampAsPGStr(), isactive = False, type = 'update', adminvalidation = '', processed = False, mapid = mapObj.id, overwrites = activeGeorefProcess.id) dbsession.add(georefProcess) dbsession.flush() return georefProcess
def createResponseForSpecificGeoreferenceProcess(mapObj, request, georeferenceid=None): log.debug('Create response for specific georeference process ...') mtb_extent = Map.getExtent(mapObj.id, request.db) if georeferenceid is None: georeferenceprocess = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId( mapObj.id, request.db) else: georeferenceprocess = Georeferenzierungsprozess.by_id( georeferenceid, request.db) pure_clipparameters = georeferenceprocess.georefparams # get the actual valide gcps gcps = None if georeferenceprocess.type == 'new': # in case of a new registered clip_parameter gcps = pure_clipparameters else: # in case of an update process gcps = pure_clipparameters['new'] # get zoomify and metadata information log.debug('Create response ...') metadata = Metadata.by_id(mapObj.id, request.db) response = { 'type': 'update', 'objectid': mapObj.id, 'georeferenceid': georeferenceprocess.id, 'timestamp': str(georeferenceprocess.timestamp), 'gcps': gcps, 'extent': mtb_extent, 'zoomify': metadata.imagezoomify, 'metadata': { 'dateiname': mapObj.apsdateiname, 'titel_long': metadata.title, 'titel_short': metadata.titleshort } } # check if there is an other user is working on this map right now # @TODO use babel lingua fpr translation try: areTherePendingUpdateProcesses = Georeferenzierungsprozess.arePendingProcessForMapId( mapObj.id, request.db) if areTherePendingUpdateProcesses: if request.locale_name == 'de': warnMsg = 'Aktuell wird das Kartenblatt von anderen Nutzern bearbeitet. Um Informationsverluste zu vermeiden versuchen Sie es bitte noch einmal in ein 15 Minuten.' else: warnMsg = 'Right now another users is working on the georeferencing of this map sheet. For preventing information losses please try again in 15 minutes.' response['warn'] = warnMsg return response except ProcessIsInvalideException as e: pass return response
def createGeneralResponse(objectid, request): log.debug('Create general response ...') lastGeoreferenceId = '' lastTimestamp = '' messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_getLatestValidGeorefProcessForObjectId( messtischblatt.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess( objectid, isAlreadyGeorefProcess.id, request) else: gcps = { 'source': 'pixel', 'target': 'EPSG:4314', 'gcps': [{ "source": [], "target": [mtb_extent[0], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[0], mtb_extent[3]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[3]] }] } # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type': 'new', 'objectid': messtischblatt.id, 'georeferenceid': lastGeoreferenceId, 'timestamp': str(lastTimestamp), 'gcps': gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def createResponseForSpecificGeoreferenceProcess(mapObj, request, georeferenceid = None): log.debug('Create response for specific georeference process ...') mtb_extent = Map.getExtent(mapObj.id, request.db) if georeferenceid is None: georeferenceprocess = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId(mapObj.id, request.db) else: georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) pure_clipparameters = georeferenceprocess.georefparams # get the actual valide gcps gcps = None if georeferenceprocess.type == 'new': # in case of a new registered clip_parameter gcps = pure_clipparameters else: # in case of an update process gcps = pure_clipparameters['new'] # get zoomify and metadata information log.debug('Create response ...') metadata = Metadata.by_id(mapObj.id, request.db) response = { 'type':'update', 'objectid': mapObj.id, 'georeferenceid':georeferenceprocess.id, 'timestamp':str(georeferenceprocess.timestamp), 'gcps':gcps, 'extent': mtb_extent, 'zoomify': metadata.imagezoomify, 'metadata': { 'dateiname': mapObj.apsdateiname, 'titel_long': metadata.title, 'titel_short': metadata.titleshort } } # check if there is an other user is working on this map right now # @TODO use babel lingua fpr translation try: areTherePendingUpdateProcesses = Georeferenzierungsprozess.arePendingProcessForMapId(mapObj.id, request.db) if areTherePendingUpdateProcesses: if request.locale_name == 'de': warnMsg = 'Aktuell wird das Kartenblatt von anderen Nutzern bearbeitet. Um Informationsverluste zu vermeiden versuchen Sie es bitte noch einmal in ein 15 Minuten.' else: warnMsg = 'Right now another users is working on the georeferencing of this map sheet. For preventing information losses please try again in 15 minutes.' response['warn'] = warnMsg return response except ProcessIsInvalideException as e: pass return response
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body if request_data: validateId(request_data['id']) log.debug('Request data is valide: %s'%request_data) log.debug('Check if there exists a registered georeference process for this messtischblatt ...') messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid(messtischblatt.id, request.db) if isAlreadyGeorefProcess is None: response = {'text':'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.'} return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf(request_data['georeference']) georefProcess = registerNewGeoreferenceProcessInDb(messtischblatt.id, userid, str(encoded_clip_params), 'update', request.db) log.debug('Set update status for messtischblatt ...') messtischblatt.setIsUpdated(True) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len(request_data['georeference']['remove']['gcps'])*5 #gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = {'text':'Georeference result updated. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':achievement_points, 'gcps':request_data['georeference']['new'] ,'type':'update'} return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError('The remove and new parameters are not valide.') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s'%e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while computing validation result - %s'%e log.error(message) return HTTPInternalServerError(message)
def getUploadProfilePage(request): log.debug('Request - Get Upload profile page.') dbsession = request.db username = checkIsUser(request) user = Users.by_username(username, dbsession) userid = user.id try: log.debug('Query Upload profile information from database for user %s'%userid) query_uploadprofile = upload_profile_query%userid resultSet = dbsession.execute(query_uploadprofile) log.debug('Create response list') upload_profile = [] for record in resultSet: upload_profile.append({'upload_id':record['upload_id'], 'upload_mapid':record['upload_mapid'], 'time': record['time'], 'licence': record['licence'], 'title': record['title'], 'upload_time':record['upload_time'], 'imagepath':record['imagepath'], 'thumbnail': record['thumbnail']}) log.debug('Response: %s'%upload_profile) return {'upload_profile':upload_profile} except Exception as e: log.error('Error while trying to request upload history information'); log.error(e) return {} return {}
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body mapObj = parseMapObjForId(request_data, 'id', request.db) log.debug('Id is valide: %s' % request_data) log.debug( 'Check if there exists a registered georeference process for this messtischblatt ...' ) if Georeferenzierungsprozess.isGeoreferenced(mapObj.id, request.db) == False: response = { 'text': 'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.' } return response # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf( request_data['georeference']) georefProcess = registerUpdateGeoreferenceProcessInDb( mapObj, userid, str(encoded_clip_params), request.db) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len( request_data['georeference']['remove']['gcps']) * 5 response = { 'text': 'Georeference result updated. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': achievement_points, 'gcps': request_data['georeference']['new'], 'type': 'update' } return response else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError( 'The remove and new parameters are not valide.') except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def getWelcomePage(request): log.info('Call view get_welcome_page.') try: dbsession = request.db # get occurrence of georeferenced messtischblaetter occurrenceGeorefMtbs = int(getCountOfGeorefMesstischblaetter(dbsession)) possibleMtbs = int(getCountOfPublishedMesstischblaetter(dbsession)) georefRelation = int((float(occurrenceGeorefMtbs) / float(possibleMtbs)) * 100) # get paginator for user ranking list paginator = Users.get_paginator(request, dbsession) return {'paginator':paginator,'occurrence_mtbs':occurrenceGeorefMtbs, 'possible_mtbs': possibleMtbs, 'georef_rel': georefRelation} except Exception: log.debug('Error while creating paginator for user georeference ranking') log.debug(Exception) return {}
def registerNewGeoreferenceProcessInDb(objectid, userid, gcps, type, dbsession): log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georefProcess = Georeferenzierungsprozess(messtischblattid=objectid, nutzerid=userid, clipparameter=gcps, timestamp=timestamp, isvalide=True, type=type, refzoomify=True, publish=False, processed=False) dbsession.add(georefProcess) dbsession.flush() return georefProcess
def resetGeorefParameters(request): try: log.info('Receive a reset georeference parameter requests.') login = checkIsUser(request) dbsession = request.db messtischblatt_id = request.params['mtbid'] georeference_process = Georeferenzierungsprozess.by_messtischblattid( messtischblatt_id, dbsession) referenz = georeference_process.clipparameter fehlerbeschreibung = 'Zuruecksetzen von Georeferenzierungsparameter für GeorefId=%s' % georeference_process.id if login and messtischblatt_id and referenz and fehlerbeschreibung and Users.by_username( login, dbsession): log.debug('Save reset process in table fehlermeldungen ...') newFehlermeldung = Fehlermeldung( objektid=messtischblatt_id, referenz=referenz, nutzerid=login, fehlerbeschreibung=fehlerbeschreibung, timestamp=getTimestampAsPGStr()) dbsession.add(newFehlermeldung) log.debug('Remove georeference process ...') dbsession.delete(georeference_process) log.debug('Remove refmtblayer ...') try: refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt_id, dbsession) dbsession.delete(refmtblayer) except: log.debug('No entry for refmtblayer found ...') pass log.debug('Update messtischblatt db ...') messtischblatt = Messtischblatt.by_id(messtischblatt_id, dbsession) messtischblatt.isttransformiert = False return json.dumps({'status': 'confirmed'}, ensure_ascii=False, encoding='utf-8') except DBAPIError: log.error( 'Problems while trying to remove georeference parameter from the database ...' ) return Response(conn_err_msg, content_type='text/plain', status_int=500)
def createGeneralResponse(mapObj, request): log.debug('Create general response ...') isAlreadyGeorefProcess = Georeferenzierungsprozess.isGeoreferenced( mapObj.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess(mapObj, request) else: mtb_extent = Map.getExtent(mapObj.id, request.db) gcps = { 'source': 'pixel', 'target': 'EPSG:4314', 'gcps': [{ "source": [], "target": [mtb_extent[0], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[0], mtb_extent[3]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[3]] }] } # get zoomify and metadata information log.debug('Create response ...') metadata = Metadata.by_id(mapObj.id, request.db) return { 'type': 'new', 'objectid': mapObj.id, 'georeferenceid': "", 'timestamp': "", 'gcps': gcps, 'extent': mtb_extent, 'zoomify': metadata.imagezoomify, 'metadata': { 'dateiname': mapObj.apsdateiname, 'titel_long': metadata.title, 'titel_short': metadata.titleshort } }
def publishGeorefParameters(request): log.info('Request - Publish georeference result.') try: log.debug('Parse parameters ...') objectid = request.params['objectid'] georeferenceid = request.params['georeferenceid'] messtischblatt = Messtischblatt.by_id(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) log.debug('Udpate parameters') georeferenceprocess.publish = True messtischblatt.updated = False return json.dumps({'message':'The georeference process is now published. The georeference map will soon be updated and than ready for accessing.'}, ensure_ascii=False, encoding='utf-8') except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) return {}
def registerUpdateGeoreferenceProcessInDb(mapObj, userid, gcps, dbsession): log.debug('Create georeference process record ...') activeGeorefProcess = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId( mapObj.id, dbsession) georefProcess = Georeferenzierungsprozess( messtischblattid=mapObj.apsobjectid, nutzerid=userid, georefparams=ast.literal_eval(gcps), clipparameter=gcps, timestamp=getTimestampAsPGStr(), isactive=False, type='update', adminvalidation='', processed=False, mapid=mapObj.id, overwrites=activeGeorefProcess.id) dbsession.add(georefProcess) dbsession.flush() return georefProcess
def georeferenceGetProcess(request): log.info('Receive request GetGeoreferenceProcess') try: request_data = None if request.method == 'POST': request_data = request.json_body if 'georeferenceid' in request_data: georeferenceid = int(request_data['georeferenceid']) log.debug('Parsed parameters - georeferenceid: %s' % georeferenceid) mapObj = Map.by_id( int( Georeferenzierungsprozess.by_id(georeferenceid, request.db).mapid), request.db) response = createResponseForSpecificGeoreferenceProcess( mapObj, request, georeferenceid) elif 'objectid' in request_data: mapObjId = request_data['objectid'] log.debug('Parsed parameters - mapid: %s' % mapObjId) mapObj = Map.by_id(int(mapObjId), request.db) response = createGeneralResponse(mapObj, request) else: log.error( 'Could not find a georeferenceid or and objectid in the post request parameters ...' ) raise GeoreferenceParameterError return response except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except ProcessIsInvalideException as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest( 'This georeference process is blocked for further work!') except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def createGeneralResponse(objectid, request): log.debug('Create general response ...') lastGeoreferenceId = '' lastTimestamp = '' messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_getLatestValidGeorefProcessForObjectId(messtischblatt.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess(objectid, isAlreadyGeorefProcess.id, request) else: gcps = { 'source':'pixel', 'target':'EPSG:4314', 'gcps': [ {"source":[], "target":[mtb_extent[0],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[0],mtb_extent[3]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[3]]} ] } # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type':'new', 'objectid': messtischblatt.id, 'georeferenceid':lastGeoreferenceId, 'timestamp':str(lastTimestamp), 'gcps':gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def logContactRequest(request): try: log.info('Receive a contact message request.') # check if there is a userid from a registered user userid = checkIsUser(request) if not userid: userid = 'anonym' if 'reference' in request.params: reference = request.params['reference'] if 'message' in request.params: message = request.params['message'] if 'email' in request.params: email = request.params['email'] # check if the input parameters are valide log.debug('Validate the query parameters ...') if not email or not reference or not message: raise MissingQueryParameterError('Missing query parameter ...') if len(message) <= 5: raise WrongParameterException('Message is to short. For a correct understanding of your matter please leave us a short explanation.') # log into database log.debug('Save contact message in the database ...') fehlermeldung = Fehlermeldung(email = email, referenz = reference, nutzerid = userid, fehlerbeschreibung = message, timestamp = getTimestampAsPGStr()) request.db.add(fehlermeldung) # sending an email log.debug('Instruct admin about new contact message ...'); reportErrorMessageToAdmin(fehlermeldung, 'Request - Contact form', userid) log.debug('Create response message ...') return {'status':'confirmed'} except MissingQueryParameterError: log.error('Could not create correct error report because of missing query parameters.') log.error(traceback.format_exc()) raise HTTPBadRequest('Missing form parameters') except WrongParameterException as e: log.error(e.msg) log.error(traceback.format_exc()) raise HTTPBadRequest('Wrong form parameters') except DBAPIError: log.error('Problems while trying to register report error in database') log.error(traceback.format_exc()) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE) except Exception: log.error('Unknown error while trying to process a contact message request ...') log.error(traceback.format_exc()) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE)
def report_error(request): try: log.debug('Report error is called') dbsession = request.db # parse parameter login = checkIsUser(request) objektid = request.params['id'] referenz = request.params['reference'] fehlerbeschreibung = request.params['message'] if login and objektid and referenz and fehlerbeschreibung: # check if valide user if Users.by_username(login, dbsession): newFehlermeldung = Fehlermeldung(objektid = objektid, referenz = referenz, nutzerid = login, fehlerbeschreibung = fehlerbeschreibung, timestamp = getTimestampAsPGStr()) dbsession.add(newFehlermeldung) log.debug('Report error is registered in database') return json.dumps({'status':'confirmed'}, ensure_ascii=False, encoding='utf-8') except DBAPIError: log.error('Problems while trying to register report error in database') return Response(conn_err_msg, content_type='text/plain', status_int=500)
def chooseGeoreferenceMap(request): log.info('Call view getPage_chooseGeorefMtb.') if 'blattnr' in request.params: log.debug('Look for unreferenced messtischblaetter') # get response from database collection = [] metadata = Metadata.all_byBlattnr(request.GET.get('blattnr'), request.db) for record in metadata: map = Map.by_id(record.mapid, request.db) if map.istaktiv and not map.isttransformiert and map.hasgeorefparams == 0: item = {'mapid':map.id,'title':record.title} collection.append(item) log.debug('Create paginator for collection - %s'%collection) page_url = PageURL_WebOb(request) return {'paginator': Page(collection, 1, url=page_url, items_per_page=10)} else: log.error('Could not find a blattnr parameter value ...') log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG)
def georeference_profile_page(request): log.info('Request - Get georeference profile page.') dbsession = request.db userid = checkIsUser(request) user = Users.by_username(userid, dbsession) try: log.debug('Query georeference profile information from database for user %s'%userid) query_georefprocess = georeference_profile_query%userid resultSet = dbsession.execute(query_georefprocess) log.debug('Create response list') georef_profile = [] for record in resultSet: georef_profile.append({'georef_id':record['georef_id'], 'mtb_id':record['mtbid'], 'clip_params': record['clip_params'], 'time': record['time'], 'transformed': record['isttransformiert'], 'isvalide': record['isvalide'], 'titel': record['titel'], 'key': record['key'], 'time_georef':record['time_georef'],'boundingbox':record['box'][4:-1].replace(' ',','),'type':record['type'], 'published':record['published']}) log.debug('Response: %s'%georef_profile) return {'georef_profile':georef_profile, 'points':user.bonuspunkte} except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) return {}
def georeference_profile_page(request): log.info('Request - Get georeference profile page.') dbsession = request.db userid = checkIsUser(request) user = Users.by_username(userid, dbsession) try: log.debug('Query georeference profile information from database for user %s'%userid) queryData = request.db.query(Georeferenzierungsprozess, Metadata, Map).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .join(Map, Georeferenzierungsprozess.mapid == Map.id)\ .filter(Georeferenzierungsprozess.nutzerid == userid)\ .order_by(desc(Georeferenzierungsprozess.id)) log.debug('Create response list') georef_profile = [] for record in queryData: georef = record[0] metadata = record[1] mapObj = record[2] boundingbox = Map.getBox2d(georef.mapid, dbsession, 900913) georef_profile.append({'georef_id':georef.id, 'mapid':georef.mapid, 'clip_params': georef.georefparams, 'time': metadata.timepublish, 'transformed': georef.processed, 'isvalide': georef.adminvalidation, 'titel': metadata.title, 'key': mapObj.apsdateiname, 'time_georef':georef.timestamp,'boundingbox':boundingbox[4:-1].replace(' ',','),'type':georef.type, 'published':georef.processed}) log.debug('Response: %s'%georef_profile) return {'georef_profile':georef_profile, 'points':user.bonuspunkte} except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE)
def getAdminEvaluationPage(request): log.info('Request - Get georeference profile page.') try: resultSet = request.db.execute(georeference_evaluation_query) log.debug('Create response list') georef_profile = [] for record in resultSet: encoded_clip_params = str(convertUnicodeDictToUtf(ast.literal_eval(record['clip_params']))).replace('\'','"') georef_profile.append({'georef_id':record['georef_id'], 'mtb_id':record['mtbid'], 'clip_params': encoded_clip_params, 'time': record['time'], 'transformed': record['isttransformiert'], 'isvalide': record['isvalide'], 'titel': record['titel'], 'key': record['key'], 'time_georef':record['time_georef'],'type':record['type'], 'userid': record['userid'], 'published':record['published']}) log.debug('Response: %s'%georef_profile) return {'georef_profile':georef_profile} except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) return {}
def createResponseForSpecificGeoreferenceProcess(objectid, georeferenceid, request): log.debug('Create response for specific georeference process ...') messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id( georeferenceid, request.db) pure_clipparameters = ast.literal_eval( str(georeferenceprocess.clipparameter)) gcps = None if 'new' in pure_clipparameters: # in case of an update process gcps = pure_clipparameters['new'] else: # in case of a new registered clip_parameter gcps = pure_clipparameters # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type': 'update', 'objectid': messtischblatt.id, 'georeferenceid': georeferenceid, 'timestamp': str(georeferenceprocess.timestamp), 'gcps': gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def getPermalinkForObjectid(request): """ Contains a permalink url for the given objectid""" try: log.debug('Receive get permalink request.') objectid = request.GET.get('objectid') # right now we need a bridge hear for moving from old number schema to new one parsed_id = parseOAI(objectid) # create the permalink permalink = createPermalink(request, parsed_id) return {'url':permalink} except ParsingException as e: log.debug(e) return HTTPBadRequest(GENERAL_ERROR_MESSAGE) except NotFoundException as e: log.error(e) log.error(traceback.format_exc()) raise HTTPNotFound(GENERAL_ERROR_MESSAGE) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(GENERAL_ERROR_MESSAGE)
def getPermalinkForObjectid(request): """ Contains a permalink url for the given objectid""" try: log.debug('Receive get permalink request.') objectid = request.GET.get('objectid') # right now we need a bridge hear for moving from old number schema to new one parsed_id = parseOAI(objectid) # create the permalink permalink = createPermalink(request, parsed_id) return {'url': permalink} except ParsingException as e: log.debug(e) return HTTPBadRequest(GENERAL_ERROR_MESSAGE) except NotFoundException as e: log.error(e) log.error(traceback.format_exc()) raise HTTPNotFound(GENERAL_ERROR_MESSAGE) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(GENERAL_ERROR_MESSAGE)
def getWelcomePage(request): log.info('Call view get_welcome_page.') try: dbsession = request.db # get occurrence of georeferenced messtischblaetter occurrenceGeorefMtbs = int( getCountOfGeorefMesstischblaetter(dbsession)) possibleMtbs = int(getCountOfPublishedMesstischblaetter(dbsession)) georefRelation = int( (float(occurrenceGeorefMtbs) / float(possibleMtbs)) * 100) # get paginator for user ranking list paginator = Users.get_paginator(request, dbsession) return { 'paginator': paginator, 'occurrence_mtbs': occurrenceGeorefMtbs, 'possible_mtbs': possibleMtbs, 'georef_rel': georefRelation } except Exception: log.debug( 'Error while creating paginator for user georeference ranking') log.debug(Exception) return {}
def logContactRequest(request): try: log.info('Receive a contact message request.') # check if there is a userid from a registered user userid = checkIsUser(request) if not userid: userid = 'anonym' if 'reference' in request.params: reference = request.params['reference'] if 'message' in request.params: message = request.params['message'] if 'email' in request.params: email = request.params['email'] # check if the input parameters are valide log.debug('Validate the query parameters ...') if not email or not reference or not message: raise MissingQueryParameterError('Missing query parameter ...') if len(message) <= 5: raise WrongParameterException('Message is to short. For a correct understanding of your matter please leave us a short explanation.') # log into database log.debug('Save contact message in the database ...') fehlermeldung = Fehlermeldung(email = email, referenz = reference, nutzerid = userid, fehlerbeschreibung = message, timestamp = getTimestampAsPGStr()) request.db.add(fehlermeldung) # sending an email log.debug('Instruct admin about new contact message ...'); reportErrorMessageToAdmin(fehlermeldung, 'Request - Contact form', userid) log.debug('Create response message ...') return json.dumps({'status':'confirmed'}, ensure_ascii=False, encoding='utf-8') except MissingQueryParameterError: log.error('Could not create correct error report because of missing query parameters.') return Response(json.dumps({'error_message':'Missing form parameters','error_name':'MissingParameterException'}), content_type='application/json', status_int=500) except WrongParameterException as e: log.error(e.msg) return Response(json.dumps({'error_message':e.msg,'error_name':'WrongParameterException'}), content_type='application/json', status_int=500) except DBAPIError: log.error('Problems while trying to register report error in database') return Response(GENERAL_ERROR_MESSAGE, content_type='text/plain', status_int=500) except Exception: log.error('Unknown error while trying to process a contact message request ...') return Response(GENERAL_ERROR_MESSAGE, content_type='text/plain', status_int=500)
def georeference_profile_page(request): log.info('Request - Get georeference profile page.') dbsession = request.db userid = checkIsUser(request) user = Users.by_username(userid, dbsession) try: log.debug( 'Query georeference profile information from database for user %s' % userid) queryData = request.db.query(Georeferenzierungsprozess, Metadata, Map).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .join(Map, Georeferenzierungsprozess.mapid == Map.id)\ .filter(Georeferenzierungsprozess.nutzerid == userid)\ .order_by(desc(Georeferenzierungsprozess.id)) log.debug('Create response list') georef_profile = [] for record in queryData: georef = record[0] metadata = record[1] mapObj = record[2] boundingbox = Map.getBox2d(georef.mapid, dbsession, 900913) georef_profile.append({ 'georef_id': georef.id, 'mapid': georef.mapid, 'clip_params': georef.georefparams, 'time': metadata.timepublish, 'transformed': georef.processed, 'isvalide': georef.adminvalidation, 'titel': metadata.title, 'key': mapObj.apsdateiname, 'time_georef': georef.timestamp, 'boundingbox': boundingbox[4:-1].replace(' ', ','), 'type': georef.type, 'published': georef.processed }) log.debug('Response: %s' % georef_profile) return {'georef_profile': georef_profile, 'points': user.bonuspunkte} except Exception as e: log.error( 'Error while trying to request georeference history information') log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE)
def chooseGeoreferenceMap(request): log.info('Call view getPage_chooseGeorefMtb.') if 'blattnr' in request.params: log.debug('Look for unreferenced messtischblaetter') # get response from database collection = [] metadata = Metadata.all_byBlattnr(request.GET.get('blattnr'), request.db) for record in metadata: map = Map.by_id(record.mapid, request.db) if map.istaktiv and not map.isttransformiert and map.hasgeorefparams == 0: item = {'mapid': map.id, 'title': record.title} collection.append(item) log.debug('Create paginator for collection - %s' % collection) page_url = PageURL_WebOb(request) return { 'paginator': Page(collection, 1, url=page_url, items_per_page=10) } else: log.error('Could not find a blattnr parameter value ...') log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG)
def createGeneralResponse(mapObj, request): log.debug('Create general response ...') isAlreadyGeorefProcess = Georeferenzierungsprozess.isGeoreferenced(mapObj.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess(mapObj, request) else: mtb_extent = Map.getExtent(mapObj.id, request.db) gcps = { 'source':'pixel', 'target':'EPSG:4314', 'gcps': [ {"source":[], "target":[mtb_extent[0],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[0],mtb_extent[3]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[3]]} ] } # get zoomify and metadata information log.debug('Create response ...') metadata = Metadata.by_id(mapObj.id, request.db) return { 'type':'new', 'objectid': mapObj.id, 'georeferenceid':"", 'timestamp':"", 'gcps':gcps, 'extent': mtb_extent, 'zoomify': metadata.imagezoomify, 'metadata': { 'dateiname': mapObj.apsdateiname, 'titel_long': metadata.title, 'titel_short': metadata.titleshort } }
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body mapObj = parseMapObjForId(request_data, 'id', request.db) log.debug('Id is valide: %s'%request_data) log.debug('Check if there exists a registered georeference process for this messtischblatt ...') if Georeferenzierungsprozess.isGeoreferenced(mapObj.id, request.db) == False: response = {'text':'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.'} return response # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf(request_data['georeference']) georefProcess = registerUpdateGeoreferenceProcessInDb(mapObj, userid, str(encoded_clip_params), request.db) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len(request_data['georeference']['remove']['gcps'])*5 response = {'text':'Georeference result updated. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':achievement_points, 'gcps':request_data['georeference']['new'] ,'type':'update'} return response else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError('The remove and new parameters are not valide.') except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def georeference_profile_page(request): log.info('Request - Get georeference profile page.') dbsession = request.db userid = checkIsUser(request) user = Users.by_username(userid, dbsession) try: log.debug( 'Query georeference profile information from database for user %s' % userid) query_georefprocess = georeference_profile_query % userid resultSet = dbsession.execute(query_georefprocess) log.debug('Create response list') georef_profile = [] for record in resultSet: georef_profile.append({ 'georef_id': record['georef_id'], 'mtb_id': record['mtbid'], 'clip_params': record['clip_params'], 'time': record['time'], 'transformed': record['isttransformiert'], 'isvalide': record['isvalide'], 'titel': record['titel'], 'key': record['key'], 'time_georef': record['time_georef'], 'boundingbox': record['box'][4:-1].replace(' ', ','), 'type': record['type'], 'published': record['published'] }) log.debug('Response: %s' % georef_profile) return {'georef_profile': georef_profile, 'points': user.bonuspunkte} except Exception as e: log.error( 'Error while trying to request georeference history information') log.error(e) return {}
def getProcesses(request): try: log.info('Request - Get georeference processes.') if 'mapid' in request.params: log.debug('Get processes for mapid %s ...'%request.params['mapid']) queryData = request.db.query(Georeferenzierungsprozess, Metadata).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .filter(Georeferenzierungsprozess.mapid == request.params['mapid'])\ .order_by(desc(Georeferenzierungsprozess.id)) elif 'userid' in request.params: log.debug('Get processes for userid %s ...'%request.params['userid']) queryData = request.db.query(Georeferenzierungsprozess, Metadata).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .filter(Georeferenzierungsprozess.nutzerid == request.params['userid'])\ .order_by(desc(Georeferenzierungsprozess.id)) elif 'validation' in request.params: log.debug('Get processes for adminvalidation %s ...'%request.params['validation']) queryData = request.db.query(Georeferenzierungsprozess, Metadata).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .filter(Georeferenzierungsprozess.adminvalidation == request.params['validation'])\ .order_by(desc(Georeferenzierungsprozess.id)) else: log.debug('Get all pending processes ...') queryData = request.db.query(Georeferenzierungsprozess, Metadata).join(Metadata, Georeferenzierungsprozess.mapid == Metadata.mapid)\ .filter(or_(Georeferenzierungsprozess.adminvalidation == '', Georeferenzierungsprozess.adminvalidation == None))\ .order_by(desc(Georeferenzierungsprozess.id)) response = [] for record in queryData: georef = record[0] metadata = record[1] # use encoded_georefParams for visualisation as string on the client side encoded_georefParams = str(convertUnicodeDictToUtf(georef.georefparams)).replace('\'','"') response.append({'georef_id':georef.id, 'mapid':georef.mapid, 'georef_params': encoded_georefParams, 'time': str(metadata.timepublish), 'processed': georef.processed, 'adminvalidation': georef.adminvalidation, 'title': metadata.title, 'apsobjectid': georef.messtischblattid, 'georef_time':str(georef.timestamp),'type':georef.type, 'userid': georef.nutzerid, 'georef_isactive':georef.isactive}) return response except Exception as e: log.error(e) log.error(traceback.format_exc()) return HTTPInternalServerError(GENERAL_ERROR_MESSAGE);
def getUploadProfilePage(request): log.debug('Request - Get Upload profile page.') dbsession = request.db username = checkIsUser(request) user = Users.by_username(username, dbsession) userid = user.id try: log.debug( 'Query Upload profile information from database for user %s' % userid) query_uploadprofile = upload_profile_query % userid resultSet = dbsession.execute(query_uploadprofile) log.debug('Create response list') upload_profile = [] for record in resultSet: upload_profile.append({ 'upload_id': record['upload_id'], 'upload_mapid': record['upload_mapid'], 'time': record['time'], 'licence': record['licence'], 'title': record['title'], 'upload_time': record['upload_time'], 'imagepath': record['imagepath'], 'thumbnail': record['thumbnail'] }) log.debug('Response: %s' % upload_profile) return {'upload_profile': upload_profile} except Exception as e: log.error('Error while trying to request upload history information') log.error(e) return {} return {}
def set_visitor_cookie(request): log.info('Call view set_visitor_cookie with params: %s.'%request.params) # parse query parameter setCookie = '' if 'welcomepage' in request.GET: setCookie = request.GET['welcomepage'] # create response if setCookie == 'off': log.debug('Set deactivate welcome page cookie.') response = Response() response.set_cookie('welcomepage', setCookie, max_age=31536000) # max_age = year return response elif setCookie == 'on' and getCookie(request, 'welcomepage') == 'off': log.debug('Set activate welcome page cookie.') response = Response() response.set_cookie('welcomepage', setCookie, max_age=31536000) return response else: log.debug('Value of query parameter \'welcomepage\' is not supported') response = Response() raise HTTPBadRequest(headers = response.headers)
def set_visitor_cookie(request): log.info('Call view set_visitor_cookie with params: %s.' % request.params) # parse query parameter setCookie = '' if 'welcomepage' in request.GET: setCookie = request.GET['welcomepage'] # create response if setCookie == 'off': log.debug('Set deactivate welcome page cookie.') response = Response() response.set_cookie('welcomepage', setCookie, max_age=31536000) # max_age = year return response elif setCookie == 'on' and getCookie(request, 'welcomepage') == 'off': log.debug('Set activate welcome page cookie.') response = Response() response.set_cookie('welcomepage', setCookie, max_age=31536000) return response else: log.debug('Value of query parameter \'welcomepage\' is not supported') response = Response() return HTTPBadRequest(headers=response.headers)
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) user = Users.by_username(userid, request.db) request_data = None if request.method == 'POST': request_data = request.json_body if request_data: validateId(request_data['id']) log.debug('Request data is valide: %s'%request_data) log.debug('Check if there is already a registered georeference process for this messtischblatt ...') messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid(messtischblatt.id, request.db) if isAlreadyGeorefProcess is not None: response = {'text':'There is already a registered georeference process for this messtischblatt. Please move forward to the update process.','georeferenceid':isAlreadyGeorefProcess.id} return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int(str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str(convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess(messtischblattid = messtischblatt.id, nutzerid = userid, clipparameter = georeference_parameter, timestamp = timestamp, isvalide = True, type = 'new', refzoomify = True, publish = False, processed = False) request.db.add(georefProcess) request.db.flush() log.debug('Creating passpoints ...') # gcps = request_data['georeference']['gcps'] # passpoints = [] # for i in range(0,len(gcps)): # unrefPoint = [gcps[i]['source'][0],gcps[i]['source'][1]] # refPoint = 'POINT(%s %s)'%(gcps[i]['target'][0], gcps[i]['target'][1]) # passpoint = Passpoint(objectid = messtischblatt.id, userid = user.id, unrefpoint = unrefPoint, # refpoint = refPoint, deprecated = False, timestamp = timestamp, georeferenceprocessid = georefProcess.id) # request.db.add(passpoint) # passpoints.append(passpoints) log.debug('Create response ...') ##gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = {'text':'Georeference result saved. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':20, 'gcps':request_data['georeference'] ,'type':'confirm'} return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: raise GeoreferenceParameterError('Wrong or missing service parameter') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s'%e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while computing validation result - %s'%e log.error(message) return HTTPInternalServerError(message)
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body if request_data: validateId(request_data['id']) log.debug('Request data is valide: %s' % request_data) log.debug( 'Check if there exists a registered georeference process for this messtischblatt ...' ) messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid( messtischblatt.id, request.db) if isAlreadyGeorefProcess is None: response = { 'text': 'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.' } return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf( request_data['georeference']) georefProcess = registerNewGeoreferenceProcessInDb( messtischblatt.id, userid, str(encoded_clip_params), 'update', request.db) log.debug('Set update status for messtischblatt ...') messtischblatt.setIsUpdated(True) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len( request_data['georeference']['remove']['gcps']) * 5 #gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = { 'text': 'Georeference result updated. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': achievement_points, 'gcps': request_data['georeference']['new'], 'type': 'update' } return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError( 'The remove and new parameters are not valide.') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s' % e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while computing validation result - %s' % e log.error(message) return HTTPInternalServerError(message)
def georeferenceValidation(request): log.info('Receive request for processing georeference validation result') try: request_data = None if request.method == 'POST': request_data = request.json_body mapObj = parseMapObjForId(request_data, 'id', request.db) log.debug('Id is valide: %s'%request_data) log.debug('Start creating validation result ...') # actual only support this option if target srs is EPSG:4314 epsg_code = int(str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314: log.debug('Parse gcps ...') gcps = parseGcps(request_data['georeference']['gcps']) log.debug('Process georeference parameter ...') destPath = georeference(mapObj.originalimage, os.path.join(GEOREFERENCE_MAPFILE_FOLDER,mapObj.apsdateiname+"::"+str(getUniqueId())+".vrt"), GEOREFERENCE_TMP_DIR, gcps, epsg_code, epsg_code, 'polynom', log) log.debug('Create temporary mapfile ...') wms_url = createMapfile(mapObj.apsdateiname, destPath, GEOREFERENCE_MAPFILE_TEMPLATE, GEOREFERENCE_MAPFILE_FOLDER, GEOREFERENCE_MAPFILE_DEFAULT_PARAMS) log.debug('Create response ...') response = {'wms_url':wms_url,'layer_id':mapObj.apsdateiname,'extent':Map.getExtent(mapObj.id, request.db)} return response else: raise GeoreferenceParameterError('Wrong or missing service parameter') except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) user = Users.by_username(userid, request.db) request_data = None if request.method == 'POST': request_data = request.json_body if request_data: validateId(request_data['id']) log.debug('Request data is valide: %s' % request_data) log.debug( 'Check if there is already a registered georeference process for this messtischblatt ...' ) messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid( messtischblatt.id, request.db) if isAlreadyGeorefProcess is not None: response = { 'text': 'There is already a registered georeference process for this messtischblatt. Please move forward to the update process.', 'georeferenceid': isAlreadyGeorefProcess.id } return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int( str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference'][ 'source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str( convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess( messtischblattid=messtischblatt.id, nutzerid=userid, clipparameter=georeference_parameter, timestamp=timestamp, isvalide=True, type='new', refzoomify=True, publish=False, processed=False) request.db.add(georefProcess) request.db.flush() log.debug('Creating passpoints ...') # gcps = request_data['georeference']['gcps'] # passpoints = [] # for i in range(0,len(gcps)): # unrefPoint = [gcps[i]['source'][0],gcps[i]['source'][1]] # refPoint = 'POINT(%s %s)'%(gcps[i]['target'][0], gcps[i]['target'][1]) # passpoint = Passpoint(objectid = messtischblatt.id, userid = user.id, unrefpoint = unrefPoint, # refpoint = refPoint, deprecated = False, timestamp = timestamp, georeferenceprocessid = georefProcess.id) # request.db.add(passpoint) # passpoints.append(passpoints) log.debug('Create response ...') ##gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = { 'text': 'Georeference result saved. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': 20, 'gcps': request_data['georeference'], 'type': 'confirm' } return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: raise GeoreferenceParameterError( 'Wrong or missing service parameter') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s' % e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while computing validation result - %s' % e log.error(message) return HTTPInternalServerError(message)
def __parseUserId__(self): self.userid = checkIsUser(self.request) if not self.userid: raise GeoreferenceParameterError("Missing userid!") else: log.debug("Userid - %s" % self.userid)
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body mapObj = parseMapObjForId(request_data, 'id', request.db) log.debug('Id is valide: %s'%request_data) log.debug('Check if there is already a registered georeference process for this messtischblatt ...') if Georeferenzierungsprozess.isGeoreferenced(mapObj.id, request.db): msg = 'There is already a georeference process for this process. Please load again and start on the latest changes.' log.debug(msg) georeferenceid = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId(mapObj.id, request.db).id response = {'text':msg,'georeferenceid':georeferenceid} return response # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int(str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str(convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess(messtischblattid = mapObj.apsobjectid, nutzerid = userid, georefparams = ast.literal_eval(georeference_parameter), clipparameter = georeference_parameter, timestamp = timestamp, isactive = True, type = 'new', adminvalidation = '', processed = False, mapid = mapObj.id, overwrites = 0) request.db.add(georefProcess) request.db.flush() log.debug('Create response ...') response = {'text':'Georeference result saved. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':20, 'gcps':request_data['georeference'] ,'type':'confirm'} return response else: raise GeoreferenceParameterError('Wrong or missing service parameter') except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)
def store_image(request): try: log.debug('Receive a upload request.') username = checkIsUser(request) user = Users.by_username(username, request.db) # check if need metadata is send log.debug('Check if mandatory metadata is send ...') params = request.params if not 'title' in params or not 'titleshort' in params or \ not 'imagelicence' in params or not 'imageowner' in params: raise MissingQueryParameterError('Missing query parameter ...') # register upload process in database log.debug('Register upload process to database ...') uploadObj = Uploads(userid=user.id, time=getTimestampAsPGStr(), params='%s' % request.params) request.db.add(uploadObj) log.debug('Create and add mapObj ...') mapObj = Map(istaktiv=False, isttransformiert=False, maptype='A', hasgeorefparams=0) request.db.add(mapObj) request.db.flush() # check if image allowed extensions # ``filename`` contains the name of the file in string format. log.debug('Create filename for persistent saving ...') filename = request.POST['file'].filename if not allowed_file(filename): raise WrongParameterException( 'Format of the image is not supported through the upload API.') # ``input_file`` contains the actual file data which needs to be # stored somewhere. inputFile = request.POST['file'].file # Note that we are generating our own filename instead of trusting # the incoming filename since that might result in insecure paths. # Please note that in a real application you would not use /tmp, # and if you write to an untrusted location you will need to do # some extra work to prevent symlink attacks. newFilename = '%s.%s' % ('df_dk_%s' % mapObj.id, filename.rsplit( '.', 1)[1]) filePath = os.path.join(UPLOAD_DIR, newFilename) # save file to disk log.debug('Save file to datastore ...') saveFile(inputFile, filePath) # process thumbnails log.debug('Create thumbnails ...') thumbSmall = createSmallThumbnail(filePath, UPLOAD_THUMBS_SMALL_DIR) thumbMid = createMidThumbnail(filePath, UPLOAD_THUMBS_MID_DIR) log.debug('Create zoomify tiles') zoomifyTiles = processZoomifyTiles(filePath, UPLOAD_ZOOMIFY_DIR, log) # parse boundinbBox pgBoundingBoxStr = parseBoundingBoxFromRequest(request.params) # add geometry to map object and update other attributes # work around --> should be replaced through adding the geomtry on initial adding log.debug('Update mapObj and create metadataObj ...') mapObj.apsdateiname = newFilename mapObj.originalimage = filePath Map.updateGeometry(mapObj.id, pgBoundingBoxStr, request.db) request.db.flush() # parse and create metadataObj if 'title' in request.params: title = request.params['title'] if 'titleshort' in request.params: titleshort = request.params['titleshort'] if 'serientitle' in request.params: serientitle = request.params['serientitle'] if 'description' in request.params: description = request.params['description'] if 'timepublish' in request.params: timepublish = request.params['timepublish'] if 'imagelicence' in request.params: imagelicence = request.params['imagelicence'] if 'scale' in request.params: scale = request.params['scale'] if 'imageowner' in request.params: imageowner = request.params['imageowner'] # create metadata obj # the creating of the paths are right now quite verbose imagezoomify = UPLOAD_SERVICE_URL_ZOOMIFY + os.path.basename( filePath).split('.')[0] + '/ImageProperties.xml' thumbssmall = UPLOAD_SERVICE_URL_THUMBS_SMALL + os.path.basename( thumbSmall) thumbsmid = UPLOAD_SERVICE_URL_THUMBS_MID + os.path.basename(thumbMid) metadataObj = Metadata(mapid=mapObj.id, title=title, titleshort=titleshort, serientitle=serientitle, description=description, timepublish="%s-01-01 00:00:00" % (timepublish), imagelicence=imagelicence, imageowner=imageowner, scale=scale, imagezoomify=imagezoomify, thumbssmall=thumbssmall, thumbsmid=thumbsmid) request.db.add(metadataObj) # update uploadObj and create response uploadObj.mapid = mapObj.id log.debug('Create response ...') target_url = request.route_url('upload-profile') return HTTPFound(location=target_url) # Exception handling except NotFoundException as e: log.exception(e) ERR_MSG = GENERAL_ERROR_MESSAGE + "We're sorry, but something went wrong. Please be sure that your file respects the upload conditions." return HTTPBadRequest(ERR_MSG) except DBAPIError as e: log.error('Database error within a upload process') log.exception(e) return HTTPInternalServerError(GENERAL_ERROR_MESSAGE) except MissingQueryParameterError or WrongParameterException as e: log.exception(e) raise HTTPBadRequest(GENERAL_ERROR_MESSAGE) except Exception as e: log.exception(e) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE)
def store_image(request): try: log.debug('Receive a upload request.') username = checkIsUser(request) user = Users.by_username(username, request.db) # check if need metadata is send log.debug('Check if mandatory metadata is send ...') params = request.params if not 'title' in params or not 'titleshort' in params or \ not 'imagelicence' in params or not 'imageowner' in params: raise MissingQueryParameterError('Missing query parameter ...') # register upload process in database log.debug('Register upload process to database ...') uploadObj = Uploads(userid = user.id, time = getTimestampAsPGStr(), params = '%s'%request.params) request.db.add(uploadObj) log.debug('Create and add mapObj ...') mapObj = Map(istaktiv = False, isttransformiert = False, maptype = 'A', hasgeorefparams = 0) request.db.add(mapObj) request.db.flush() # check if image allowed extensions # ``filename`` contains the name of the file in string format. log.debug('Create filename for persistent saving ...') filename = request.POST['file'].filename if not allowed_file(filename): raise WrongParameterException('Format of the image is not supported through the upload API.') # ``input_file`` contains the actual file data which needs to be # stored somewhere. inputFile = request.POST['file'].file # Note that we are generating our own filename instead of trusting # the incoming filename since that might result in insecure paths. # Please note that in a real application you would not use /tmp, # and if you write to an untrusted location you will need to do # some extra work to prevent symlink attacks. newFilename = '%s.%s' % ('df_dk_%s'%mapObj.id, filename.rsplit('.', 1)[1]) filePath = os.path.join(UPLOAD_DIR, newFilename) # save file to disk log.debug('Save file to datastore ...') saveFile(inputFile, filePath) # process thumbnails log.debug('Create thumbnails ...') thumbSmall = createSmallThumbnail(filePath, UPLOAD_THUMBS_SMALL_DIR) thumbMid = createMidThumbnail(filePath, UPLOAD_THUMBS_MID_DIR) log.debug('Create zoomify tiles') zoomifyTiles = processZoomifyTiles(filePath, UPLOAD_ZOOMIFY_DIR, log) # parse boundinbBox pgBoundingBoxStr = parseBoundingBoxFromRequest(request.params) # add geometry to map object and update other attributes # work around --> should be replaced through adding the geomtry on initial adding log.debug('Update mapObj and create metadataObj ...') mapObj.apsdateiname = newFilename mapObj.originalimage = filePath Map.updateGeometry(mapObj.id, pgBoundingBoxStr, request.db) request.db.flush() # parse and create metadataObj if 'title' in request.params: title = request.params['title'] if 'titleshort' in request.params: titleshort = request.params['titleshort'] if 'serientitle' in request.params: serientitle = request.params['serientitle'] if 'description' in request.params: description = request.params['description'] if 'timepublish' in request.params: timepublish = request.params['timepublish'] if 'imagelicence' in request.params: imagelicence = request.params['imagelicence'] if 'scale' in request.params: scale = request.params['scale'] if 'imageowner' in request.params: imageowner = request.params['imageowner'] # create metadata obj # the creating of the paths are right now quite verbose imagezoomify = UPLOAD_SERVICE_URL_ZOOMIFY + os.path.basename(filePath).split('.')[0] + '/ImageProperties.xml' thumbssmall = UPLOAD_SERVICE_URL_THUMBS_SMALL + os.path.basename(thumbSmall) thumbsmid = UPLOAD_SERVICE_URL_THUMBS_MID + os.path.basename(thumbMid) metadataObj = Metadata(mapid = mapObj.id, title = title, titleshort = titleshort, serientitle = serientitle, description = description, timepublish = "%s-01-01 00:00:00"%(timepublish), imagelicence = imagelicence, imageowner = imageowner, scale = scale, imagezoomify = imagezoomify, thumbssmall = thumbssmall, thumbsmid = thumbsmid) request.db.add(metadataObj) # update uploadObj and create response uploadObj.mapid = mapObj.id log.debug('Create response ...') target_url = request.route_url('upload-profile') return HTTPFound(location = target_url) # Exception handling except NotFoundException as e: log.exception(e) ERR_MSG = GENERAL_ERROR_MESSAGE + "We're sorry, but something went wrong. Please be sure that your file respects the upload conditions." return HTTPBadRequest(ERR_MSG) except DBAPIError as e: log.error('Database error within a upload process') log.exception(e) return HTTPInternalServerError(GENERAL_ERROR_MESSAGE) except MissingQueryParameterError or WrongParameterException as e: log.exception(e) raise HTTPBadRequest(GENERAL_ERROR_MESSAGE) except Exception as e: log.exception(e) raise HTTPInternalServerError(GENERAL_ERROR_MESSAGE)
def georeferenceValidation(request): log.info('Receive request for processing georeference validation result') try: request_data = None if request.method == 'POST': request_data = request.json_body if request_data: validateId(request_data['id']) log.debug('Request data is valide: %s'%request_data) log.debug('Start creating validation result ...') messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) # actual only support this option if target srs is EPSG:4314 epsg_code = int(str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314: log.debug('Parse gcps ...') gcps = parseGcps(request_data['georeference']['gcps']) log.debug('Process georeference parameter ...') destPath = georeference(messtischblatt.original_path, os.path.join(GEOREFERENCE_MAPFILE_FOLDER,messtischblatt.dateiname+"::"+str(getUniqueId())+".vrt"), GEOREFERENCE_TMP_DIR, gcps, epsg_code, epsg_code, 'polynom', log) log.debug('Create temporary mapfile ...') wms_url = createMapfile(messtischblatt.dateiname, destPath, GEOREFERENCE_MAPFILE_TEMPLATE, GEOREFERENCE_MAPFILE_FOLDER, GEOREFERENCE_MAPFILE_DEFAULT_PARAMS) log.debug('Create response ...') response = {'wms_url':wms_url,'layer_id':messtischblatt.dateiname,'extent':Messtischblatt.getExtent(messtischblatt.id, request.db)} return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: raise GeoreferenceParameterError('Wrong or missing service parameter') except GeoreferenceParameterError as e: message = 'Wrong or missing service parameter - %s'%e.value log.error(message) return HTTPBadRequest(message) except Exception as e: message = 'Problems while computing validation result - %s'%e.value log.error(message) return HTTPInternalServerError(message)
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) request_data = None if request.method == 'POST': request_data = request.json_body mapObj = parseMapObjForId(request_data, 'id', request.db) log.debug('Id is valide: %s' % request_data) log.debug( 'Check if there is already a registered georeference process for this messtischblatt ...' ) if Georeferenzierungsprozess.isGeoreferenced(mapObj.id, request.db): msg = 'There is already a georeference process for this process. Please load again and start on the latest changes.' log.debug(msg) georeferenceid = Georeferenzierungsprozess.getActualGeoreferenceProcessForMapId( mapObj.id, request.db).id response = {'text': msg, 'georeferenceid': georeferenceid} return response # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int( str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference'][ 'source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str( convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess( messtischblattid=mapObj.apsobjectid, nutzerid=userid, georefparams=ast.literal_eval(georeference_parameter), clipparameter=georeference_parameter, timestamp=timestamp, isactive=True, type='new', adminvalidation='', processed=False, mapid=mapObj.id, overwrites=0) request.db.add(georefProcess) request.db.flush() log.debug('Create response ...') response = { 'text': 'Georeference result saved. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': 20, 'gcps': request_data['georeference'], 'type': 'confirm' } return response else: raise GeoreferenceParameterError( 'Wrong or missing service parameter') except GeoreferenceParameterError as e: log.error(e) log.error(traceback.format_exc()) raise HTTPBadRequest(ERROR_MSG) except Exception as e: log.error(e) log.error(traceback.format_exc()) raise HTTPInternalServerError(ERROR_MSG)