def load_items(fixture_path: str): """Load default items and assets to database. Args: fixture_path - Path relative to fixtures. i.e 'data/items.json' """ items = json_parser(resource_string(__name__, fixture_path)) with db.session.begin_nested(): for item in items: assets = item.pop('assets') c_item = CollectionItem(**item) c_item.save(commit=False) c_tile = CollectionTile() c_tile.collection_id = c_item.collection_id c_tile.grs_schema_id = c_item.grs_schema_id c_tile.tile_id = c_item.tile_id c_tile.save(commit=False) for asset in assets: b = Band.query().filter( Band.collection_id == c_item.collection_id, Band.name == asset.pop('band')).one() a = Asset(**asset) a.band = b a.save(commit=False)
def get_credentials(): """Retrieve global secrets with credentials.""" file = resource_path.join(resource_path.dirname(CURRENT_DIR), 'secrets.json') with open(file) as f: return json_parser(f.read())
def load_model(fixture_path: str, model_class): """Load fixture to database. Args: fixture_path - Path relative to fixtures. i.e 'data/tiles.json' model_class - SQLAlchemy Model Class """ schemas = json_parser(resource_string(__name__, fixture_path)) with db.session.begin_nested(): for schema in schemas: model = model_class(**schema) model.save(commit=False)
def load_collections(fixture_path: str): """Load default collections to database. Args: fixture_path - Path relative to fixtures. i.e 'data/tiles.json' """ collections = json_parser(resource_string(__name__, fixture_path)) with db.session.begin_nested(): for collection in collections: bands = collection.pop('bands') c = Collection(**collection) c.save(commit=False) for band in bands: b = Band(**band) b.collection = c b.save(commit=False)
def correction_sen2cor280(scene): """Dispatch sen2cor 2.8.0 execution.""" safeL2Afull = scene['file'].replace('MSIL1C', 'MSIL2A') fragments = Path(safeL2Afull).name.split('_') fragments[3] = 'N9999' processing_date = datetime.strptime(fragments[-1].replace('.SAFE', ''), '%Y%m%dT%H%M%S') today = datetime.utcnow().timetuple() processing_date = processing_date.replace(year=today.tm_year, month=today.tm_mon, day=today.tm_mday) output_dir = '_'.join(fragments[:-1]) sensing_date = datetime.strptime(fragments[2], '%Y%m%dT%H%M%S') output_dir = Config.DATA_DIR / Path( 'Repository/Archive/S2_MSI/{}/{}_{}.SAFE'.format( sensing_date.strftime('%Y-%m'), output_dir, processing_date.strftime('%Y%m%dT%H%M%S'))) os.makedirs(str(output_dir), exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True) logging.info('Using outputdir {}'.format(str(output_dir))) scene['output_dir'] = str(output_dir) # Send scene to the sen2cor service req = resource_get('{}/sen2cor'.format(Config.SEN2COR_URL), params=scene) result = json_parser(req.content) if req.status_code != 200 and result and result.get('status') == 'ERROR': rmtree(str(output_dir)) raise RuntimeError('Error in sen2cor execution') return str(output_dir)
def correction_sen2cor255(scene): """Dispatch sen2cor 2.5.5 execution.""" safeL2Afull = scene['file'].replace('MSIL1C', 'MSIL2A') # TODO: check if file exists and validate SAFE valid = False if os.path.exists(safeL2Afull) and valid == True: return safeL2Afull if not os.path.exists(safeL2Afull) or valid == False: # Send scene to the sen2cor service req = resource_get('{}/sen2cor'.format(Config.SEN2COR_URL), params=scene) # Ensure the request has been successfully assert req.status_code == 200 result = json_parser(req.content) if result and result.get('status') == 'ERROR': if os.path.exists(safeL2Afull): shutil.rmtree(safeL2Afull, ignore_errors=True) raise RuntimeError('Error in sen2cor execution') return safeL2Afull
def main(): first_time_running = 1 # acts slightly differently on first run-through numTimes_already_set = 0 # to set default value if not set in ini file pullOnce = 0 # pulls all appointment information only once, doesn't do the automatic refresh thing calendarIDisSet = 0 # ---- check OS (since some Linux distros has a different audio handling method) ---- # print("INFO: OS Detected as {0} {1}".format(os_id()[0], os_id()[2])) # The following enables the beep sound for linux # is running non-Windows OS/non-Windows Linux if os_id()[0].find("Linux") != -1 and os_id()[2].find( "Microsoft") == -1 or os_id()[0].find("Darwin") != -1: print( "INFO: Non-Windows/Ubuntu-Windows OS detected. Sudo access may be requested for the audio alerts to work [hopefully] properly." ) from os import system # Beep drivers are removed by default in some linux distros (eg. Ubuntu, but not Bash on Ubuntu on Windows) # To temporarily enable for current session, (until reboot) if os_id()[0].find("Darwin") == -1: system("sudo modprobe pcspkr") system("xset b 100") # Perhaps not necessary, mine was set to 40. # default bing sound. You may choose another (see to-do) system( "pactl upload-sample /usr/share/sounds/ubuntu/notifications/Mallet.ogg bell.ogg" ) # now to make beep, simply run: # system("printf \a") # ---- end check OS ---- # # ---- read and parse through file ---- # # the following gathers information from a user-supplied INI file config_file = open("acuitybotconfig.ini") config_file_contents = config_file.read() config_file.close() # first remove the preceding part and first single quotation mark # the 0th index gets the stuff preceding the split userID = config_file_contents.split("userID='")[1] # meanwhile, the 1st index gets stuff after split keyAPI = config_file_contents.split("keyAPI='")[1] # then remove the quotation mark on the other end for userID and API key userID = userID.split("'")[0] keyAPI = keyAPI.split("'")[0] if (userID == "USER_ID_GOES_HERE" or keyAPI == "API_KEY_GOES_HERE"): print( "ERROR: User ID and/or API Key not set. Please set those in the acuitybotconfig.ini file. Exiting..." ) exit() # -- check if optional ini values exist in file -- # calendarID_info = doesExist("calendarID='", config_file_contents) calendarID = calendarID_info[0] # even if calendarID_info[0] is value "" (default not found value), calendarIDisSet will still be false calendarIDisSet = calendarID_info[1] del calendarID_info numTimes_info = doesExist("numberOfTimes='", config_file_contents) numberOfTimes = numTimes_info[0] # even if numTimes_info[0] is value "" (default not found value), numTimes_already_set will still be false numTimes_already_set = numTimes_info[1] del numTimes_info # no need for it anymore, just taking up space pullOnce_info = doesExist("pullOnce='", config_file_contents) if pullOnce_info[1]: # if 1, we know that it's not blank # checks first return value for Y/y if pullOnce_info[0] == 'Y' or pullOnce_info[0] == 'y': pullOnce = 1 else: print("INFO: Pull once disabled/not set.") del pullOnce_info # no need for it anymore, just taking up space # no need for an else statement because pullOnce is by default set to false # -- end optional ini value checking -- # del config_file_contents # no need for it anymore, just taking up space if not numTimes_already_set or numberOfTimes == "A_NUMBER_GOES_HERE": # if optional line isn't in ini file numberOfTimes = 5 # just make 5 the default number of times if not set print("INFO: Set to play a beep {0} times.".format(numberOfTimes)) if not calendarIDisSet or calendarID == "CALENDAR_ID_GOES_HERE": print( "\nCalendar ID is not set. Please select an ID from the following list: " ) calendarID_list = web_get( 'https://acuityscheduling.com/api/v1/calendars', auth=(userID, keyAPI)) if calendarID_list.status_code != 200: # < 200 OK > print("ERROR: Non-OK return status ({0}). Exiting...".format( response)) exit() calendarID_list = json_parser(calendarID_list.text) # below you'll see that some things are offset by 1. I wanted to start at 1 as simple as possible (but it involved offsetting everything else) for i in range(len(calendarID_list)): # gets the name of the calendar print("{0}: {1}".format(i + 1, calendarID_list[i]["name"])) calendarID = input("Enter choice: ") if calendarID == "" or int(calendarID) > len(calendarID_list) or int( calendarID) < 1: print("ERROR: Did not enter a valid choice. Exiting...") exit() # gets the ID of the calendar calendarID = int(calendarID_list[int(calendarID) - 1]["id"]) # ---- end file reading and parsing ---- # params = ( ('minDate', 'TODAY'), ('maxDate', 'TODAY'), ('calendarID', calendarID), ) # for the get request that repeats print("\nINFO: Calendar ID: {0}\n".format(calendarID)) if pullOnce: print( "INFO: Pull once enabled. Will only pull current appointments once, auto-refresh disabled." ) print("\nGetting data from Acuity...") # needed to print text first while waiting for "- done" in Linux, doesn't really do anything in Windows sysout.write('') sysout.flush() # same as above response = web_get('https://acuityscheduling.com/api/v1/appointments', params=params, auth=(userID, keyAPI)) #print("- done.") if response.status_code != 200: # <200 OK> print("ERROR: Non-OK return status ({0}). Exiting...".format( response)) exit() # must be response.text because reponse just prints the code (i.e., 200 OK or 403 FORBIDDEN, etc.), # type dictionary parsed_json_result = json_parser(response.text) # technically is the first time running printJSON(parsed_json_result, 1) print("Exiting...") exit() else: old_len = 0 # used to keep track of amount of appointments while 1: something_new = 0 appt_cancelled = 0 print("Getting data from Acuity...") # commas keep text inline # needed to print text first while waiting for "- done" in Linux, doesn't really do anything in Windows sysout.write('') sysout.flush() # same as above response = web_get( 'https://acuityscheduling.com/api/v1/appointments', params=params, auth=(userID, keyAPI)) #print ("- done.") if response.status_code != 200: # <200 OK> print("ERROR: Non-OK return status ({0}). Exiting...".format( response)) exit() # must be response.text because reponse just prints the code (i.e., 200 OK or 403 FORBIDDEN, etc.), # type dictionary parsed_json_result = json_parser(response.text) # something_new doesn't trip on first iterance if len(parsed_json_result) > old_len and not first_time_running: something_new = 1 if old_len > len(parsed_json_result) and not first_time_running: appt_cancelled = 1 if not first_time_running: if something_new: sleep(0.5) # just a slight delay print("\nThere's a new appointment.") printJSON(parsed_json_result) print0("Playing beep {0} times".format(numberOfTimes), numberOfTimes, 1) print("\n=================\n") # need to account for whether an appointment has been cancelled (but it only plays half the amount of specified beeps) elif appt_cancelled: sleep(0.5) # just a slight delay print("\nSomeone cancelled their appointment.") printJSON(parsed_json_result) print0("Playing beep {0} times".format(numberOfTimes / 2), numberOfTimes / 2, 1) print("\n================\n") else: sleep(0.5) # just a slight delay print("\nNothing new.") print("\n=================\n") else: first_time_running = 0 printJSON(parsed_json_result, 1) # this plus all the other delays means a refresh happens about every 5-10 seconds print0("Sleeping for 5 seconds", 5) old_len = len(parsed_json_result)