def load_fixtures(): """Load some fixture data into the database.""" from maproulette.models import Task, Challenge, User from random import randrange, random # Create a user u = User() u.osm_id = 8909 u.osm_username = '******' session.add(u) for x in range(1, 11): c = Challenge() c.name = "Challenge {}".format(x) c.instruction = "Challenge {} Instruction".format(x) session.add(c) for x in range(1, 10000): t = Task() t.challenge_id = randrange(1, 11) t.geometry = 'POINT({lon} {lat})'.format(lon=random() * 360 - 180, lat=random() * 180 - 90) session.add(t) session.commit()
def put(self, slug): exists = challenge_exists(slug) try: payload = json.loads(request.data) except Exception: abort(400, "JSON bad") if not exists and 'title' not in payload: abort(400, "No title") return {} if exists: app.logger.debug('challenge existed, retrieving') c = get_challenge_or_404(slug, abort_if_inactive=False) if 'title' in payload: c.title = payload.get('title') else: c = Challenge(slug, payload.get('title')) if 'geometry' in payload: c.geometry = payload.get('geometry') if 'description' in payload: c.description = payload.get('description') if 'blurb' in payload: c.blurb = payload.get('blurb') if 'help' in payload: c.help = payload.get('help') if 'instruction' in payload: c.instruction = payload.get('instruction') if 'active' in payload: c.active = payload.get('active') if 'difficulty' in payload: c.difficulty = payload.get('difficulty') db.session.add(c) db.session.commit() return {}
def post(self, slug): if challenge_exists(slug): abort(409, 'This challenge already exists') if not re.match("^[\w\d_-]+$", slug): abort(400, 'slug should contain only a-z, A-Z, 0-9, _, -') try: payload = json.loads(request.data) except Exception: abort(400, "JSON bad") if 'title' not in payload: abort(400, "new challenge must have title") c = Challenge(slug, payload.get('title')) if 'title' in payload: c.title = payload.get('title') if 'geometry' in payload: c.geometry = payload.get('geometry') if 'description' in payload: c.description = payload.get('description') if 'blurb' in payload: c.blurb = payload.get('blurb') if 'help' in payload: c.help = payload.get('help') if 'instruction' in payload: c.instruction = payload.get('instruction') if 'active' in payload: c.active = payload.get('active') if 'difficulty' in payload: c.difficulty = payload.get('difficulty') db.session.add(c) try: db.session.commit() except Exception as e: if type(e) == IntegrityError: app.logger.warn(e.message) db.session.rollback() abort( 409, 'the session and the database did not agree: {}'.format( e.message)) else: app.logger.warn(e.message) abort(500, 'something unexpected happened') return {}, 201
def post(self, slug): payload = None if challenge_exists(slug): app.logger.debug('The challenge already exists') abort(409, message='This challenge already exists.') if not re.match("^[\w\d_-]+$", slug): app.logger.debug('The challenge slug should contain only a-z, A-Z, 0-9, _, -') abort(400, message='The challenge slug should contain only a-z, A-Z, 0-9, _, -') try: payload = json.loads(request.data) except Exception as e: app.logger.debug('POST request does not have a JSON payload') app.logger.debug(request.data) abort(400, message=e) if 'title' not in payload: app.logger.debug('A new challenge must have title') abort(400, message="A new challenge must have title") c = Challenge(slug, payload.get('title')) c.title = payload.get('title') c.geometry = payload.get('geometry') c.description = payload.get('description') c.blurb = payload.get('blurb') c.help = payload.get('help') c.instruction = payload.get('instruction') c.active = payload.get('active') c.difficulty = payload.get('difficulty') c.options = payload.get('options') db.session.add(c) try: db.session.commit() except Exception as e: if type(e) == IntegrityError: app.logger.warn(e) db.session.rollback() abort(409, message='The session and the database did not agree for challenge {slug}: {message}'.format(slug=c.slug, message=e)) else: app.logger.warn(e) abort(500, message=message_internal_server_error) return {}, 201
def load_sampledata(path): identifier = 0 tasks = [] actions = [] c = Challenge('test') c.title = 'Just a test challenge' with open(path, 'rb') as filehandle: q = json.load(filehandle) for feature in q['features']: identifier += 1 coordinates = feature['geometry']['coordinates'] shape = Point(coordinates[0], coordinates[1]) properties = feature['properties'] t = Task('test',identifier) t.location = dumps(shape) t.run = 1 a = Action(t.id, "created") tasks.append(t) print tasks feedengine = create_engine('postgresql://*****:*****@localhost/maproulette') Session = sessionmaker(bind=feedengine) session = Session() session.add(c) session.commit() for t in tasks: session.add(t) for a in actions: session.add(a) c.active = True session.commit()
def post(self, slug): if challenge_exists(slug): abort(409, 'This challenge already exists') if not re.match("^[\w\d_-]+$", slug): abort(400, 'slug should contain only a-z, A-Z, 0-9, _, -') try: payload = json.loads(request.data) except Exception: abort(400, "JSON bad") if 'title' not in payload: abort(400, "new challenge must have title") c = Challenge(slug, payload.get('title')) if 'title' in payload: c.title = payload.get('title') if 'geometry' in payload: c.geometry = payload.get('geometry') if 'description' in payload: c.description = payload.get('description') if 'blurb' in payload: c.blurb = payload.get('blurb') if 'help' in payload: c.help = payload.get('help') if 'instruction' in payload: c.instruction = payload.get('instruction') if 'active' in payload: c.active = payload.get('active') if 'difficulty' in payload: c.difficulty = payload.get('difficulty') db.session.add(c) try: db.session.commit() except Exception as e: if type(e) == IntegrityError: app.logger.warn(e.message) db.session.rollback() abort(409, 'the session and the database did not agree: {}'.format(e.message)) else: app.logger.warn(e.message) abort(500, 'something unexpected happened') return {}, 201
def create_testdata(challenges=10, tasks=100, users=10): """Creates test data in the database""" import uuid import random from maproulette import db from maproulette.models import User, Challenge, Task, TaskGeometry, Action from shapely.geometry import Point, LineString, box # statuses to use statuses = ['available', 'skipped', 'fixed', 'deleted', 'alreadyfixed', 'falsepositive'] # challenge default strings challenge_help_test = "Sample challenge *help* text" challenge_instruction_test = "Challenge instruction text" task_instruction_text = "Task instruction text" # delete old tasks and challenges db.session.query(TaskGeometry).delete() db.session.query(Action).delete() db.session.query(Task).delete() db.session.query(Challenge).delete() db.session.query(User).delete() db.session.commit() # create users for uid in range(int(users)): user = User() user.id = uid user.display_name = 'Test User {uid}'.format(uid=uid) db.session.add(user) db.session.commit() # create ten challenges for i in range(1, int(challenges) + 1): print "Generating Test Challenge #%d" % i minx = -120 maxx = -40 miny = 20 maxy = 50 challengepoly = None slug = "test%d" % i title = "Test Challenge %d" % i challenge = Challenge(slug, title) challenge.difficulty = random.choice([1, 2, 3]) challenge.active = True challenge.blurb = "This is test challenge number %d" % i challenge.description = "This describes challenge %d in detail" % i challenge.help = challenge_help_test challenge.instruction = challenge_instruction_test # have bounding boxes for all but the first two challenges. if i > 2: minx = random.randrange(-120, -40) miny = random.randrange(20, 50) maxx = minx + 1 maxy = miny + 1 challengepoly = box(minx, miny, maxx, maxy) print "\tChallenge has a bounding box of ", challengepoly challenge.polygon = challengepoly db.session.add(challenge) # add some tasks to the challenge print "\tGenerating %i tasks for challenge %i" % (int(tasks), i) # generate NUM_TASKS random tasks for j in range(int(tasks)): # generate a unique identifier identifier = str(uuid.uuid4()) # create two random points not too far apart task_geometries = [] p1 = Point( random.randrange(minx, maxx) + random.random(), random.randrange(miny, maxy) + random.random()) p2 = Point( p1.x + (random.random() * random.choice((1, -1)) * 0.01), p1.y + (random.random() * random.choice((1, -1)) * 0.01)) # create a linestring connecting the two points # no constructor for linestring from points? l1 = LineString([(p1.x, p1.y), (p2.x, p2.y)]) # add the first point and the linestring to the task's geometries task_geometries.append(TaskGeometry(p1)) # set a linestring for every other challenge if not j % 2: task_geometries.append(TaskGeometry(l1)) # instantiate the task and register it with challenge 'test' # Initialize a task with its challenge slug and persistent ID task = Task(challenge.slug, identifier, task_geometries) # because we are not using the API, we need to call set_location # explicitly to set the task's location task.set_location() # generate random string for the instruction task.instruction = task_instruction_text # set a status action = Action(random.choice(statuses), user_id=random.choice(range(int(users)))) task.append_action(action) # add the task to the session db.session.add(task) # commit the generated tasks and the challenge to the database. db.session.commit()
# delete old tasks and challenges db.session.query(TaskGeometry).delete() db.session.query(Action).delete() db.session.query(Task).delete() db.session.query(Challenge).delete() db.session.commit() for i in range(NUM_CHALLENGES): print "Generating Test Challenge #", i minx = -120 maxx = -40 miny = 20 maxy = 50 challengepoly = None challenge = Challenge('test%i' % (i + 1)) challenge.title = 'Test Challenge %i' % (i + 1) challenge.difficulty = random.choice([1, 2, 3]) challenge.active = True challenge.blurb = 'This is test challenge number %i' % (i + 1, ) challenge.description = 'This describes test challenge number %i in more detail' % (i + 1, ) challenge.help = words challenge.instruction = words2 # have bounding boxes for all but the first two challenges. if i > 1: minx = random.randrange(-120, -40) miny = random.randrange(20, 50) maxx = minx + 1 maxy = miny + 1 challengepoly = box(minx, miny, maxx, maxy) print "\tChallenge has a bounding box of ", challengepoly
def create_testdata(challenges=10, tasks=100, users=10): """Creates test data in the database""" import uuid import random from maproulette import db from maproulette.models import User, Challenge, Task, TaskGeometry, Action from shapely.geometry import Point, LineString, box # statuses to use statuses = ['available', 'skipped', 'fixed', 'deleted', 'alreadyfixed', 'falsepositive'] # challenge default strings challenge_help_test = "Sample challenge *help* text" challenge_instruction_test = "Challenge instruction text" task_instruction_text = "Task instruction text" # delete old tasks and challenges db.session.query(TaskGeometry).delete() db.session.query(Action).delete() db.session.query(Task).delete() db.session.query(Challenge).delete() db.session.query(User).delete() db.session.commit() # create users for uid in range(int(users)): user = User() user.id = uid user.display_name = 'Test User {uid}'.format(uid=uid) db.session.add(user) db.session.commit() # create ten challenges for i in range(1, int(challenges) + 1): print "Generating Test Challenge #%d" % i minx = -120 maxx = -40 miny = 20 maxy = 50 challengepoly = None slug = "test%d" % i title = "Test Challenge %d" % i challenge = Challenge(slug, title) challenge.difficulty = random.choice([1, 2, 3]) challenge.active = True challenge.blurb = "This is test challenge number %d" % i challenge.description = "This describes challenge %d in detail" % i challenge.help = challenge_help_test challenge.instruction = challenge_instruction_test # have bounding boxes for all but the first two challenges. if i > 2: minx = random.randrange(-120, -40) miny = random.randrange(20, 50) maxx = minx + 1 maxy = miny + 1 challengepoly = box(minx, miny, maxx, maxy) print "\tChallenge has a bounding box of ", challengepoly challenge.polygon = challengepoly db.session.add(challenge) # add some tasks to the challenge print "\tGenerating %i tasks for challenge %i" % (int(tasks), i) # generate NUM_TASKS random tasks for j in range(int(tasks)): # generate a unique identifier identifier = str(uuid.uuid4()) # create two random points not too far apart task_geometries = [] p1 = Point( random.randrange(minx, maxx) + random.random(), random.randrange(miny, maxy) + random.random()) p2 = Point( p1.x + (random.random() * random.choice((1, -1)) * 0.01), p1.y + (random.random() * random.choice((1, -1)) * 0.01)) # create a linestring connecting the two points # no constructor for linestring from points? l1 = LineString([(p1.x, p1.y), (p2.x, p2.y)]) # generate some random 'osm ids' osmids = [random.randrange(1000000, 1000000000) for _ in range(2)] # add the first point and the linestring to the task's geometries task_geometries.append(TaskGeometry(osmids[0], p1)) # set a linestring for every other challenge if not j % 2: task_geometries.append(TaskGeometry(osmids[1], l1)) # instantiate the task and register it with challenge 'test' # Initialize a task with its challenge slug and persistent ID task = Task(challenge.slug, identifier, task_geometries) # because we are not using the API, we need to call set_location # explicitly to set the task's location task.set_location() # generate random string for the instruction task.instruction = task_instruction_text # set a status action = Action(random.choice(statuses), user_id=random.choice(range(int(users)))) task.append_action(action) # add the task to the session db.session.add(task) # commit the generated tasks and the challenge to the database. db.session.commit()
def post(self, slug): payload = None if challenge_exists(slug): app.logger.debug('The challenge already exists') abort(409, message='This challenge already exists.') if not re.match("^[\w\d_-]+$", slug): app.logger.debug('The challenge slug should contain only a-z, A-Z, 0-9, _, -') abort(400, message='The challenge slug should contain only a-z, A-Z, 0-9, _, -') try: payload = json.loads(request.data) except Exception as e: app.logger.debug('POST request does not have a JSON payload') app.logger.debug(request.data) abort(400, message=e.message) if 'title' not in payload: app.logger.debug('A new challenge must have title') abort(400, message="A new challenge must have title") c = Challenge(slug, payload.get('title')) c.title = payload.get('title') c.geometry = payload.get('geometry') c.description = payload.get('description') c.blurb = payload.get('blurb') c.help = payload.get('help') c.instruction = payload.get('instruction') c.active = payload.get('active') c.difficulty = payload.get('difficulty') c.options = payload.get('options') db.session.add(c) try: db.session.commit() except Exception as e: if type(e) == IntegrityError: app.logger.warn(e.message) db.session.rollback() abort(409, message='The session and the database did not agree for challenge {slug}: {message}'.format(slug=c.slug, message=e.message)) else: app.logger.warn(e.message) abort(500, message=message_internal_server_error) return {}, 201
def create_testdata(): """Creates test data in the database""" import uuid import random from maproulette.models import db, Challenge, Task, TaskGeometry, Action from shapely.geometry import Point, LineString, box num_challenges = 10 num_tasks = 100 # the gettysburg address challenge_help_test = "Sample challenge *help* text" challenge_instruction_test = "Challenge instruction text" task_instruction_text = "Task instruction text" # delete old tasks and challenges db.session.query(TaskGeometry).delete() db.session.query(Action).delete() db.session.query(Task).delete() db.session.query(Challenge).delete() db.session.commit() for i in range(1, num_challenges + 1): print "Generating Test Challenge #%d" % i minx = -120 maxx = -40 miny = 20 maxy = 50 challengepoly = None slug = "test%d" % i title = "Test Challenge %d" % i challenge = Challenge(slug, title) challenge.difficulty = random.choice([1, 2, 3]) challenge.active = True challenge.blurb = "This is test challenge number %d" % i challenge.description = "This describes test challenge %d in detail" % i challenge.help = challenge_help_test challenge.instruction = challenge_instruction_test # have bounding boxes for all but the first two challenges. if i > 2: minx = random.randrange(-120, -40) miny = random.randrange(20, 50) maxx = minx + 1 maxy = miny + 1 challengepoly = box(minx, miny, maxx, maxy) print "\tChallenge has a bounding box of ", challengepoly challenge.polygon = challengepoly db.session.add(challenge) # add some tasks to the challenge print "\tGenerating %i tasks for challenge %i" % (num_tasks, i) # generate NUM_TASKS random tasks for j in range(num_tasks): # generate a unique identifier identifier = str(uuid.uuid4()) # instantiate the task and register it with challenge 'test' # Initialize a task with its challenge slug and persistent ID task = Task(challenge.slug, identifier) # create two random points not too far apart p1 = Point(random.randrange(minx, maxx) + random.random(), random.randrange(miny, maxy) + random.random()) p2 = Point( p1.x + (random.random() * random.choice((1, -1)) * 0.01), p1.y + (random.random() * random.choice((1, -1)) * 0.01), ) # create a linestring connecting the two points # no constructor for linestring from points? l1 = LineString([(p1.x, p1.y), (p2.x, p2.y)]) # generate some random 'osm ids' osmids = [random.randrange(1000000, 1000000000) for _ in range(2)] # add the first point and the linestring to the task's geometries task.geometries.append(TaskGeometry(osmids[0], p1)) task.geometries.append(TaskGeometry(osmids[1], l1)) # and add the first point as the task's location task.location = p1 # generate random string for the instruction task.instruction = task_instruction_text # add the task to the session db.session.add(task) # commit the generated tasks and the challenge to the database. db.session.commit()