예제 #1
0
    def write_to_db(self, user, tag, publication, actual_days_range=100):
        db_user, db_user_created = get_or_create(self.db_session,
                                                 User,
                                                 instagram_pk=user['pk'])
        if db_user_created or db_user.last_modified==None \
                or (self.today - db_user.last_modified.date() > datetime.timedelta(days=actual_days_range)):
            db_user.username = user['username']
            db_user.full_name = user['full_name']
            db_user.followers = get_browser_followers(user['username'])
            print('Создание/Обновление пользователя: %s %s %s\n' %
                  (db_user.username, db_user.full_name, db_user.followers))

        db_publication, db_publication_created = get_or_create(
            self.db_session, Publication, instagram_pk=publication['pk'])
        if db_publication_created:
            db_publication.user_id = db_user.id

        if db_publication.last_modified==None \
                or (self.today - db_publication.last_modified.date() > datetime.timedelta(days=actual_days_range)):
            db_publication.like_count = publication['like_count']
            db_publication.link_code = publication['code']
            db_publication.device_timestamp = datetime.datetime.fromtimestamp(
                int(str(publication['device_timestamp'])[:10]))
            print('Создание/Обновление публикации: %s %s %s\n' %
                  (db_publication.link_code, db_user.full_name,
                   db_publication.like_count))

        db_tag, db_tag_created = get_or_create(self.db_session, Tag, name=tag)
        if db_tag_created:
            db_tag.publications.append(db_publication)
            print('Создание тега: %s' % tag)

        self.db_session.commit()
예제 #2
0
def get_or_create_transaction(message):
    defaults = make_transaction_defaults(message)
    transaction, is_created = get_or_create(session,
                                            Transaction,
                                            defaults=defaults,
                                            uuid=message["transaction_id"])
    return transaction, is_created
예제 #3
0
def create_task(session, task_name, tag_names=[], project_name=None):
     """

    Args: session:sqlalchemy session object
           task_name:string
           tag_names:list of strings
           project_name:string

     Returns: task object
     """
     task = Tasks(task_name)
     if tag_names:
        for tag_name in tag_names:
            tag = get_or_create(session, Tags, tag_name)
            assert tag != None
            task.tags.append(tag)

     if project_name:
        project = get_or_create(session, Projects, project_name)
        task.project = project

     return task
예제 #4
0
def create_task(session, task_name, tag_names=[], project_name=None):
    """

    Args: session:sqlalchemy session object
           task_name:string
           tag_names:list of strings
           project_name:string

     Returns: task object
     """
    task = Tasks(task_name)
    if tag_names:
        for tag_name in tag_names:
            tag = get_or_create(session, Tags, tag_name)
            assert tag != None
            task.tags.append(tag)

    if project_name:
        project = get_or_create(session, Projects, project_name)
        task.project = project

    return task
예제 #5
0
def process_raw_message(raw_message):
    message = get_message_from_raw(raw_message)

    try:
        transaction, is_created = get_or_create_transaction(message)
    except InvalidTransactionMessage:
        return

    if not is_created:
        # We don't care about what status is the existing transaction is in.
        # It is a problem if it already exists.
        logger.error("Transaction <%s> already exists, skipping",
                     transaction.uuid)
        return

    storage, is_created = get_or_create(session,
                                        Storage,
                                        store_id=transaction.store_id,
                                        item_id=transaction.item_id,
                                        defaults={"stock": 0})
    process_transaction(transaction, storage)
    session.commit()
예제 #6
0
def update(session_id=None):
    """ Sync backbone model with appropriate database.  """

    current_app.logger.info("PUT /sync route with id: %s" % session_id)
    resp = None

    try:
        session = Session.query.filter_by(session_id=session_id).one()
    except SQLAlchemyError:
        resp = {"status": "bad request"}
        current_app.logger.error("DB error: Unique user not found.")

    # Check JSON validity
    if utils.check_valid_json(request.get_data()):
        valid_json = json.loads(request.get_data())
    else:
        resp = {"status": "bad request"}
        current_app.logger.error("Invalid JSON")

    current_app.logger.info(
        "Current trial: %s, session id: %s " %
        (valid_json['currenttrial'], valid_json['sessionid']))

    # For each trial, pass to appropriate parser, if not in db
    for json_trial in valid_json['data']:
        if session.exp_name == "category_switch":
            experiment_class = CategorySwitch
        elif session.exp_name == "keep_track":
            experiment_class = KeepTrack

        db_trial, new = db_utils.get_or_create(
            db.session,
            experiment_class,
            token=session.token,
            session_id=session.session_id,
            trial_num=json_trial['current_trial'])

        # If the trial is new, add data
        if new:
            db_trial.add_json_data(json_trial)
            db.session.commit()

    # For each event, pass to parser, if not in db
    for json_event in valid_json['eventdata']:
        db_event, new = db_utils.get_or_create(
            db.session,
            EventData,
            token=session.token,
            session_id=session.session_id,
            exp_name=session.exp_name,
            timestamp=utils.convert_timestamp(json_event['timestamp']))

        if new:
            db_event.add_json_data(json_event)
            db.session.commit()

    if valid_json['questiondata'] != {}:
        # For the QuestionData, pass to parser, if not in db
        db_ques, new = db_utils.get_or_create(db.session,
                                              QuestionData,
                                              token=session.token,
                                              session_id=session.session_id,
                                              exp_name=session.exp_name)
        db_ques.add_json_data(valid_json['questiondata'])
        db.session.commit()

    if resp is None:
        resp = {"status": "success"}

    return jsonify(**resp)
예제 #7
0
def start_exp():
    """ Serves up the experiment applet. 
    If experiment is ongoing or completed, will not serve. 

    Querystring args (required):
    uniqueid: External gfg_id
    surveyid: Which experiment to serve
    """

    browser, platform = utils.check_browser_platform(request.user_agent)

    # Check query string
    if not utils.check_qs(request.args, ['uniqueid', 'surveyid']):
        raise ExperimentError('improper_inputs')
    else:
        uniqueid = request.args['uniqueid']
        survey_id = request.args['surveyid']
        exp_name = experiment_list[
            request.args['surveyid']]  # Survey id to experiment name

    # Decrypt encocded uniqueid
    gfg_id = utils.decrypt(str(current_app.config['SECRET_KEY']),
                           str(uniqueid).decode('string-escape'))

    # Check if user exists in main gfg db
    if not db_utils.gfg_user_exists(gfg_id,
                                    current_app.config['RESEARCH_DB_HOST'],
                                    current_app.config['RESEARCH_DB_USER'],
                                    current_app.config['RESEARCH_DB_PASSWORD'],
                                    current_app.config['RESEARCH_DB_NAME']):
        raise ExperimentError('user_access_denied')

    # Check if user is in Participant table, if not add & commit
    user, new_user = db_utils.get_or_create(db.session,
                                            Participant,
                                            gfg_id=gfg_id)

    current_app.logger.info(
        "Subject: %s entered with %s platform and %s browser" %
        (gfg_id, platform, browser))

    # If any existing sessions disqualify user (ongoing or completed), throw error
    # Otherwise, create new session and serve experiment
    disqualifying_sessions = Session.query.filter_by(gfg_id=gfg_id,
                                                     exp_name=exp_name,
                                                     status=3).first()
    if disqualifying_sessions and current_app.config['EXP_DEBUG'] == False:
        raise ExperimentError('already_did_exp',
                              session_id=disqualifying_sessions.session_id)

    # Otherwise, allow participant to re-enter
    else:
        session = Session(gfg_id=gfg_id,
                          browser=browser,
                          platform=platform,
                          status=1,
                          exp_name=exp_name,
                          begin_session=datetime.datetime.now())
        db.session.add(session)
        db.session.commit()

        return render_template(exp_name + "/exp.html",
                               experimentname=exp_name,
                               surveyid=survey_id,
                               sessionid=session.session_id,
                               debug=current_app.config['EXP_DEBUG'],
                               uniqueid=urllib.quote(uniqueid))
예제 #8
0
def update(session_id=None):
    """ Sync backbone model with appropriate database.  """

    current_app.logger.info("PUT /sync route with id: %s" % session_id)
    resp = None

    try:
        session = Session.query.filter_by(session_id=session_id).one()
    except SQLAlchemyError:
        resp = {"status": "bad request"}
        current_app.logger.error("DB error: Unique user not found.")

    # Check JSON validity
    if utils.check_valid_json(request.get_data()):
        valid_json = json.loads(request.get_data())
    else:
        resp = {"status": "bad request"}
        current_app.logger.error("Invalid JSON")

    current_app.logger.info(
        "Current trial: %s, session id: %s " %
        (valid_json['currenttrial'], valid_json['sessionid']))

    ## JAKE: This needs to be slightly customized to add your task
    ## However, most of the work will be in models.py
    # For each trial, pass to appropriate parser, if not in db
    for json_trial in valid_json['data']:
        if session.exp_name == "category_switch":
            experiment_class = CategorySwitch
        elif session.exp_name == "keep_track":
            experiment_class = KeepTrack
        elif session.exp_name == 'BART':
            experiment_class = BART

        db_trial, new = db_utils.get_or_create(
            db.session,
            experiment_class,
            gfg_id=session.gfg_id,
            session_id=session.session_id,
            trial_num=json_trial['current_trial'])

        # If the trial is new, add data
        if new:
            db_trial.add_json_data(json_trial)
            db.session.commit()

    ## JAKE: this part is for recording events that dataHandler (i.e. psiTurk),
    ## tracks, automatically
    # For each event, pass to parser, if not in db
    for json_event in valid_json['eventdata']:
        db_event, new = db_utils.get_or_create(
            db.session,
            EventData,
            gfg_id=session.gfg_id,
            session_id=session.session_id,
            exp_name=session.exp_name,
            timestamp=utils.convert_timestamp(json_event['timestamp']))

        if new:
            db_event.add_json_data(json_event)
            db.session.commit()

    ## JAKE: Don't worry about this now, you won't have any question data
    if valid_json['questiondata'] != {}:
        # For the QuestionData, pass to parser, if not in db
        db_ques, new = db_utils.get_or_create(db.session,
                                              QuestionData,
                                              gfg_id=session.gfg_id,
                                              session_id=session.session_id,
                                              exp_name=session.exp_name)
        db_ques.add_json_data(valid_json['questiondata'])
        db.session.commit()

    if resp is None:
        resp = {"status": "success"}

    return jsonify(**resp)