Beispiel #1
0
def getExifTime(request, exifTimeString, uploadedFile, form_tz):
    # correct the timezone, we store time in utc
    if 'UTC' in form_tz.zone:
        form_tz = pytz.utc
    if exifTimeString:
        exifTime = dateparser(str(exifTimeString))
        if (form_tz != pytz.utc) and exifTime and exifTime.tzinfo is None:
            localized_time = form_tz.localize(exifTime)
            exifTime = TimeUtil.timeZoneToUtc(localized_time)
        else:
            exifTime = exifTime.replace(tzinfo=pytz.utc)
    else:
        # read the time from the last modified time that we pushed in from imageUpload.js
        if 'HTTP_LASTMOD' in request.META:
            modtimesString = request.META['HTTP_LASTMOD']
            if modtimesString:
                modtime = None
                theImages = modtimesString.split(',')
                for i in theImages:
                    k, v = i.split('||')
                    if k == str(uploadedFile.name):
                        modtime = datetime.fromtimestamp(int(v) / 1000)
                        break
                if modtime:
                    localized_time = form_tz.localize(modtime)
                    exifTime = TimeUtil.timeZoneToUtc(localized_time)
    return exifTime
Beispiel #2
0
def buildExifPosition(exif, camera, vehicle, exifTime, form_tz):
    """
    Given the image's exif data and a camera object,
    creates a new position object that contains the lat and lon information.
    """
    gpsLatLon = getLatLon(exif)
    gpsTimeStamp = getGPSDatetime(exif)
    if gpsTimeStamp:
        gpsTimeStamp = form_tz.localize(gpsTimeStamp)
        gpsTimeStamp = TimeUtil.timeZoneToUtc(gpsTimeStamp)
    else:
        gpsTimeStamp = exifTime

    if gpsTimeStamp and gpsLatLon[0] and gpsLatLon[1]:
        #TODO this requires that the position model has heading and altitude ...
        #TODO right now this is hardcoded, instead there should be a classmethod to build a position dict
        # given some incoming data and the classmethod should be on the position model
        position_class = POSITION_MODEL.get()
        position_dict = {
            'serverTimestamp': gpsTimeStamp,
            'timestamp': gpsTimeStamp,
            'latitude': gpsLatLon[0],
            'longitude': gpsLatLon[1]
        }
        if hasattr(position_class, 'yaw'):
            position_dict['yaw'] = getHeading(exif)
        elif hasattr(position_class, 'heading'):
            position_dict['heading'] = getHeading(exif)
        if hasattr(position_class, 'altitude'):
            position_dict['altitude'] = getAltitude(exif)

        position = POSITION_MODEL.get().objects.create(**position_dict)
        return position

    return None
Beispiel #3
0
def doImportNotes(request, sourceFile, tz, resource):
    dictreader = csv.DictReader(sourceFile)
    for row in dictreader:
        row['author'] = request.user
        if row['content'] or row['tags']:
            if 'first_name' in row and 'last_name' in row:
                if row['first_name'] and row['last_name']:
                    try:
                        row['author'] = User.objects.get(first_name=row['first_name'], last_name=row['last_name'])
                        del row['first_name']
                        del row['last_name']
                    except:
                        pass
        if row['event_time']:
            event_time = dateparser(row['event_time'])
            if tz != pytz.utc:
                localized_time = tz.localize(event_time)
                event_time = TimeUtil.timeZoneToUtc(localized_time)
            row['event_time'] = event_time 
        
        try:
            # TODO implement tags when ready
            del row['tags']
        except:
            pass
        
        NOTE_MODEL = Note.get()
        note = NOTE_MODEL(**row)
        note.creation_time = datetime.now(pytz.utc)
        note.modification_time = datetime.now(pytz.utc)
        
        if resource:
            note.position = getClosestPosition(timestamp=note.event_time, resource=resource)
        note.save()
Beispiel #4
0
def buildExifPosition(exif, camera, resource, exifTime, form_tz):
    """
    Given the image's exif data and a camera object, 
    creates a new position object that contains the lat and lon information.
    """
    gpsLatLon = getLatLon(exif)
    gpsTimeStamp = getGPSDatetime(exif)
    if gpsTimeStamp:
        gpsTimeStamp = form_tz.localize(gpsTimeStamp)
        gpsTimeStamp = TimeUtil.timeZoneToUtc(gpsTimeStamp)
    else:
        gpsTimeStamp = exifTime

    if gpsTimeStamp and gpsLatLon[0] and gpsLatLon[1]:
        # TODO this requires that the position model has heading and altitude ...
        position = POSITION_MODEL.get().objects.create(
            serverTimestamp=gpsTimeStamp,
            timestamp=gpsTimeStamp,
            latitude=gpsLatLon[0],
            longitude=gpsLatLon[1],
            heading=getHeading(exif),
            altitude=getAltitude(exif),
        )
        return position

    return None
Beispiel #5
0
def buildExifPosition(exif, camera, resource, exifTime, form_tz):
    '''
    Given the image's exif data and a camera object, 
    creates a new position object that contains the lat and lon information.
    '''
    gpsLatLon = getLatLon(exif)
    gpsTimeStamp = getGPSDatetime(exif)
    if gpsTimeStamp:
        gpsTimeStamp = form_tz.localize(gpsTimeStamp)
        gpsTimeStamp = TimeUtil.timeZoneToUtc(gpsTimeStamp)
    else:
        gpsTimeStamp = exifTime

    if gpsTimeStamp and gpsLatLon[0] and gpsLatLon[1]:
        #TODO this requires that the position model has heading and altitude ...
        position = POSITION_MODEL.get().objects.create(
            serverTimestamp=gpsTimeStamp,
            timestamp=gpsTimeStamp,
            latitude=gpsLatLon[0],
            longitude=gpsLatLon[1],
            heading=getHeading(exif),
            altitude=getAltitude(exif))
        return position

    return None
Beispiel #6
0
def saveImage(request):
    """
    Image drag and drop, saves the files and to the database.
    """
    if request.method == "POST":
        timeMark = time.time()
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # create and save a single image obj
            uploadedFile = request.FILES["file"]
            newImage = SINGLE_IMAGE_MODEL.get()(file=uploadedFile)

            form_tz = form.getTimezone()
            resource = form.getResource()
            exifData = getExifData(newImage)

            # save image dimensions and file size
            try:
                newImage.width = int(getExifValue(exifData, "ExifImageWidth"))
                newImage.height = int(getExifValue(exifData, "ExifImageHeight"))
            except:
                pass

            newImage.fileSizeBytes = uploadedFile.size

            # get exif time
            exifTime = None
            exifTimeString = getExifValue(exifData, "DateTimeOriginal")
            if not exifTimeString:
                exifTimeString = getExifValue(exifData, "DateTime")

            if exifTimeString:
                exifTime = datetime.strptime(str(exifTimeString), "%Y:%m:%d %H:%M:%S")
                if (form_tz != pytz.utc) and exifTime:
                    localized_time = form_tz.localize(exifTime)
                    exifTime = TimeUtil.timeZoneToUtc(localized_time)
                else:
                    exifTime = exifTime.replace(tzinfo=pytz.utc)
            else:
                # read the time from the last modified time that we pushed in from imageUpload.js
                if "HTTP_LASTMOD" in request.META:
                    modtimesString = request.META["HTTP_LASTMOD"]
                    if modtimesString:
                        modtime = None
                        theImages = modtimesString.split(",")
                        for i in theImages:
                            k, v = i.split("||")
                            if k == str(uploadedFile.name):
                                modtime = datetime.fromtimestamp(int(v) / 1000)
                                break
                        if modtime:
                            localized_time = form_tz.localize(modtime)
                            exifTime = TimeUtil.timeZoneToUtc(localized_time)
            if not exifTime:
                exifTime = datetime.now(pytz.utc)
            # create a new image set instance

            author = None
            if request.user.is_authenticated():
                author = request.user  # set user as image author
            elif "username" in request.POST:
                try:
                    username = str(request.POST["username"])
                    author = User.objects.get(username=username)
                except:
                    author = User.objects.get(username="******")

            newImageSet = IMAGE_SET_MODEL.get()()
            newImageSet.acquisition_time = exifTime
            newImageSet.acquisition_timezone = form.getTimezoneName()
            fileName = uploadedFile.name
            newImageSet.name = fileName
            newImageSet.camera = getCameraObject(exifData)

            newImageSet.track_position = getTrackPosition(exifTime, resource)
            newImageSet.exif_position = buildExifPosition(exifData, newImageSet.camera, resource, exifTime, form_tz)

            newImageSet.author = author
            newImageSet.resource = resource
            newImageSet.finish_initialization(request)

            nowTime = time.time()
            uploadAndSaveTime = nowTime - timeMark
            newImageSet.uploadAndSaveTime = uploadAndSaveTime
            overallStartTime = cache.get("imageAutoloadGlobalTimeMark", None)
            if overallStartTime:
                totalTimeSinceNotify = nowTime - float(overallStartTime)
                newImageSet.totalTimeSinceNotify = totalTimeSinceNotify
            newImageSet.save()

            # link the "image set" to "image".
            newImage.imageSet = newImageSet
            newImage.save()

            # create a thumbnail
            thumbnailStream = createThumbnailFile(newImage.file)
            SINGLE_IMAGE_MODEL.get().objects.create(
                file=thumbnailStream, raw=False, thumbnail=True, imageSet=newImageSet
            )

            # create deep zoom tiles for viewing in openseadragon.
            if newImageSet.create_deepzoom:
                deepzoomTilingThread = Thread(target=newImageSet.create_deepzoom_image)
                deepzoomTilingThread.start()
            #                newImageSet.create_deepzoom_image()

            imageSetDict = newImageSet.toMapDict()
            # pass the image set to the client as json.
            return HttpResponse(
                json.dumps({"success": "true", "json": imageSetDict}, cls=DatetimeJsonEncoder),
                content_type="application/json",
            )
        else:
            return HttpResponse(
                json.dumps({"error": "Imported image is not valid", "details": form.errors}),
                content_type="application/json",
            )
Beispiel #7
0
def saveImage(request):
    """
    Image drag and drop, saves the files and to the database.
    """
    if request.method == 'POST':
        timeMark = time.time()
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # create and save a single image obj
            uploadedFile = request.FILES['file']
            newSingleImage = SINGLE_IMAGE_MODEL.get()(file=uploadedFile)

            form_tz = form.getTimezone()
            resource = form.getResource()
            exifData = getExifData(newSingleImage)

            # save image dimensions and file size
            try:
                newSingleImage.width = int(
                    getExifValue(exifData, 'ExifImageWidth'))
                newSingleImage.height = int(
                    getExifValue(exifData, 'ExifImageHeight'))
            except:
                pass

            newSingleImage.fileSizeBytes = uploadedFile.size

            # get exif time
            exifTime = None
            exifTimeString = getExifValue(exifData, 'DateTimeOriginal')
            if not exifTimeString:
                exifTimeString = getExifValue(exifData, 'DateTime')

            if exifTimeString:
                exifTime = datetime.strptime(str(exifTimeString),
                                             '%Y:%m:%d %H:%M:%S')
                if (form_tz != pytz.utc) and exifTime:
                    localized_time = form_tz.localize(exifTime)
                    exifTime = TimeUtil.timeZoneToUtc(localized_time)
                else:
                    exifTime = exifTime.replace(tzinfo=pytz.utc)
            else:
                # read the time from the last modified time that we pushed in from imageUpload.js
                if 'HTTP_LASTMOD' in request.META:
                    modtimesString = request.META['HTTP_LASTMOD']
                    if modtimesString:
                        modtime = None
                        theImages = modtimesString.split(',')
                        for i in theImages:
                            k, v = i.split('||')
                            if k == str(uploadedFile.name):
                                modtime = datetime.fromtimestamp(int(v) / 1000)
                                break
                        if modtime:
                            localized_time = form_tz.localize(modtime)
                            exifTime = TimeUtil.timeZoneToUtc(localized_time)
            if not exifTime:
                exifTime = datetime.now(pytz.utc)
            # create a new image set instance

            author = None
            if request.user.is_authenticated():
                author = request.user  # set user as image author
            elif 'username' in request.POST:
                try:
                    username = str(request.POST['username'])
                    author = User.objects.get(username=username)
                except:
                    author = User.objects.get(username='******')

            if 'object_id' in request.POST:
                newImageSet = IMAGE_SET_MODEL.get()(
                    pk=int(request.POST['object_id']))
            else:
                newImageSet = IMAGE_SET_MODEL.get()()

            newImageSet.acquisition_time = exifTime
            newImageSet.acquisition_timezone = form.getTimezoneName()
            fileName = uploadedFile.name
            newImageSet.name = fileName
            newImageSet.camera = getCameraObject(exifData)

            newImageSet.track_position = getTrackPosition(exifTime, resource)
            newImageSet.exif_position = buildExifPosition(
                exifData, newImageSet.camera, resource, exifTime, form_tz)

            newImageSet.author = author
            newImageSet.resource = resource
            newImageSet.finish_initialization(request)

            nowTime = time.time()
            uploadAndSaveTime = nowTime - timeMark
            newImageSet.uploadAndSaveTime = uploadAndSaveTime
            overallStartTime = cache.get("imageAutoloadGlobalTimeMark", None)
            if overallStartTime:
                totalTimeSinceNotify = nowTime - float(overallStartTime)
                newImageSet.totalTimeSinceNotify = totalTimeSinceNotify
            newImageSet.save()

            # link the "image set" to "image".
            newSingleImage.imageSet = newImageSet
            newSingleImage.save()

            # relay if needed
            if 'relay' in request.POST:
                # create the record for the datum
                # fire a message for new data
                deletePostKey(request.POST, 'relay')
                addRelay(newImageSet, request.FILES, json.dumps(request.POST),
                         reverse('xgds_save_image'))
            # create a thumbnail
            thumbnailStream = createThumbnailFile(newSingleImage.file)
            SINGLE_IMAGE_MODEL.get().objects.create(file=thumbnailStream,
                                                    raw=False,
                                                    thumbnail=True,
                                                    imageSet=newImageSet)

            # create deep zoom tiles for viewing in openseadragon.
            if (newImageSet.create_deepzoom):
                deepzoomTilingThread = Thread(
                    target=newImageSet.create_deepzoom_image)
                deepzoomTilingThread.start()


#                newImageSet.create_deepzoom_image()

            imageSetDict = newImageSet.toMapDict()
            # pass the image set to the client as json.
            return HttpResponse(json.dumps(
                {
                    'success': 'true',
                    'json': imageSetDict
                },
                cls=DatetimeJsonEncoder),
                                content_type='application/json')
        else:
            return HttpResponse(json.dumps({
                'error': 'Imported image is not valid',
                'details': form.errors
            }),
                                content_type='application/json')