Beispiel #1
0
    def verify_phone(self, key):
        ret = {}
        if key is None:
            ret['errors'] = []
            ret['errors'].append("Invalid and/or expired key supplied")
            return apiDecorate(ret, 400, "Invalid and/or expired key supplied")

        session = dbConn().get_session(dbConn().get_engine())
        userValidate = session.query(models.user_validate).filter(
            models.user_validate.phoneCode == key).first()
        if (userValidate is None):
            ret['errors'] = []
            ret['errors'].append("Invalid and/or expired key supplied")
            return apiDecorate(ret, 400, "Invalid and/or expired key supplied")
        curUser = session.query(
            models.User).filter(models.User.id == userValidate.id).first()
        if (curUser is None):
            ret['errors'] = []
            ret['errors'].append("Server Error")
            return apiDecorate(ret, 500, "Server Error")
        curUser.isPhone = True
        session.commit()
        if (curUser.isEmail == True):
            session.delete(userValidate)
        session.commit()
        return apiDecorate(ret, 200, "Verified")
 def batchList(user_id):
     ret = {}
     session = dbConn().get_session(dbConn().get_engine())
     user = session.query(
         models.User).filter(models.User.id == user_id).first()
     if (user is None):
         ret['errors'] = []
         ret['errors'].append("Invalid User")
         return apiDecorate(ret, 400, "Invalid User")
     batches = session.query(
         models.batch).filter(models.batch.user_id == user.id).filter(
             models.batch.isCompleted == False).all()
     userBatches = []
     for batch in batches:
         userBatch = {}
         userBatch['id'] = batch.id
         experiment = session.query(models.experiments).filter(
             models.experiments.resource_id == batch.experiment_id).first()
         if (experiment.isPaused != 0):
             continue
         datas = session.query(models.dataset).filter(
             models.dataset.id == experiment.dataset_id).first()
         userBatch['description'] = experiment.description
         userBatch['price'] = experiment.price
         userBatch['isMedia'] = datas.isMedia
         if (batch.deadline != None):
             userBatch['due'] = str(batch.deadline)
         else:
             userBatch['due'] = "No Deadline"
         userBatches.append(userBatch)
     ret['batches'] = userBatches
     return apiDecorate(ret, 200, "Success")
    def rateBatch(batch_id, rating):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        curBatch = session.query(
            models.batch).filter(models.batch.id == batch_id).first()
        if (curBatch is None):
            ret['errors'] = []
            ret['errors'].append("Invalid batch")
            return apiDecorate(ret, 400, "Invalid batch")
        if (curBatch.isCompleted == False):
            ret['errors'] = []
            ret['errors'].append("Batch not annotated")
            return apiDecorate(ret, 400, "Batch not annotated")

        if (curBatch.rating is not None):
            ret['errors'] = []
            ret['errors'].append("Batch already has rating")
            return apiDecorate(ret, 400, "Batch already has rating")

        if (rating > 5):
            rating = 5
        elif (rating < 0):
            rating = 0
        curBatch.rating = rating
        session.commit()
        return apiDecorate(ret, 200, "success")
    def getBatchToRate(experiment_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        experiment = session.query(models.experiments).filter(
            models.experiments.id == experiment_id).first()
        if experiment is None:
            ret['errors'] = []
            ret['errors'].append("Invalid experiment id")
            return apiDecorate(ret, 400, "Invalid experiment id")
        batches = session.query(models.batch).filter(
            models.batch.experiment_id == experiment.resource_id).filter(
                models.batch.rating == None).all()
        finishedBatch = []

        for batch in batches:
            if (batch.isCompleted == False):
                continue
            botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                       datasetHandler.DREAM_secretKey,
                                       host="objects-us-west-1.dream.io")
            bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                         validate=False)
            curBatch = {}
            curBatch['id'] = batch.id
            link = "e_" + experiment.resource_id + "/" + str(
                batch.local_resource_id) + "_res.json"
            itemk = Key(bucket)
            itemk.key = link
            print link
            link = itemk.generate_url(3600, query_auth=True, force_http=True)
            curBatch['link'] = link
            print link
            finishedBatch.append(curBatch)
        ret['batches'] = finishedBatch
        return apiDecorate(ret, 200, "success")
Beispiel #5
0
    def login(self):
        ret = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)

        user = models.User(password=argArray.get("password"),
                           email=argArray.get("email"))
        if not user.email or not user.password:
            ret['errors'] = []
            ret['errors'].append("Invalid and/or expired key supplied")
            return apiDecorate(ret, 400, "Invalid and/or expired key supplied")

        session = dbConn().get_session(dbConn().get_engine())
        user = session.query(
            models.User).filter(models.User.email == user.email).filter(
                models.User.password == user.password).filter(
                    models.User.isEmail == 1).filter(
                        models.User.isPhone == 1).first()

        if user is None:
            ret['errors'] = []
            ret['errors'].append(
                "Incorect User/password combinator or the user is not registered"
            )
            return apiDecorate(ret, 400, "Invalid and/or expired key supplied")
        ret['id'] = user.id

        return apiDecorate(ret, 200, "Login Accepted")
Beispiel #6
0
    def toggleDataset(self, user_id, dataset_id):
        ret = {}
        user = self.getUser(user_id)
        if user is None:
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        session = session = dbConn().get_session(dbConn().get_engine())
        dataset = session.query(
            models.dataset).filter(models.dataset.user_id == user_id).filter(
                models.dataset.id == dataset_id).first()

        if dataset is None:
            ret['errors'] = []
            ret['errors'].append(
                "Invalid dataset or user doesnt own the dataset")
            return apiDecorate(
                ret, 400, "Invalid dataset or user doesnt own the dataset")

        if (dataset.isPublic == False):
            dataset.isPublic = True
        else:
            dataset.isPublic = False
        session.commit()
        return apiDecorate(ret, 200, "Success")
Beispiel #7
0
    def copyPublicDataset(self, user_id, dataset_id):
        ret = {}
        user = self.getUser(user_id)
        if user is None:
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        session = session = dbConn().get_session(dbConn().get_engine())
        dataset = session.query(
            models.dataset).filter(models.dataset.id == dataset_id).filter(
                models.dataset.isPublic == True).first()
        if dataset is None:
            ret['errors'] = []
            ret['errors'].append("Invalid dataset or dataset is not public")
            return apiDecorate(ret, 400,
                               "Invalid dataset or dataset is not public")

        #copyDataset = models.dataset(user.id, file_name=dataset.file_name, resource_id=dataset.resource_id)
        copyDataset = models.dataset(user.id,
                                     isMedia=dataset.isMedia,
                                     resource_id=dataset.resource_id)
        copyDataset.title = dataset.title
        session.add(copyDataset)
        session.commit()
        copyDataset.isPublic = True
        session.commit()
        return apiDecorate(ret, 200, "Success")
    def getExperimentProgress(user_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        experiments = session.query(models.experiments).filter(
            models.experiments.user_id == user_id).all()
        if (experiments is None):
            return apiDecorate(ret, 400, "Invalid id")
        ret['experiments'] = []
        for experiment in experiments:
            totalAnnotateCount = 0
            curAnnotateCount = 0
            print(experiment.resource_id)
            batches = session.query(models.batch).filter(
                models.batch.experiment_id == experiment.resource_id).all()

            botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                       datasetHandler.DREAM_secretKey,
                                       host="objects-us-west-1.dream.io")
            bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                         validate=False)
            dataArr = []
            for batch in batches:
                if (batch.isCompleted == True):
                    fileName = "e_" + experiment.resource_id + "/" + str(
                        batch.local_resource_id) + "_res.json"
                    k = Key(bucket)
                    k.key = fileName
                    fileJson = k.get_contents_as_string()
                    fileArr = json.loads(fileJson)
                    dataArr.append(fileArr)

                totalAnnotateCount += batch.totalAnnotation
                curAnnotateCount += batch.curAnnotation
            fileApp = "e_" + experiment.resource_id + "/" + "res.json"
            k = Key(bucket)
            k.key = fileApp
            print "key " + k.key
            sent = k.set_contents_from_string(json.dumps(dataArr),
                                              cb=None,
                                              md5=None,
                                              reduced_redundancy=False)

            curExp = {}
            curExp['total'] = totalAnnotateCount
            curExp['completed'] = curAnnotateCount
            curExp['experiment_id'] = experiment.id
            curExp['price'] = experiment.price
            curExp['description'] = experiment.description
            curExp['link'] = k.generate_url(3600,
                                            query_auth=True,
                                            force_http=True)
            if (experiment.isPaused != 0):
                curExp['status'] = "Paused"
            else:
                curExp['status'] = "Resumed"

            ret['experiments'].append(curExp)

        return apiDecorate(ret, 200, "Success")
    def submitBatchRowImage(batch_id):
        ret = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)

        imageText = argArray.get('imageText') or ""
        imageData = argArray.get('imageData') or ""
        if (len(imageText) == 0 or len(imageData) == 0):
            return apiDecorate(ret, 400, "Image data/text not present")
        session = dbConn().get_session(dbConn().get_engine())

        curBatch = session.query(
            models.batch).filter(models.batch.id == batch_id).first()
        if (curBatch is None):
            return apiDecorate(ret, 400, 'Invalid batch id')
        curExperiment = session.query(models.experiments).filter(
            models.experiments.resource_id == curBatch.experiment_id).first()
        curDataset = session.query(models.dataset).filter(
            models.dataset.id == curExperiment.dataset_id).first()
        if (curDataset.isMedia == False):
            return apiDecorate(ret, 400, "Invalid submission route called")
        if (curBatch.isCompleted == True):
            print "eee"
            return apiDecorate(ret, 400, "Batch finished annotating")
        batchData = {}
        batchData['text'] = imageText
        batchData['data'] = imageData

        botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                   datasetHandler.DREAM_secretKey,
                                   host="objects-us-west-1.dream.io")
        fileApp = "e_" + curExperiment.resource_id + "/" + str(
            curBatch.local_resource_id) + "_" + str(curBatch.curAnnotation)
        bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                     validate=False)
        k = Key(bucket)
        k.key = fileApp + ".json"
        print "key " + k.key
        sent = k.set_contents_from_string(json.dumps(batchData),
                                          cb=None,
                                          md5=None,
                                          reduced_redundancy=False)
        if ((curBatch.curAnnotation + 1) >= curBatch.totalAnnotation):
            curBatch.isCompleted = True
        curBatch.curAnnotation += 1
        session.commit()
        session = dbConn().get_session(dbConn().get_engine())
        curBatch = session.query(
            models.batch).filter(models.batch.id == batch_id).first()
        if (curBatch.isCompleted == True):
            datasetHandler.makeBatchData(batch_id)
        return apiDecorate(ret, 200, "Success")
Beispiel #10
0
    def getBalance(self, user_id):
        ret = {}
        user = self.getUser(user_id)
        if user is None:
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        ret['balance'] = user.balance
        return apiDecorate(ret, 200, "success")
Beispiel #11
0
 def getMoney(self, user_id, money):
     ret = {}
     session = dbConn().get_session(dbConn().get_engine())
     user = session.query(
         models.User).filter(models.User.id == user_id).first()
     if user is None:
         ret['errors'] = []
         ret['errors'].append("Invalid User")
         return apiDecorate(ret, 400, "Invalid User")
     user.balance += money
     session.commit()
     return apiDecorate(ret, 200, "success")
Beispiel #12
0
 def toggleExperiment(experiment_id):
     ret = {}
     session = dbConn().get_session(dbConn().get_engine())
     experiment = session.query(models.experiments).filter(
         models.experiments.id == experiment_id).first()
     if (experiment is None):
         ret['errors'] = []
         ret['errors'].append("Invalid experiment id")
         return apiDecorate(ret, 400, ret['errors'][0])
     if (experiment.isPaused == 0):
         experiment.isPaused = 1
     else:
         experiment.isPaused = 0
     session.commit()
     return apiDecorate(ret, 200, "success")
Beispiel #13
0
    def getExperimentDetails(experiment_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        experiment = session.query(models.experiments).filter(
            models.experiments.id == experiment_id).first()
        if experiment is None:
            ret['errors'] = []
            ret['errors'].append("Invalid experiment id")
            return apiDecorate(ret, 400, ret['errors'][0])

        ret['id'] = experiment_id
        ret['description'] = experiment.description
        ret['notifTime'] = experiment.notifTime
        ret['allocateTime'] = experiment.allocateTime
        ret['maxTime'] = experiment.maxTime
        return apiDecorate(ret, 200, "success")
Beispiel #14
0
    def assignBatch(user_id, experiment_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        user = session.query(
            models.User).filter(models.User.id == user_id).first()
        if (user is None):
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        experiment = session.query(models.experiments).filter(
            models.experiments.id == experiment_id).first()
        if (experiment is None):
            ret['errors'] = []
            ret['errors'].append("Invalid experiment")
            return apiDecorate(ret, 400, "Invalid experiment")

        hasBatch = session.query(models.batch).filter(
            models.batch.experiment_id == experiment.resource_id).filter(
                models.batch.user_id == user.id).first()
        if (hasBatch is not None):
            #ret['errors'] = []
            #ret['errors'].append("User already has a batch")

            ret['batch_id'] = hasBatch.id
            return apiDecorate(ret, 200, "Success")

        batch = session.query(models.batch).filter(
            models.batch.experiment_id == experiment.resource_id).filter(
                models.batch.user_id == None).first()
        if (batch is None):
            ret['errors'] = []
            ret['errors'].append("No batch available")
            return apiDecorate(ret, 400, "No batch available")

        batch.user_id = user.id
        ret['batch_id'] = batch.id
        if (experiment.maxTime != None):
            batch.deadline = datetime.now() + timedelta(
                hours=experiment.maxTime)
            if (experiment.notifTime != None):
                batch.notifDeadline = datetime.now() + timedelta(
                    hours=(experiment.maxTime - experiment.notifTime))
        session.commit()
        return apiDecorate(ret, 200, "Success")
Beispiel #15
0
 def getBatch(batch_id):
     ret = {}
     session = dbConn().get_session(dbConn().get_engine())
     batch = session.query(
         models.batch).filter(models.batch.id == batch_id).first()
     if (batch is None):
         ret['errors'] = []
         ret['errors'].append("Invalid batch id")
         return apiDecorate(ret, 400, "Invalid batch id")
     experiment = session.query(models.experiments).filter(
         models.experiments.resource_id == batch.experiment_id).first()
     dataset = session.query(models.dataset).filter(
         models.dataset.id == experiment.dataset_id).first()
     #k.key = "e_"+randName+"/"+str(batchCount)+".json"
     botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                datasetHandler.DREAM_secretKey,
                                host="objects-us-west-1.dream.io")
     bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                  validate=False)
     k = Key(bucket)
     k.key = "e_" + batch.experiment_id + "/" + str(
         batch.local_resource_id) + ".json"
     fileJson = k.get_contents_as_string()
     fileArr = json.loads(fileJson)
     ret['description'] = experiment.description
     if (dataset.isMedia == 1):
         filesArr = []
         for item in fileArr:
             itemKey = dataset.resource_id + "/" + str(item)
             itemK = Key(bucket)
             itemK.key = itemKey
             fileEntry = {}
             fileEntry['name'] = item
             fileEntry['link'] = itemK.generate_url(3600,
                                                    query_auth=True,
                                                    force_http=True)
             filesArr.append(fileEntry)
         ret['files'] = filesArr
     else:
         ret['data'] = fileArr
     ret['count'] = batch.curAnnotation
     return apiDecorate(ret, 200, "Success")
     #print k.generate_url(3600, query_auth=True, force_http=True)
     return fileJson
Beispiel #16
0
def retDatasets(user_id):

    ret = {}
    user = userHandler().getUser(user_id)

    session = dbConn().get_session(dbConn().get_engine())
    allUserDatasets = session.query(
        models.dataset).filter(models.dataset.user_id == user.id).all()

    if (allUserDatasets is None):
        ret['errors'] = []
        ret['errors'].append("No files uploaded")
        return apiDecorate(ret, 400, "User has not uploaded any files")
Beispiel #17
0
    def makeBatchData(batch_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())

        curBatch = session.query(
            models.batch).filter(models.batch.id == batch_id).first()
        curExp = session.query(models.experiments).filter(
            models.experiments.resource_id == curBatch.experiment_id).first()
        price = curExp.price
        curUser = session.query(
            models.User).filter(models.User.id == curBatch.user_id).first()
        if (curUser is None):
            return apiDecorate(ret, 400, "Not right user")

        curUser.balance = curUser.balance + price
        session.commit()

        session = dbConn().get_session(dbConn().get_engine())

        curBatch = session.query(
            models.batch).filter(models.batch.id == batch_id).first()
        curExperiment = session.query(models.experiments).filter(
            models.experiments.resource_id == curBatch.experiment_id).first()
        batches = session.query(models.batch).filter(
            models.batch.experiment_id == curBatch.experiment_id).order_by(
                models.batch.local_resource_id).all()
        botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                   datasetHandler.DREAM_secretKey,
                                   host="objects-us-west-1.dream.io")
        bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                     validate=False)
        dataArr = []
        for i in range(0, curBatch.totalAnnotation):
            k = Key(bucket)
            fileApp = "e_" + curExperiment.resource_id + "/" + str(
                curBatch.local_resource_id) + "_" + str(i) + ".json"
            k.key = fileApp
            fileJson = k.get_contents_as_string()
            fileArr = json.loads(fileJson)
            dataArr.append(fileArr)

        fileApp = "e_" + curExperiment.resource_id + "/" + str(
            curBatch.local_resource_id) + "_res"
        k = Key(bucket)
        k.key = fileApp + ".json"
        print "key " + k.key
        sent = k.set_contents_from_string(json.dumps(dataArr),
                                          cb=None,
                                          md5=None,
                                          reduced_redundancy=False)
Beispiel #18
0
 def getPublicDatasets(self):
     ret = {}
     session = session = dbConn().get_session(dbConn().get_engine())
     datasets = session.query(
         models.dataset).filter(models.dataset.isPublic == True).all()
     returnDict = []
     for data in datasets:
         returnData = {}
         #returnData['file_name'] = data.file_name
         returnData['title'] = data.title
         returnData['resource_name'] = data.resource_id
         returnData['id'] = data.id
         returnDict.append(returnData)
     ret['datasets'] = returnDict
     return apiDecorate(ret, 200, "Success")
Beispiel #19
0
    def getDatasets(self, user_id):
        ret = {}
        user = self.getUser(user_id)
        if user is None:
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        session = session = dbConn().get_session(dbConn().get_engine())
        datasets = session.query(
            models.dataset).filter(models.dataset.user_id == user_id).all()
        returnDict = []
        for data in datasets:
            returnData = {}
            returnData['title'] = data.title
            returnData['id'] = data.id
            returnData['resource_name'] = data.resource_id
            if (data.isPublic == True):
                returnData['status'] = "Public"
            else:
                returnData['status'] = "Private"
            returnDict.append(returnData)
        ret['datasets'] = returnDict
        return apiDecorate(ret, 200, "Success")
Beispiel #20
0
 def getPastExperiments(user_id):
     ret = {}
     session = dbConn().get_session(dbConn().get_engine())
     myBatches = session.query(
         models.batch).filter(models.batch.user_id == user_id)
     batches = myBatches.all()
     listBatch = []
     for curBatch in batches:
         exp = session.query(
             models.experiments).filter(models.experiments.resource_id ==
                                        curBatch.experiment_id).first()
         batchData = {}
         batchData['description'] = exp.description
         if (curBatch.rating is None):
             batchData['rating'] = -1
         else:
             batchData['rating'] = curBatch.rating
         listBatch.append(batchData)
     ret['batches'] = listBatch
     return apiDecorate(ret, 200, 'success')
Beispiel #21
0
    def updateExperiment(experiment_id):
        ret = {}
        session = dbConn().get_session(dbConn().get_engine())
        experiment = session.query(models.experiments).filter(
            models.experiments.id == experiment_id).first()
        if experiment is None:
            ret['errors'] = []
            ret['errors'].append("Invalid experiment id")
            return apiDecorate(ret, 400, ret['errors'][0])
        argArray = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)

        description = argArray.get("description")
        notifTime = argArray.get("notifTime")
        allocateTime = argArray.get("allocateTime")
        maxTime = argArray.get("maxTime")
        if (description == None or len(description) == 0):
            return apiDecorate(ret, 400, "Description cant be empty")

        if (maxTime is not None):
            try:
                if len(maxTime) == 0 or maxTime == 0:
                    maxTime = None
                else:
                    maxTime = int(maxTime)
            except:
                return apiDecorate(ret, 400, "Max time is not integer")

        if (notifTime is not None):
            try:
                if len(notifTime) == 0 or maxTime == 0:
                    notifTime = None
                else:
                    notifTime = int(notifTime)
            except:
                return apiDecorate(ret, 400,
                                   "Notification time is not integer")

        if (allocateTime is not None):
            try:
                if len(allocateTime) == 0 or maxTime == 0:
                    allocateTime = None
                else:
                    allocateTime = int(allocateTime)
            except:
                return apiDecorate(ret, 400, "Allocate time is not integer")

        if (notifTime is not None and max is None):
            return apiDecorate(
                ret, 400,
                "Allocation time needs to be specified if, notification time is specified"
            )

        if (notifTime is not None):
            if notifTime < 0 or notifTime > maxTime:
                return apiDecorate(ret, 400, "Notification time incorrect")

        content = "Experiment (" + experiment.title + "), has been changed." + "\n New instruction are  : " + description
        experiment.description = description
        experiment.notifTime = notifTime
        experiment.allocateTime = allocateTime
        experiment.maxTime = maxTime
        session.commit()
        session = dbConn().get_session(dbConn().get_engine())

        batches = session.query(
            models.batch).filter(models.batch.user_id != None).filter(
                models.batch.experiment_id == experiment.resource_id).all()
        if (len(batches) < 1):
            return apiDecorate(ret, 200, "Success")
        for batch in batches:
            user = session.query(
                models.User).filter(models.User.id == batch.user_id).first()
            notification.sendMail("*****@*****.**", user.email,
                                  "Experiment changed", "text/plain", content)
            notification.sendText(user.phone, content)
        return apiDecorate(ret, 200, "Success")
Beispiel #22
0
    def createExperiment(user_id):
        ret = {}
        argArray = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)

        dataset_id = argArray.get("dataset_id")
        if (dataset_id is None):
            ret['errors'] = []
            ret['errors'].append("Invalid dataset")
            return apiDecorate(ret, 400, "Invalid dataset")
        try:
            dataset_id = int(dataset_id)
        except:
            ret['errors'] = []
            ret['errors'].append("Invalid dataset")
            return apiDecorate(ret, 400, "Invalid dataset")

        # price, description, multiSelect=None
        session = dbConn().get_session(dbConn().get_engine())
        user = session.query(
            models.User).filter(models.User.id == user_id).first()

        if (user is None):
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        dataset = session.query(
            models.dataset).filter(models.dataset.id == dataset_id).first()

        if (dataset is None):
            ret['errors'] = []
            ret['errors'].append("Invalid dataset")
            return apiDecorate(ret, 400, "Invalid dataset")
        price = argArray.get('price')
        batchSize = argArray.get('batchSize')
        description = argArray.get('description')
        multiSelect = argArray.get('multiSelect')
        datasetType = argArray.get('datasetType')
        gender = argArray.get("gender")
        country = argArray.get("country")
        skill = argArray.get("skill")
        '''dt = argArray.get("deadline")'''
        maxTime = argArray.get("maxTime")
        notifTime = argArray.get("notifTime")
        allocateTime = argArray.get("allocateTime")
        title = argArray.get("title")

        if (maxTime is not None):
            try:
                if len(maxTime) == 0 or maxTime == 0:
                    maxTime = None
                else:
                    maxTime = int(maxTime)
            except:
                return apiDecorate(ret, 400, "Max time is not integer")

        if (notifTime is not None):
            try:
                if len(notifTime) == 0 or maxTime == 0:
                    notifTime = None
                else:
                    notifTime = int(notifTime)
            except:
                return apiDecorate(ret, 400,
                                   "Notification time is not integer")

        if (allocateTime is not None):
            try:
                if len(allocateTime) == 0 or maxTime == 0:
                    allocateTime = None
                else:
                    allocateTime = int(allocateTime)
            except:
                return apiDecorate(ret, 400, "Allocate time is not integer")

        if (notifTime is not None and maxTime is None):
            return apiDecorate(
                ret, 400,
                "Allocation time needs to be specified if, notification time is specified"
            )

        if (notifTime is not None):
            if notifTime < 0 or notifTime > maxTime:
                return apiDecorate(ret, 400, "Notification time incorrect")
        '''
        if(dt is not None):
            #deadline = datetime.datetime.strptime(dt, '%Y/%m/%d')
            deadline = datetime.strptime(dt, '%Y/%m/%d')
        else:
            deadline = None
        '''

        if (gender is not None and len(gender) < 1):
            gender = None
        if (country is not None and len(country) < 1):
            country = None
        if (skill is not None and len(skill) < 1):
            skill = 0
        else:
            try:
                skill = int(skill)
            except:
                skill = 0
        if (multiSelect is None):
            multiSelect = 1

        if ((price is None or len(price) <= 0)
                or (batchSize is None or len(batchSize) <= 0)
                or (description is None or len(description) <= 0)
                or (datasetType is None or len(datasetType) <= 0)
                or (title is None or len(title) == 0)):
            ret['errors'] = []
            ret['errors'].append("Parameters not set")
            return apiDecorate(ret, 400, "Parameters not set")
        try:
            batchSize = int(batchSize)
            price = float(price)
            datasetType = int(datasetType)
        except:
            ret['errors'] = []
            ret['errors'].append("price/batchSize not integer")
            return apiDecorate(ret, 400, "price/batchSize not integer")
        if (price < 0):
            ret['errors'] = []
            ret['errors'].append("Price less than 0")
            return apiDecorate(ret, 400, "Price less than 0")
        totalCost = batchSize * price
        if (user.balance < totalCost):
            ret['errors'] = []
            ret['errors'].append("Insufficient funds")
            return apiDecorate(ret, 400, "Insufficient funds")
        else:
            user.balance -= totalCost
        session.commit()
        randNum = randint(1, 10000)
        randNum2 = randint(1, 10000)
        randString = ''.join(
            random.choice('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
            for i in range(randint(10, 20)))
        timeStamp = datetime.now()
        randName = str(randNum) + str(timeStamp.year) + str(
            timeStamp.month) + randString + str(timeStamp.day) + str(
                timeStamp.hour) + str(timeStamp.minute) + str(
                    timeStamp.second) + str(randNum2)

        if (int(dataset.isMedia) != int(datasetType)):
            print int(dataset.isMedia)
            print datasetType
            ret['errors'] = []
            ret['errors'].append("Invalid dataset type and experiment type")
            return apiDecorate(ret, 400,
                               "Invalid dataset type and experiment type")

        batches = datasetHandler.makeBatches(dataset, batchSize)
        if (batches is None):
            ret['errors'] = []
            ret['errors'].append("Batch problems")
            return apiDecorate(ret, 400, "Batch problems")
        experiment = models.experiments(user.id, title, randName, price,
                                        len(batches), description, dataset.id,
                                        gender, country, skill, maxTime,
                                        notifTime, allocateTime)
        session.add(experiment)
        session.commit()
        botoConn = boto.connect_s3(datasetHandler.DREAM_key,
                                   datasetHandler.DREAM_secretKey,
                                   host="objects-us-west-1.dream.io")
        bucket = botoConn.get_bucket(datasetHandler.DREAM_Bucket,
                                     validate=False)
        batchCount = 0

        for batch in batches:
            batchJson = json.dumps(batch)
            k = Key(bucket)
            k.key = "e_" + randName + "/" + str(batchCount) + ".json"
            sent = k.set_contents_from_string(batchJson,
                                              cb=None,
                                              md5=None,
                                              reduced_redundancy=False)
            batch = models.batch(randName, batchCount, len(batch))
            batch.allocateTime = allocateTime or 0
            batch.price = price
            session.add(batch)
            session.commit()
            batchCount += 1

        k = Key(bucket)
        k.key = "e_" + randName + "/res.json"
        arr = []
        sent = k.set_contents_from_string(json.dumps(arr),
                                          cb=None,
                                          md5=None,
                                          reduced_redundancy=False)
        return apiDecorate(ret, 200, "Success")
Beispiel #23
0
    def uploadFile(user_id, datasetType):

        ret = {}
        argArray = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)
        user = userHandler().getUser(user_id)

        if user is None:
            ret['errors'] = []
            ret['errors'].append("User doesnt't exist/not logged in")
            return apiDecorate(ret, 400, "User doesnt't exist/not logged in")

        if 'file' not in request.files:
            ret['errors'] = []
            ret['errors'].append("File not supplied")
            return apiDecorate(ret, 400, "File not supplied")

        if (datasetType != 0 and datasetType != 1):
            ret['errors'] = []
            ret['errors'].append("Invalid Type")
            return apiDecorate(ret, 400, "Invalid Type")

        uploadedFile = request.files['file']

        if not uploadedFile:
            ret['errors'] = []
            ret['errors'].append("File not supplied")
            return apiDecorate(ret, 400, "File not supplied")

        if not fileHandler.allowed_file(uploadedFile.filename):
            ret['errors'] = []
            ret['errors'].append("File not supported")
            return apiDecorate(ret, 400, "File not supported")

        filename = secure_filename(uploadedFile.filename)
        randNum = randint(1, 10000)
        randNum2 = randint(1, 10000)
        randString = ''.join(
            random.choice('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
            for i in range(randint(10, 20)))
        timeStamp = datetime.now()
        randName_noext = str(randNum) + str(timeStamp.year) + str(
            timeStamp.month) + randString + str(timeStamp.day) + str(
                timeStamp.hour) + str(timeStamp.minute) + str(
                    timeStamp.second) + str(randNum2)
        randName = randName_noext
        storageLocation = os.path.join(fileHandler.UPLOAD_FOLDER, randName)
        uploadedFile.save(storageLocation)

        fileSize = os.stat(storageLocation).st_size

        if (not zipfile.is_zipfile(storageLocation)):
            ret['errors'] = []
            ret['errors'].append("Invalid File, File not a valid zip file")
            return apiDecorate(ret, 400, "Invalid File")

        zipF = zipfile.ZipFile(storageLocation)
        if (datasetType == 0):
            fileArr = fileHandler.jsonFile(zipF)
        else:
            fileArr = fileHandler.imgFile(zipF)
        if (fileArr is None):
            ret['errors'] = []
            ret['errors'].append(
                "Zip file empty or contains invalid/incompatible files")
            return apiDecorate(ret, 400, "Zip file empty")
        botoConn = boto.connect_s3(fileHandler.DREAM_key,
                                   fileHandler.DREAM_secretKey,
                                   host="objects-us-west-1.dream.io")
        bucket = botoConn.get_bucket(fileHandler.DREAM_Bucket, validate=False)

        for file in fileArr:
            k = Key(bucket)
            k.key = randName + "/" + file['name']
            sent = k.set_contents_from_string(file['fileByte'],
                                              cb=None,
                                              md5=None,
                                              reduced_redundancy=False)
            print len(file['fileByte'])
            print sent

        data = models.dataset(user_id=user_id,
                              isMedia=datasetType,
                              resource_id=randName)
        data.title = argArray.get("dataset_title") or "No Title Given"
        session = dbConn().get_session(dbConn().get_engine())
        session.add(data)
        session.commit()
        return apiDecorate(ret, 200, "Verified")
Beispiel #24
0
    def register(self):
        ret = {}
        if request.method == "GET":
            argArray = request.args
        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)

        firstName = argArray.get("firstname")
        lastName = argArray.get("lastname")
        email = argArray.get("email")
        phone = argArray.get("phone")
        password = argArray.get("password")
        gender = argArray.get("gender")
        country = argArray.get("country")
        skill = argArray.get("skill")

        user = models.User(first_name=firstName,
                           last_name=lastName,
                           password=password,
                           email=email,
                           phone=phone,
                           gender=gender,
                           country=country,
                           skill=skill)

        if len(user.errors) > 0:
            ret['errors'] = user.errors
            return apiDecorate(ret, 400,
                               "Invalid and/or incomplete data specified")
            return apiDecorate(ret)

        session = dbConn().get_session(dbConn().get_engine())
        checkUser = session.query(
            models.User).filter(models.User.email == email).first()
        if (checkUser is not None):
            ret['errors'] = []
            ret['errors'].append("User already exists")
            return apiDecorate(ret, 400, "User already exists")

        session.add(user)
        session.commit()

        ## Generate email key
        randNum = randint(1, 10000)
        randNum2 = randint(1, 10000)
        timeStamp = datetime.now()
        emailKey = str(randNum) + str(timeStamp.year) + str(
            timeStamp.month) + str(timeStamp.day) + str(timeStamp.hour) + str(
                timeStamp.minute) + str(timeStamp.second) + "_" + str(randNum2)
        contentText = "Go to the link to verify " + "http://datonate.com:5000/api/verify/email/" + emailKey

        res = notification.sendMail(fromEmail="*****@*****.**",
                                    toEmail=user.email,
                                    subject="Confirm your account",
                                    contentType="text/plain",
                                    content=contentText)
        print(res)
        ## Generate Phone key

        randNum = randint(1, 10000)
        randNum2 = randint(1, 10000)
        timeStamp = datetime.now()
        phoneKey = str(randNum) + str(timeStamp.year) + str(
            timeStamp.month) + str(timeStamp.day) + str(timeStamp.hour) + str(
                timeStamp.minute) + str(
                    timeStamp.second) + "__" + str(randNum2)
        textContent = "Go to the link to verify " + "http://datonate.com:5000/api/verify/phone/" + phoneKey
        message = notification.sendText(user.phone, textContent)
        regUser = session.query(
            models.User).filter(models.User.email == user.email).first()

        userValidate = models.user_validate(regUser.id, emailKey, phoneKey)
        session.add(userValidate)
        session.commit()

        return apiDecorate(ret, 200, "User Added")
Beispiel #25
0
    def getExperiments(user_id):
        ret = {}
        argArray = {}
        if request.method == "GET":
            argArray = request.args

        elif request.method == "POST":
            if (len(request.form) > 0):
                argArray = request.form
            else:
                print request.get_data()
                argArray = json.loads(request.data)
        sort = argArray.get("sort")
        levelFilter = argArray.get("education")
        if (levelFilter is not None and len(str(levelFilter)) < 0):
            levelFilter = None
        if (levelFilter is not None):
            try:
                levelFilter = int(levelFilter)
            except:
                levelFilter = None
        session = dbConn().get_session(dbConn().get_engine())
        user = session.query(
            models.User).filter(models.User.id == user_id).first()
        if (user is None):
            ret['errors'] = []
            ret['errors'].append("Invalid User")
            return apiDecorate(ret, 400, "Invalid User")

        ret = {}
        if (sort == "compensation"):
            batches = session.query(models.batch.experiment_id).filter(
                models.batch.user_id == None).order_by(
                    models.batch.price).group_by(models.batch.price).group_by(
                        models.batch.experiment_id).all()
        if (sort == "time"):
            batches = session.query(models.batch.experiment_id).filter(
                models.batch.user_id == None).order_by(
                    models.batch.allocateTime).group_by(
                        models.batch.allocateTime).group_by(
                            models.batch.experiment_id).all()

        else:
            batches = session.query(models.batch.experiment_id).filter(
                models.batch.user_id == None).distinct(
                    models.batch.experiment_id).all()
        experiments = []
        for batch in batches:
            experiment = session.query(models.experiments).filter(
                models.experiments.resource_id == batch[0]).first()
            if ((experiment.gender != None
                 and experiment.gender != user.gender)
                    or (experiment.country != None
                        and experiment.country != user.country)
                    or (user.skill < experiment.skill) or
                (levelFilter is not None and experiment.skill != levelFilter)
                    or (experiment.isPaused != 0)):
                print "User skill " + str(
                    user.skill) + "experiment.skill " + str(
                        experiment.skill) + "\n"
                continue
            datas = session.query(models.dataset).filter(
                models.dataset.id == experiment.dataset_id).first()
            tempExperiment = {}
            tempExperiment['id'] = experiment.id
            tempExperiment['price'] = experiment.price
            tempExperiment['description'] = experiment.description
            tempExperiment['isMedia'] = datas.isMedia
            tempExperiment['allocate'] = experiment.allocateTime or 0
            experiments.append(tempExperiment)

        ret['experiments'] = experiments
        return apiDecorate(ret, 200, "Success")