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)
Beispiel #2
0
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 registerGeoreferenceProcess(self, messtischblattid, userid=None, clipParams=None, isvalide=False, typeValidation='none', refzoomify=True):
     # get timestamp
     timestamp = getTimestampAsPGStr()
     georefProcess = Georeferenzierungsprozess(messtischblattid = messtischblattid, nutzerid = userid, 
             clipparameter = clipParams, timestamp = timestamp, isvalide = isvalide, typevalidierung = 'user', refzoomify = refzoomify)
     self.dbsession.add(georefProcess)
     self.dbsession.flush()
     return georefProcess  
 def getDummyGeorefProcess(cls):
     return Georeferenzierungsprozess(
         messtischblattid=71055048,
         nutzerid='user',
         clipparameter=
         "{'source': 'pixel', 'target': 'EPSG:4314', 'gcps': [{'source': [451.0, 7662.0], 'target': [16.1666660308838, 50.2999992370605]}, {'source': [480.0, 1198.0], 'target': [16.1666660308838, 50.4000015258789]}, {'source': [7374.0, 1229.0], 'target': [16.3333339691162, 50.4000015258789]}, {'source': [7341.0, 7689.0], 'target': [16.3333339691162, 50.2999992370605]}]}",
         timestamp=getTimestampAsPGStr(),
         isvalide=True,
         type='new',
         refzoomify=True,
         publish=False,
         processed=False)
Beispiel #5
0
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)
Beispiel #6
0
def reset_pw(request):
    dbsession = request.db
    try:
        login = request.params['username']
        email = request.params['email']

        if not login or not email:
            raise MissingQueryParameterError(
                'Missing information for reset password process.')

        if 'form.submitted' in request.params:
            user = Users.by_username(login, dbsession)
            if user and user.email == email:
                # register ticket in database
                newTicket = Fehlermeldung(fehlerbeschreibung="Passwort reset",
                                          timestamp=getTimestampAsPGStr(),
                                          referenz="users",
                                          nutzerid=user.login,
                                          objektid=user.id)
                dbsession.add(newTicket)

                # reset password
                newPassword = generateRandomString(10)
                user._set_password(newPassword)

                # send new password
                reset_msg = password_reset_msg.format(
                    user=str(user.login), new_password=str(newPassword))
                response = sendMailCommandLine(
                    user.email, 'Your password has been changed!', reset_msg)
                if not response:
                    raise InternalAuthentificationError(
                        'Internal server error while trying to send you your new password. Please try again or contact the page administrator.'
                    )

                # create response
                target_url = request.route_url('auth',
                                               action='page_reset_success')
                transaction.commit()
                return HTTPFound(location=target_url)
            else:
                raise InternalAuthentificationError(
                    'Internal server error while trying to change password. Please try again or contact the page administrator.'
                )

        else:
            raise MissingQueryParameterError('Missing form validation.')

    except MissingQueryParameterError, InternalAuthentificationError:
        raise
Beispiel #7
0
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)
Beispiel #8
0
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
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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
Beispiel #12
0
 def registerGeoreferenceProcess(self,
                                 messtischblattid,
                                 userid=None,
                                 clipParams=None,
                                 isvalide=False,
                                 typeValidation='none',
                                 refzoomify=True):
     # get timestamp
     timestamp = getTimestampAsPGStr()
     georefProcess = Georeferenzierungsprozess(
         messtischblattid=messtischblattid,
         nutzerid=userid,
         clipparameter=clipParams,
         timestamp=timestamp,
         isvalide=isvalide,
         typevalidierung='user',
         refzoomify=refzoomify)
     self.dbsession.add(georefProcess)
     self.dbsession.flush()
     return georefProcess
Beispiel #13
0
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
Beispiel #14
0
def reset_pw(request):
    dbsession = request.db
    try:
        login = request.params['username']
        email = request.params['email']
        
        if not login or not email:
            raise MissingQueryParameterError('Missing information for reset password process.')
    
        if 'form.submitted' in request.params:
            user = Users.by_username(login, dbsession)
            if user and user.email == email:
                # register ticket in database
                newTicket = Fehlermeldung(fehlerbeschreibung="Passwort reset", timestamp=getTimestampAsPGStr(), referenz="users", nutzerid=user.login, objektid=user.id);
                dbsession.add(newTicket);
                
                # reset password 
                newPassword = generateRandomString(10) 
                user._set_password(newPassword)
                
                # send new password
                reset_msg = password_reset_msg.format(user = str(user.login), new_password = str(newPassword))
                response = sendMailCommandLine(user.email, 'Your password has been changed!', reset_msg)
                if not response:
                    raise InternalAuthentificationError('Internal server error while trying to send you your new password. Please try again or contact the page administrator.')
                
                # create response
                target_url = request.route_url('auth', action='page_reset_success')
                transaction.commit()
                return HTTPFound(location = target_url)   
            else:
                raise InternalAuthentificationError('Internal server error while trying to change password. Please try again or contact the page administrator.')
            
        else:
            raise MissingQueryParameterError('Missing form validation.')

    except MissingQueryParameterError, InternalAuthentificationError:
        raise
 def getDummyGeorefProcess(cls):
     return Georeferenzierungsprozess(messtischblattid = 71055048, nutzerid = 'user', 
         clipparameter = "{'source': 'pixel', 'target': 'EPSG:4314', 'gcps': [{'source': [451.0, 7662.0], 'target': [16.1666660308838, 50.2999992370605]}, {'source': [480.0, 1198.0], 'target': [16.1666660308838, 50.4000015258789]}, {'source': [7374.0, 1229.0], 'target': [16.3333339691162, 50.4000015258789]}, {'source': [7341.0, 7689.0], 'target': [16.3333339691162, 50.2999992370605]}]}", 
         timestamp = getTimestampAsPGStr(), isvalide = True, type = 'new', refzoomify = True, publish = False, processed = False)
Beispiel #16
0
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)
Beispiel #17
0
def createNewAdminJob(georeferenceprocess, setto, userid, comment):
    return AdminJobs(georefid = georeferenceprocess.id, processed = False, setto = setto, 
                     timestamp = getTimestampAsPGStr(), comment = comment, userid = userid)
Beispiel #18
0
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)
Beispiel #19
0
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)
Beispiel #20
0
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)
Beispiel #21
0
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)
Beispiel #22
0
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)