Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# if there are one or more participants select the most recent
if participants:
participant = max(participants, key=attrgetter("creation_time"))
# if there are none print an error
else:
exp.log(
"Warning: No participants associated with this "
"assignment_id. Notification will not be processed.",
key,
)
return None
elif participant_id is not None:
participant = models.Participant.query.filter_by(id=participant_id).all()[0]
else:
raise ValueError(
"Error: worker_function needs either an assignment_id or a "
"participant_id, they cannot both be None"
)
participant_id = participant.id
runner = runner_cls(
participant, assignment_id, exp, db.session, _config(), datetime.now()
)
runner()
db.session.commit()
def check_for_duplicate_assignments(participant):
"""Check that the assignment_id of the participant is unique.
If it isnt the older participants will be failed.
"""
participants = models.Participant.query.filter_by(
assignment_id=participant.assignment_id).all()
duplicates = [p for p in participants if (p.id != participant.id and
p.status == "working")]
for d in duplicates:
q.enqueue(worker_function, "AssignmentAbandoned", None, d.id)
def summary():
"""Summarize the participants' status codes."""
state = {
"status": "success",
"summary": Experiment(session).log_summary(),
"completed": False,
}
unfilled_nets = models.Network.query.filter(
models.Network.full != true()
).with_entities(models.Network.id, models.Network.max_size).all()
working = models.Participant.query.filter_by(
status='working'
).with_entities(func.count(models.Participant.id)).scalar()
state['unfilled_networks'] = len(unfilled_nets)
nodes_remaining = 0
required_nodes = 0
if state['unfilled_networks'] == 0:
if working == 0:
state['completed'] = True
else:
for net in unfilled_nets:
node_count = models.Node.query.filter_by(
network_id=net.id
).with_entities(func.count(models.Node.id)).scalar()
net_size = net.max_size
required_nodes += net_size
nodes_remaining += net_size - node_count
def create_participant(worker_id, hit_id, assignment_id, mode):
"""Create a participant.
This route is hit early on. Any nodes the participant creates will be
defined in reference to the participant object. You must specify the
worker_id, hit_id, assignment_id, and mode in the url.
"""
already_participated = models.Participant.query.\
filter_by(worker_id=worker_id).one_or_none()
if already_participated:
db.logger.warning("Worker has already participated.")
return error_response(
error_type="/participant POST: worker has already participated.",
status=403)
duplicate = models.Participant.query.\
filter_by(
assignment_id=assignment_id,
status="working")\
.one_or_none()
if duplicate:
msg = """
def check_db_for_missing_notifications():
"""Check the database for missing notifications."""
aws_access_key_id = config.get('aws_access_key_id')
aws_secret_access_key = config.get('aws_secret_access_key')
host_by_sandbox_setting = {
"debug": 'mechanicalturk.sandbox.amazonaws.com',
"sandbox": 'mechanicalturk.sandbox.amazonaws.com',
"live": 'mechanicalturk.amazonaws.com'
}
mturk = MTurkConnection(
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
host=host_by_sandbox_setting[config.get('mode')])
# get all participants with status < 100
participants = Participant.query.filter_by(status="working").all()
reference_time = datetime.now()
run_check(config, mturk, participants, session, reference_time)
"""Create a participant.
This route is hit early on. Any nodes the participant creates will be
defined in reference to the participant object. You must specify the
worker_id, hit_id, assignment_id, and mode in the url.
"""
already_participated = models.Participant.query.\
filter_by(worker_id=worker_id).one_or_none()
if already_participated:
db.logger.warning("Worker has already participated.")
return error_response(
error_type="/participant POST: worker has already participated.",
status=403)
duplicate = models.Participant.query.\
filter_by(
assignment_id=assignment_id,
status="working")\
.one_or_none()
if duplicate:
msg = """
AWS has reused assignment_id while existing participant is
working. Replacing older participant {}.
"""
app.logger.warning(msg.format(duplicate.id))
q.enqueue(worker_function, "AssignmentReassigned", None, duplicate.id)
# Create the new participant.
participant = models.Participant(
worker_id=worker_id,
try:
fingerprint_found = models.Participant.query.filter_by(
fingerprint_hash=fingerprint_hash
).one_or_none()
except MultipleResultsFound:
fingerprint_found = True
if fingerprint_hash and fingerprint_found:
db.logger.warning("Same browser fingerprint detected.")
if mode == "live":
return error_response(
error_type="/participant POST: Same participant dectected.", status=403
)
already_participated = models.Participant.query.filter_by(
worker_id=worker_id
).one_or_none()
if already_participated:
db.logger.warning("Worker has already participated.")
return error_response(
error_type="/participant POST: worker has already participated.", status=403
)
duplicate = models.Participant.query.filter_by(
assignment_id=assignment_id, status="working"
).one_or_none()
if duplicate:
msg = """
AWS has reused assignment_id while existing participant is
if mode == "live":
return error_response(
error_type="/participant POST: Same participant dectected.", status=403
)
already_participated = models.Participant.query.filter_by(
worker_id=worker_id
).one_or_none()
if already_participated:
db.logger.warning("Worker has already participated.")
return error_response(
error_type="/participant POST: worker has already participated.", status=403
)
duplicate = models.Participant.query.filter_by(
assignment_id=assignment_id, status="working"
).one_or_none()
if duplicate:
msg = """
AWS has reused assignment_id while existing participant is
working. Replacing older participant {}.
"""
app.logger.warning(msg.format(duplicate.id))
q.enqueue(worker_function, "AssignmentReassigned", None, duplicate.id)
# Count working or beyond participants.
nonfailed_count = (
models.Participant.query.filter(
(models.Participant.status == "working")
| (models.Participant.status == "overrecruited")