コード例 #1
0
def editFile(request):
    logging.info('Handling editFile request: %s', request.REQUEST.items())
    
    instanceId = request.REQUEST.get('instanceId')
    sha1 = request.REQUEST.get('sha1')
    
    file = models.File.gql('where instanceId = :1 and sha1 = :2', 
                            int(instanceId), sha1).get()
    
    if file is not None:
        requestTags = request.REQUEST.get('tags')
        
        newTags = toTags(requestTags)
        
        file.tags = newTags
        #url = request.REQUEST.get('url')
        file.put();
        #return HttpResponse()
        filesInstance = {'tags' : newTags,
                         'success' : True,
                         'message' : 'Michael Corleone says hello'}
        json = jsonpickle.dumps(filesInstance)
        return jsonControllerUtils.writeResponse(request, json)
            
    else:
        logging.warn('No matching file')
        return HttpResponseNotFound()
コード例 #2
0
def littleShootData(request):
    logging.info('Handling request: %s', request.REQUEST.items())
    
    littleShootPresent = appChecker.littleShootPresent(request, 0.80)
    if littleShootPresent:
        logging.info('Found LittleShoot...returning JSON')
        littleShootData = request.COOKIES.get('littleShootData')
        if littleShootData is None:
            # If we don't get general data, look for the cookie set by the client
            # check.  The client sets its own cookie, but it doesn't work on IE.
            littleShootData = request.COOKIES.get('littleShootClientCookie')
        json = urllib.unquote(littleShootData)
    else:
        # We can't really just return a 404 here because we still need to
        # call the callback function.
        data = {'appPresent' : False}
        json = jsonpickle.dumps(data)
    
    return jsonControllerUtils.writeResponse(request, json)
コード例 #3
0
def publishFileBase(request, useInstanceId):
    requestDict = request.REQUEST
    logging.info('Handling publishFile request: %s', requestDict.items())
    title = requestDict.get('title')
    #logging.info('Getting SHA-1')
    sha1 = requestDict.get('sha1')
    #etag = requestDict.get('etag')
    uri = requestDict.get('uri')
    
    size = requestDict.get('size')
    
    #logging.info('Got params')
    if title[0] == '.':
        return HttpResponseBadRequest('Cannot publish dot files')
    
    #logging.info('About to guess MIME')
    mimeType, encoding = mimetypes.guess_type(title)
    #logging.info('full mime: %s', mimeType)
    if mimeType is None:
        mimeType = 'application/octet-stream'
    mediaType = typeTranslator.getType(title);
    #logging.info('mediaType: %s', mediaType)
    
    if useInstanceId:
        #logging.info('getting instance ID')
        instanceId = int(requestDict.get('instanceId'))
        file = models.File.gql('where sha1 = :1 and instanceId = :2', sha1, instanceId).get()
    else:
        file = models.File.gql('where uri = :1 and size = :2', uri, size).get()
        
    logging.info('Existing file is: %s', file)
    
    requestTags = requestDict.get('tags')
    tagsArray = toTags(requestTags)
    
    alreadyPublished = False
    if file is None:
        form = PublishFileForm(data=requestDict)
    else:
        logging.info('File is not None!!')
        form = PublishFileForm(data=requestDict, instance=file)
        alreadyPublished = True
    if not form.is_valid():
        logging.info('Form not valid!!')
        return HttpResponse('ERROR: Publish file errors:\n%s' % repr(form.errors),
                        content_type='text/plain', status=400)
        
    file = form.save(commit=False)
    file.downloaded = util.dictStringToBool(requestDict, 'downloaded')
    file.mimeType = mimeType
    file.mediaType = mediaType
    file.tags = tagsArray
    
    metaFile = models.MetaFile.gql('where uri = :1', form.cleaned_data['uri']).get()
    if metaFile is None:
        #logging.info('Creating new meta file')
        metaForm = PublishMetaFileForm(data=requestDict)
        if not metaForm.is_valid():
            logging.info('ERROR: Publish meta file errors:\n%s' % repr(metaForm.errors))
            return HttpResponse('ERROR: Publish meta file errors:\n%s' % repr(metaForm.errors),
                        content_type='text/plain', status=400)
        metaFile = metaForm.save(commit=False)
        metaTags = title.split()
        metaTags.extend(tagsArray)
        metaFile.tags = metaTags
        metaFile.titles = [metaFile.title]
        #metaFile.onlineInstances = []
        metaFile.mimeType = mimeType
        metaFile.mediaType = mediaType
        
    else:
        #logging.info('Updating meta file')
        if title not in metaFile.titles:
            metaFile.titles.append(title)
        
        metaTags = []
        for tag in tagsArray:
            if tag not in metaFile.tags:
                logging.info('Appending tag: %s', tag)
                metaTags.append(tag)
        metaFile.tags.extend(metaTags) 

    #logging.info('Saving metaFile: %s', metaFile)
    if useInstanceId:
        instance = models.OnlineInstance.gql('where instanceId = :1', instanceId).get()
        if instance is None:
            logging.error('We know nothing about the instance')
            file.instanceOnline = False
        else:
            file.instanceOnline = True
            logging.debug('Appending LittleShoot instance')
            #if instance.key() not in metaFile.onlineInstances:
            #logging.info('Adding instance...')
            #metaFile.onlineInstances.append(instance.key())
            
            # This could be a publish request that's updating an existing file,
            # in which case it shouldn't increase the online count.
            if not alreadyPublished:
                metaFile.numOnlineInstances += 1
            
    file.put()
    metaFile.put()
    
    logging.info("Encoding file title: %s", file.title)
    encodedName = urllib.quote(file.title)
    downloadParams = {'uri': metaFile.uri,
        'name': file.title,
        'size': metaFile.size,
        
        # Careful here. In the future the URI passed to this method might 
        # not be a URN.
        'urn': metaFile.uri
        }
    encodedDownloadParams = urllib.urlencode(downloadParams)
    fullUri = 'http://www.littleshoot.org/api/client/download/'+encodedName+'?' + encodedDownloadParams
    logging.info("Encoded URL: %s", fullUri)
    
    # The URI here needs to be the full
    params = {'uri': fullUri,
        'title': file.title,
        }
    #query = urllib.urlencode(params)
    #linkUrl = "http://www.littleshoot.org/link?"+ query
    
    allProps = toNormalizedDict(metaFile)
    #allProps['link'] = linkUrl
    allProps['link'] = fullUri
    
    logging.info("Props: %s", allProps)
    
    json = simplejson.dumps(allProps)
    
    channels = simplejson.loads(memcache.get('channels') or '{}')
    
    files = fetchRecentFiles("0", "10")
    encoded_message = filesPickler.pickle(files, 10)
    
    for channel_id in channels.iterkeys():
        # encoded_message = simplejson.dumps(message)
        logging.info("Sending message on channel: %s", channel_id)
        channel.send_message(channel_id, encoded_message)
        
    return jsonControllerUtils.writeResponse(request, json)