def SearchForNumber(searchTerm, res): try: selector = { "Journeys": { "$elemMatch": { "Train_Number": int(searchTerm) } } } queryRef = list( glob.COUCH_USER_ACTIVITY.get_query_result( selector, fields=['key', 'Journeys'])) for docs in queryRef: for jDoc in docs['Journeys']: if jDoc['Train_Number'] == int(searchTerm): jDoc.update({'Username': docs['key'].split(":")[1]}) # Get Train Number Details res.append(jDoc) except KeyError: glob.LOGGER("[SEARCH JRNY] Could not find {} train number".format( searchTerm)) print("[SEARCH JRNY] Could not find {} train number".format( searchTerm)) except Exception as err: glob.LOGGER("[SEARCH JRNY] Error @ train number \n {}".format(err)) print("[SEARCH JRNY] Error @ train number \n {}".format(err)) return res
def SeachTimeInJourneysArray(journeysArray, searchTime, searchType): if searchType == 'At': ''' At / On ''' glob.LOGGER("[TIME JRNY] At request") print("[TIME JRNY] At request") return list(filter(lambda journeyDoc:\ 'Time_In' in journeyDoc and 'Time_Out' in journeyDoc\ and journeyDoc['Time_In'] < searchTime and journeyDoc['Time_Out'] > searchTime\ , journeysArray\ )) elif searchType == 'Under': ''' Under ''' glob.LOGGER("[TIME JRNY] Under request") print("[TIME JRNY] Under request") return list(filter(lambda journeyDoc:\ 'Time_Out' in journeyDoc and journeyDoc['Time_Out'] < searchTime\ , journeysArray\ )) elif searchType == 'Over': ''' Over ''' glob.LOGGER("[TIME JRNY] Over request") print("[TIME JRNY] Over request") return list(filter(lambda journeyDoc:\ 'Time_In' in journeyDoc and journeyDoc['Time_In'] > searchTime\ , journeysArray\ ))
def PopulateDatabase(admin_couch_client, dbName, populate): if not admin_couch_client[dbName].exists(): glob.LOGGER("[POPULATE] {} does not exist!") print("[POPULATE] {} does not exist!") return False else: for doc in populate: try: admin_couch_client[dbName].create_document(doc) except Exception as err: glob.LOGGER("[POPULATE] Error in creating doc {} \n {}".format(doc, err)) print("[POPULATE] Error in creating doc {} \n {}".format(doc, err)) return True
def CreateDBHandler(req): if not req.body: glob.LOGGER("[MOD] Invalid Request: Null body") print("[MOD] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[MOD] Invalid Request: Null Whos_Asking") print("[MOD] Invalid Request: Null Whos_Asking") return HttpResponse(status=400) if 'Password' not in body or not body['Password']: glob.LOGGER("[MOD] Invalid Request: Null Password") print("[MOD] Invalid Request: Null Password") return HttpResponse(status=400) if 'Database_Name' not in body or not body['Database_Name']: glob.LOGGER("[MOD] Invalid Request: Null database name") print("[MOD] Invalid Request: Null database name") return HttpResponse(status=400) glob.LOGGER("[MOD] Create DB request by {}".format(body['Whos_Asking'])) print("[MOD] Create DB request by {}".format(body['Whos_Asking'])) populate = body['Populate'] if 'Populate' in body and body['Populate'] is not None else False try: admin_couch_client = CouchDB( body['Whos_Asking'], body['Password'], url = glob.COUCH_HOST+':'+glob.COUCH_PORT, connect = True ) except KeyError: glob.LOGGER("[MOD] Couch Admin not found") print("[MOD] Couch Admin not found") return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) print("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) return HttpResponse(status=500) try: admin_couch_client[ str(body[ 'Database_Name' ]) ].exists() glob.LOGGER("[MOD] Database {} already exists".format(body[ 'Database_Name' ])) print("[MOD] Database {} already exists".format(body[ 'Database_Name' ])) return HttpResponse(status=406) except KeyError: glob.LOGGER("[MOD] Creating new {} database".format(body[ 'Database_Name' ])) print("[MOD] Creating new {} database".format(body[ 'Database_Name' ])) admin_couch_client.create_database(body[ 'Database_Name' ]) if populate: if PopulateDatabase(admin_couch_client, body[ 'Database_Name' ], populate): return HttpResponse(status=200) else: return HttpResponse(status=500)
def ListSpottingHandler(req): # print(LOGGER) body = JSON.loads(req.body) print("[LIST SPOT] New request\n {}".format(body)) glob.LOGGER("[LIST SPOT] New request\n {}".format(body)) res = [] ''' Loco_Number ''' if 'Loco_Number' in body.keys(): print("[LIST SPOT] List for Loco {}".format(body['Loco_Number'])) overallRef = list(glob.COUCH_OVERALL_SPOTTING[ str(body['Loco_Number']) ]['Spottings']) res.extend(overallRef) ''' Shed Class ''' if 'Loco_Class' in body.keys(): print("[LIST SPOT] List for Class {}".format(body['Loco_Class'])) selector = { "Spottings": { "$elemMatch": { "Loco_Class": body['Loco_Class'] } } } overallRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector, fields = ["Spottings"])) res.extend([\ spottingDoc for docs in overallRef for spottingDoc in docs['Spottings']\ if spottingDoc['Loco_Class'] == body['Loco_Class']\ ]) if 'Loco_Shed' in body.keys(): print("[LIST SPOT] List for Shed {}".format(body['Loco_Shed'])) selector = { "Spottings": { "$elemMatch": { "Loco_Shed": body['Loco_Shed'] } } } overallRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector, fields = ["Spottings"])) res.extend([\ spottingDoc for docs in overallRef for spottingDoc in docs['Spottings']\ if spottingDoc['Loco_Shed'] == body['Loco_Shed']\ ]) ''' Train_Number ''' if 'Train_Number' in body.keys(): print("[LIST SPOT] List for Train {}".format(body['Train_Number'])) selector = { "Spottings": { "$elemMatch": { "Train_Number": body['Train_Number'] } } } overallRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector, fields = ["Spottings"])) res.extend([\ spottingDoc for docs in overallRef for spottingDoc in docs['Spottings']\ if spottingDoc['Train_Number'] == body['Train_Number']\ ]) ''' Train_Name ''' if 'Train_Name' in body.keys(): print("[LIST SPOT] List for Train Name {}".format(body['Train_Name'])) trainNum = list(\ glob.COUCH_TRAIN_DATA.get_query_result(\ { "Train_Name": { "$eq": body['Train_Name'] } }, fields = ['Train_Number']\ )\ ) for num in trainNum: selector = { "Spottings": { "$elemMatch": { "Train_Number": num['Train_Number'] } } } overallRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector, fields = ["Spottings"])) res.extend([\ spottingDoc for docs in overallRef for spottingDoc in docs['Spottings']\ if spottingDoc['Train_Number'] == num['Train_Number']\ ]) res.sort(key = lambda doc: doc['Date_Time'], reverse = True) return JsonResponse(res, safe = False)
def UserSpottingHandler(req): if not req.body: glob.LOGGER("[USER SPOT] Invalid Request: Null body") print("[USER SPOT] Invalid Request: Null body") return HttpResponse(status = 400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[USER SPOT] Invalid Request: Null Whos_Asking") print("[USER SPOT] Invalid Request: Null Whos_Asking") return HttpResponse(status = 400) Username = body[ 'Whos_Asking' ] if 'Username' not in body else body[ 'Username' ] if body[ 'Username' ]: print("[USER SPOT] Request for {} by {}".format(Username, body[ 'Whos_Asking' ])) else: print("[USER SPOT] Request by {}".format(Username)) try: spottingList = glob.COUCH_USER_ACTIVITY[\ PARTITION_KEY_DICT[ Username[0].lower() ] + ':' + Username\ ][ 'Spottings' ] for sDoc in spottingList: if 'Train_Number' in sDoc: try: trainQuery = list(\ Train.objects.filter(\ Train_Number = int(sDoc[ 'Train_Number' ])\ ).values_list('Train_Name', flat=True)\ ) sDoc.update({ "Train_Name": trainQuery[0] }) except: print("[USER SPOT] Could not find train {}".format(sDoc['Train_Number'])) spottingList.sort(key = lambda doc: doc['Date_Time'], reverse = True) glob.LOGGER("[USER SPOT] Request handled successfully! Response: \n {}".format(str(spottingList))) print("[USER SPOT] Request handled successfully! Response: \n {}".format(str(spottingList))) return JsonResponse(spottingList, safe = False) except KeyError: print("[USER SPOT] No spottings found for {}".format(Username)) print("[USER SPOT] Request handled successfully! Response: 404") return HttpResponse(status = 404) except Exception as err: print("[USER SPOT] Error: \n {}".format(err)) return HttpResponse(status = 500)
def AwardThisUser(Username, award): userInfoRef = glob.COUCH_USER_INFO[':'.join( (glob.PARTITION_KEY_DICT[Username[0].lower()], Username))] if 'Achievements' in userInfoRef.keys() and len( userInfoRef['Achievements']): userInfoRef['Achievements'].append( award) if award not in userInfoRef['Achievements'] else None else: userInfoRef['Achievements'] = [award] userInfoRef.save() glob.LOGGER("[AWARD] New achievement by {}: {}".format(Username, award)) print("[AWARD] New achievement by {}: {}".format(Username, award))
def CreateDocHandler(req): if not req.body: glob.LOGGER("[MOD] Invalid Request: Null body") print("[MOD] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[MOD] Invalid Request: Null Whos_Asking") print("[MOD] Invalid Request: Null Whos_Asking") return HttpResponse(status=400) if 'Password' not in body or not body['Password']: glob.LOGGER("[MOD] Invalid Request: Null Password") print("[MOD] Invalid Request: Null Password") return HttpResponse(status=400) if 'Database_Name' not in body or not body['Database_Name']: glob.LOGGER("[MOD] Invalid Request: Null database name") print("[MOD] Invalid Request: Null database name") return HttpResponse(status=400) if 'Populate' not in body or not body['Populate']: glob.LOGGER("[MOD] Invalid Request: Null Populate") print("[MOD] Invalid Request: Null Populate") return HttpResponse(status=400) glob.LOGGER("[MOD] Create Doc request by {} for {}".format(body['Whos_Asking'], body['Database_Name'])) print("[MOD] Create Doc request by {} for {}".format(body['Whos_Asking'], body['Database_Name'])) try: admin_couch_client = CouchDB( body['Whos_Asking'], body['Password'], url = glob.COUCH_HOST + ':' + glob.COUCH_PORT, connect = True ) glob.LOGGER("[MOD] {} found".format(body[ 'Whos_Asking' ])) print("[MOD] {} found".format(body[ 'Whos_Asking' ])) except KeyError: glob.LOGGER("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) print("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) print("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) return HttpResponse(status=500) try: if type(body['Populate']).__name__ == 'list': if PopulateDatabase(admin_couch_client, body['Database_Name'], body['Populate']): return HttpResponse(status=201) elif type(body['Populate']).__name__ == 'dict': if PopulateDatabase(admin_couch_client, body['Database_Name'], [ body['Populate'] ]): return HttpResponse(status=201) else: glob.LOGGER("[MOD] Invalid data type of document {}".format(type(body['Populate']).__name__)) print("[MOD] Invalid data type of document {}".format(type(body['Populate']).__name__)) return HttpResponse(status=400) except Exception as err: glob.LOGGER("[MOD] Error @ Populate \n {}".format(err)) print("[MOD] Error @ Populate \n {}".format(err)) return HttpResponse(status=500)
def UpdateDBHandler(req): if not req.body: glob.LOGGER("[MOD] Invalid Request: Null body") print("[MOD] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[MOD] Invalid Request: Null Whos_Asking") print("[MOD] Invalid Request: Null Whos_Asking") return HttpResponse(status=400) if 'Password' not in body or not body['Password']: glob.LOGGER("[MOD] Invalid Request: Null Password") print("[MOD] Invalid Request: Null Password") return HttpResponse(status=400) if 'Database_Name' not in body or not body['Database_Name']: glob.LOGGER("[MOD] Invalid Request: Null database name") print("[MOD] Invalid Request: Null database name") return HttpResponse(status=400) if 'Old_Doc' not in body or not body['Old_Doc']: glob.LOGGER("[MOD] Invalid Request: Null Old_Doc") print("[MOD] Invalid Request: Null Old_Doc") return HttpResponse(status=400) if 'Update_Doc' not in body or not body['Update_Doc']: glob.LOGGER("[MOD] Invalid Request: Null Update_Doc") print("[MOD] Invalid Request: Null Update_Doc") return HttpResponse(status=400) glob.LOGGER("[MOD] Update request by {} \n from {} to {}".format( body['Whos_Asking'], body['Old_Doc'], body['Update_Doc']) ) print("[MOD] Update request by {} \n from {} to {}".format(body['Whos_Asking'], body['Old_Doc'], body['Update_Doc'])) try: admin_couch_client = CouchDB( body['Whos_Asking'], body['Password'], url = glob.COUCH_HOST + ':' + glob.COUCH_PORT, connect = True ) glob.LOGGER("[MOD] {} found".format(body[ 'Whos_Asking' ])) print("[MOD] {} found".format(body[ 'Whos_Asking' ])) except KeyError: glob.LOGGER("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) print("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) print("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) return HttpResponse(status=500) if 'Update_Factor' in body: try: index = admin_couch_client[ str(body['Database_Name']) ][ body['Update_Factor'] ].index(body[ 'Old_Doc' ]) admin_couch_client[ str(body['Database_Name']) ][ body['Update_Factor'] ][index].update(body['Update_Doc']) admin_couch_client[ str(body['Database_Name']) ].save() glob.LOGGER("[MOD] {} changes updated".format(body[ 'Update_Doc' ])) print("[MOD] {} changes updated".format(body[ 'Update_Doc' ])) return HttpResponse(status=200) except KeyError: glob.LOGGER("[MOD] Old doc not found in {}/{}".format(body[ 'Database_Name' ], body[ 'Update_Factor' ])) print("[MOD] Old doc not found in {}/{}".format(body[ 'Database_Name' ], body[ 'Update_Factor' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Error finding old doc \n {}".format(err)) print("[MOD] Error finding old doc \n {}".format(err)) return HttpResponse(status=500) else: try: for doc in admin_couch_client[ str(body[ 'Database_Name' ]) ]: if doc == body['Old_Doc']: doc.update(body['Update_Doc']) doc.save() glob.LOGGER("[MOD] {} changes updated".format(body[ 'Update_Doc' ])) print("[MOD] {} changes updated".format(body[ 'Update_Doc' ])) return HttpResponse(status=200) except KeyError: glob.LOGGER("[MOD] Old doc not found in {}/{}".format(body[ 'Database_Name' ], body[ 'Update_Factor' ])) print("[MOD] Old doc not found in {}/{}".format(body[ 'Database_Name' ], body[ 'Update_Factor' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Error finding old doc \n {}".format(err)) print("[MOD] Error finding old doc \n {}".format(err)) return HttpResponse(status=500)
def TruncateDBHandler(req): if not req.body: glob.LOGGER("[MOD] Invalid Request: Null body") print("[MOD] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[MOD] Invalid Request: Null Whos_Asking") print("[MOD] Invalid Request: Null Whos_Asking") return HttpResponse(status=400) if 'Password' not in body or not body['Password']: glob.LOGGER("[MOD] Invalid Request: Null Password") print("[MOD] Invalid Request: Null Password") return HttpResponse(status=400) if 'Database_Name' not in body or not body['Database_Name']: glob.LOGGER("[MOD] Invalid Request: Null database name") print("[MOD] Invalid Request: Null database name") return HttpResponse(status=400) glob.LOGGER("[MOD] Truncate request by {} for {}".format(body['Whos_Asking'], body['Database_Name'])) print("[MOD] Truncate request by {} for {}".format(body['Whos_Asking'], body['Database_Name'])) try: admin_couch_client = CouchDB( body['Whos_Asking'], body['Password'], url = glob.COUCH_HOST + ':' + glob.COUCH_PORT, connect = True ) glob.LOGGER("[MOD] {} found".format(body[ 'Whos_Asking' ])) print("[MOD] {} found".format(body[ 'Whos_Asking' ])) except KeyError: glob.LOGGER("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) print("[MOD] Couch Admin {} not found".format(body[ 'Whos_Asking' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) print("[MOD] Could not connect to couch as {} \n {}".format(body[ 'Whos_Asking' ], err)) return HttpResponse(status=500) try: if admin_couch_client[ str(body[ 'Database_Name' ]) ].exists(): glob.LOGGER("[MOD] Database {} found".format(body[ 'Database_Name' ])) print("[MOD] Database {} found".format(body[ 'Database_Name' ])) for doc in admin_couch_client[ str(body[ 'Database_Name' ]) ]: doc.delete() glob.LOGGER("[MOD] Database {} truncated!".format(body[ 'Database_Name' ])) print("[MOD] Database {} truncated!".format(body[ 'Database_Name' ])) return HttpResponse(status=200) except KeyError: glob.LOGGER("[MOD] Database {} does not exist to truncate".format(body[ 'Database_Name' ])) print("[MOD] Database {} does not exist to truncate".format(body[ 'Database_Name' ])) return HttpResponse(status=404) except Exception as err: glob.LOGGER("[MOD] Error at checking existing DB {}".format(body[ 'Database_Name' ])) print("[MOD] Error at checking existing DB {}".format(body[ 'Database_Name' ])) return HttpResponse(status=500)
def NewSpottingHandler(req): if not req.body: glob.LOGGER("[NEW SPOT] Invalid Request: Null body") print("[NEW SPOT] Invalid Request: Null body") return HttpResponse(status = 400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[NEW SPOT] Invalid Request: Null Whos_Asking") print("[NEW SPOT] Invalid Request: Null Whos_Asking") return HttpResponse(status = 400) Username = body['Whos_Asking'] glob.LOGGER("[NEW SPOT] Request by {}: \n {}".format(Username, str(body))) print("[NEW SPOT] Request by {}: \n {}".format(Username, str(body))) spottingDoc = { k:v for k,v in body.items() if v } spottingDoc[ 'Spotting_ID' ] = Username + ':' + glob.RAND6DIG() spottingDoc[ 'Loco_Number' ] = "Uncertain" if 'Loco_Number' not in body else int(body['Loco_Number']) spottingDoc[ 'Date_Time' ] = int(body['Date_Time']) if 'Date_Time' in body else int(TIME.time()) try: selector = { "Spottings": { "$elemMatch": { "Loco_Class": spottingDoc[ 'Loco_Class' ] } } } classRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector)) if len(classRef) < 1: ''' First To Spot Loco Class ''' glob.LOGGER("[NEW SPOT] First spotting of Class: {}".format(spottingDoc[ 'Loco_Class' ])) print("[NEW SPOT] First spotting of Class: {}".format(spottingDoc[ 'Loco_Class' ])) AwardThisUser(Username, "FTSLC") except Exception as e: glob.LOGGER("[NEW SPOT] Exception @ Loco_Class \n {}".format(e)) print("[NEW SPOT] Exception @ Loco_Class \n {}".format(e)) try: selector = { "Spottings": { "$elemMatch": { "Loco_Shed": spottingDoc[ 'Loco_Shed' ] } } } shedRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector)) if len(shedRef) < 1: ''' First To Spot Loco Shed ''' glob.LOGGER("[NEW SPOT] First spotting of Shed: {}".format(spottingDoc[ 'Loco_Shed' ])) print("[NEW SPOT] First spotting of Shed: {}".format(spottingDoc[ 'Loco_Shed' ])) AwardThisUser(Username, "FTSLS") except Exception as e: glob.LOGGER("[NEW SPOT] Exception @ Loco_Shed \n {}".format(e)) print("[NEW SPOT] Exception @ Loco_Shed \n {}".format(e)) try: selector = { "Spottings": { "$elemMatch": { "Train_Number": spottingDoc[ 'Train_Number' ] } } } trainRef = list(glob.COUCH_OVERALL_SPOTTING.get_query_result(selector)) if len(trainRef) < 1: ''' First To Spot Train ''' glob.LOGGER("[NEW SPOT] First spotting of Train: {}".format(spottingDoc[ 'Train_Number' ])) print("[NEW SPOT] First spotting of Train: {}".format(spottingDoc[ 'Train_Number' ])) AwardThisUser(Username, "FTST") except Exception as e: glob.LOGGER("[NEW SPOT] Exception @ Train_Number \n {}".format(e)) print("[NEW SPOT] Exception @ Train_Number \n {}".format(e)) try: overallRef = glob.COUCH_OVERALL_SPOTTING[ str(spottingDoc[ 'Loco_Number' ]) ] glob.LOGGER("[NEW SPOT] Spotting of Loco {} already exists".format(spottingDoc[ 'Loco_Number' ])) print("[NEW SPOT] Spotting of Loco {} already exists".format(spottingDoc[ 'Loco_Number' ])) AnotherSpottingOfLoco(overallRef, { **spottingDoc }) except KeyError: glob.LOGGER("[NEW SPOT] First spotting of Loco: {}".format(spottingDoc[ 'Loco_Number' ])) print("[NEW SPOT] First spotting of Loco: {}".format(spottingDoc[ 'Loco_Number' ])) FirstSpottingOfLoco({ **spottingDoc }) except Exception as err: glob.LOGGER("[NEW SPOT] Error @ Overall Ref \n {}".format(err)) print("[NEW SPOT] Error @ Overall Ref \n {}".format(err)) return HttpResponse(status = 500) try: userRef = glob.COUCH_USER_ACTIVITY[ PARTITION_KEY_DICT[ Username[0].lower() ] + ':' + Username ] glob.LOGGER("[NEW SPOT] {} has previous activity".format(Username)) print("[NEW SPOT] {} has previous activity".format(Username)) except KeyError: glob.LOGGER("[NEW SPOT] First activity by user {}".format(Username)) print("[NEW SPOT] First activity by user {}".format(Username)) CreateUserActivity(Username) userRef = glob.COUCH_USER_ACTIVITY[ PARTITION_KEY_DICT[ Username[0].lower() ] + ':' + Username ] except Exception as err: glob.LOGGER("[NEW SPOT] Error @ User Ref \n {}".format(err)) print("[NEW SPOT] Error @ User Ref \n {}".format(err)) return HttpResponse(status = 500) try: glob.COUCH_USER_ACTIVITY[ PARTITION_KEY_DICT[ Username[0].lower() ] + ':' + Username ]['Spottings'] glob.LOGGER("[NEW SPOT] {} has previous spottings".format(Username)) print("[NEW SPOT] {} has previous spottings".format(Username)) AnotherSpottingByUser(userRef, { **spottingDoc }) glob.LOGGER("[NEW SPOT] {} added spotting {}".format(Username, str(spottingDoc))) print("[NEW SPOT] {} added spotting {}".format(Username, str(spottingDoc))) except KeyError: glob.LOGGER("[NEW SPOT] First spotting by {}".format(Username)) print("[NEW SPOT] First spotting by {}".format(Username)) FirstSpottingByUser(userRef, { **spottingDoc }) glob.LOGGER("[NEW SPOT] {} added spotting {}".format(Username, str(spottingDoc))) print("[NEW SPOT] {} added spotting {}".format(Username, str(spottingDoc))) except Exception as err: glob.LOGGER("[NEW SPOT] Error @ User Ref \n {}".format(err)) print("[NEW SPOT] Error @ User Ref \n {}".format(err)) return HttpResponse(status = 500) glob.LOGGER("[NEW SPOT] Request handled successfully! Response: 201") print("[NEW SPOT] Request handled successfully! Response: 201") return HttpResponse(status = 201)
def SearchJourneysHandler(req): if not req.body: glob.LOGGER("[SEARCH JRNY] Invalid Request: Null body") print("[SEARCH JRNY] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if 'Whos_Asking' not in body or not body['Whos_Asking']: glob.LOGGER("[SEARCH JRNY] Invalid Request: Missing Whos_Asking") print("[SEARCH JRNY] Invalid Request: Missing Whos_Asking") return HttpResponse(status=400) if 'Search_Term' not in body or not body['Search_Term']: glob.LOGGER("[SEARCH JRNY] Invalid Request: Missing Search_Term") print("[SEARCH JRNY] Invalid Request: Missing Search_Term") return HttpResponse(status=400) searchTerm = body['Search_Term'] res = [] print("[SEARCH JRNY] Request by {}. Term: {}".format( body['Whos_Asking'], searchTerm)) # privileged = bool(body['Username'] == body['Whos_Asking']) if 'Username' in body else False def SearchForNumber(searchTerm, res): try: selector = { "Journeys": { "$elemMatch": { "Train_Number": int(searchTerm) } } } queryRef = list( glob.COUCH_USER_ACTIVITY.get_query_result( selector, fields=['key', 'Journeys'])) for docs in queryRef: for jDoc in docs['Journeys']: if jDoc['Train_Number'] == int(searchTerm): jDoc.update({'Username': docs['key'].split(":")[1]}) # Get Train Number Details res.append(jDoc) except KeyError: glob.LOGGER("[SEARCH JRNY] Could not find {} train number".format( searchTerm)) print("[SEARCH JRNY] Could not find {} train number".format( searchTerm)) except Exception as err: glob.LOGGER("[SEARCH JRNY] Error @ train number \n {}".format(err)) print("[SEARCH JRNY] Error @ train number \n {}".format(err)) return res def SearchForName(searchTerm): return def SearchForLocation(searchTerm): return numberRegx = r"^\d{3,5}$" tNameRegx = r"\w{5,}" fromToRegex = r"\w{1,4}" # usernameRegex = r"(\w{3,}|\w+\|J\d+)" # jidRegex = r"\w+\|J\d+" if 'Specific_Search' in body.keys() and body['Specific_Search']: ''' Specific Search ''' if body['Specific_Search'] == 'Username' and Username in body.keys(): ''' User Specific Search ''' # if len(re.match(numberRegx)) return HttpResponse(status=404) elif body['Specific_Search'] == 'Location' and Location in body.keys(): ''' Location Specific Search ''' return else: return HttpResponse(status=400) else: ''' General Search ''' if 'Private' in body.keys() and body['Private'] and privileged: ''' Private_Journeys ''' # if re.match(numberRegx, str()) else: ''' Journeys ''' if re.match(numberRegx, str(searchTerm)): ''' Search Train_Number ''' try: selector = { "Journeys": { "$elemMatch": { "Train_Number": int(searchTerm) } } } queryRef = list( glob.COUCH_USER_ACTIVITY.get_query_result( selector, fields=['key', 'Journeys'])) for docs in queryRef: for journeyDoc in docs['Journeys']: if journeyDoc['Train_Number'] == int(searchTerm): journeyDoc.update( {'Username': docs['key'].split(":")[1]}) res.append(journeyDoc) except KeyError: print("[SEARCH JRNY] Could not find {} train number".format( searchTerm)) except Exception as err: print("[SEARCH JRNY] Error @ train number \n {}".format(err)) """ if 'Username' in body: Username = body['Username'] try: userRef = glob.COUCH_USER_ACTIVITY[ ':'.join((glob.PARTITION_KEY_DICT[ Username[0].lower() ], Username)) ] res.extend(userRef['Journeys']) except KeyError: glob.LOGGER("[SEARCH JRNY] User activity not found for {}".format(Username)) print("[SEARCH JRNY] User activity not found for {}".format(Username)) return HttpResponse(status = 404) except Exception as err: glob.LOGGER("[SEARCH JRNY] Error: \n {}".format(err)) print("[SEARCH JRNY] Error: \n {}".format(err)) return HttpResponse(status = 500) if 'Train_Number' in body: selector = {"Journeys": { "$elemMatch": { "Train_Number": int(body['Train_Number']) } } } queryRef = list(glob.COUCH_USER_ACTIVITY.get_query_result(selector, fields = ['Journeys'])) for docs in queryRef: for journeyDoc in docs['Journeys']: if journeyDoc['Train_Number'] == int(body['Train_Number']): if 'Train_Number' in journeyDoc and 'Train_Name' not in journeyDoc: trainRef = glob.COUCH_TRAIN_DATA[ str(journeyDoc[ 'Train_Number' ]) ]['Train_Name'] journeyDoc['Train_Name'] = trainRef res.append(journeyDoc) if 'From' in body: selector = {"Journeys": { "$elemMatch": { "From": body['From'] } } } queryRef = list(glob.COUCH_USER_ACTIVITY.get_query_result(selector, fields = ['Journeys'])) for docs in queryRef: for journeyDoc in docs['Journeys']: if journeyDoc['From'] == body['From']: if 'Train_Number' in journeyDoc and 'Train_Name' not in journeyDoc: trainRef = glob.COUCH_TRAIN_DATA[ str(journeyDoc[ 'Train_Number' ]) ]['Train_Name'] journeyDoc['Train_Name'] = trainRef res.append(journeyDoc) # res.extend([ # journeyDoc for doc in queryRef for journeyDoc in doc['Journeys']\ # if journeyDoc['From'] == body['From'] # ]) if 'To' in body: selector = {"Journeys": { "$elemMatch": { "To": body['To'] } } } queryRef = list(glob.COUCH_USER_ACTIVITY.get_query_result(selector, fields = ['Journeys'])) for docs in queryRef: for journeyDoc in docs['Journeys']: if journeyDoc['To'] == body['To']: if 'Train_Number' in journeyDoc and 'Train_Name' not in journeyDoc: trainRef = glob.COUCH_TRAIN_DATA[ str(journeyDoc[ 'Train_Number' ]) ]['Train_Name'] journeyDoc['Train_Name'] = trainRef res.append(journeyDoc) # res.extend([ # journeyDoc for doc in queryRef for journeyDoc in doc['Journeys']\ # if journeyDoc['To'] == body['To'] # ]) """ if not len(res): # glob.LOGGER("[SEARCH JRNY] Response: {}".format(res)) return JsonResponse([], safe=False, status=204) else: res.sort(key=lambda doc: doc['Date_Time'], reverse=True) # glob.LOGGER("[SEARCH JRNY] Response: {}".format(res)) return JsonResponse(res, safe=False)
def NewJourneyHandler(req): if not req.body: glob.LOGGER("[NEW JRNY] Invalid Request: Null body") print("[NEW JRNY] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if not 'Whos_Asking' in body.keys() or not body['Whos_Asking']: glob.LOGGER("[NEW JRNY] Invalid Request: Missing Whos_Asking") print("[NEW JRNY] Invalid Request: Missing Whos_Asking") return HttpResponse(status=400) Username = body['Whos_Asking'] glob.LOGGER("[NEW JRNY] New request by {}: \n {}".format( Username, str(body))) print("[NEW JRNY] New request by {}: \n {}".format(Username, str(body))) journeyDoc = { k: v for k, v in body.items() if v and k not in ('Username', 'Private') } journeyDoc['Date_Time'] = int(TIME.time()) # journeyDoc['Journey_ID'] = ':'.join((Username, 'J'+str(RANDINT(1001, 9999))+str(RANDINT(1001, 9999)))) # "".join([random.choice(string.ascii_letters) for i in range(20)]) try: userRef = glob.COUCH_USER_ACTIVITY[':'.join( (glob.PARTITION_KEY_DICT[Username[0].lower()], Username))] glob.LOGGER( "[NEW JRNY] User {} has previous activity".format(Username)) print("[NEW JRNY] User {} has previous activity".format(Username)) except KeyError: glob.LOGGER("[NEW JRNY] First activity by user {}".format(Username)) print("[NEW JRNY] First activity by user {}".format(Username)) CreateUserActivity(Username) userRef = glob.COUCH_USER_ACTIVITY[':'.join( (glob.PARTITION_KEY_DICT[Username[0].lower()], Username))] except Exception as err: glob.LOGGER("[NEW JRNY] Error at userRef \n {}".format(err)) print("[NEW JRNY] Error at userRef \n {}".format(err)) if 'Private' in body.keys() and bool(body['Private']): ''' Private Journey ''' if 'Private_Journeys' in userRef: ''' Another Journey ''' glob.LOGGER( "[NEW JRNY] User {} has previous Private Journeys".format( Username)) print("[NEW JRNY] User {} has previous Private Journeys".format( Username)) userRef['Private_Journeys'].append(journeyDoc) userRef.save() else: ''' First Journey ''' glob.LOGGER( "[NEW JRNY] First Private Journey of User {}".format(Username)) print( "[NEW JRNY] First Private Journey of User {}".format(Username)) userRef['Private_Journeys'] = [journeyDoc] userRef.save() AwardThisUser(Username, "YFJ") else: ''' Public Journey ''' if 'Journeys' in userRef: ''' Another Journey ''' glob.LOGGER( "[NEW JRNY] User {} has previous Journeys".format(Username)) print("[NEW JRNY] User {} has previous Journeys".format(Username)) userRef['Journeys'].append(journeyDoc) userRef.save() else: ''' First Journey ''' glob.LOGGER("[NEW JRNY] First Journey of User {}".format(Username)) print("[NEW JRNY] First Journey of User {}".format(Username)) userRef['Journeys'] = [journeyDoc] userRef.save() AwardThisUser(Username, "YFJ") glob.LOGGER("[NEW JRNY] Request handled successfully! Response: 200") print("[NEW JRNY] Request handled successfully! Response: 200") return HttpResponse(status=200)
def EditJourneyHandler(req): if not req.body: glob.LOGGER("[EDIT JRNY] Invalid Request: Null body") print("[EDIT JRNY] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if not 'Whos_Asking' in body.keys() or not body['Whos_Asking']: glob.LOGGER("[EDIT JRNY] Invalid Request: Missing Whos_Asking") print("[EDIT JRNY] Invalid Request: Missing Whos_Asking") return HttpResponse(status=400) if not 'Existing_Doc' in body.keys() or not body['Existing_Doc']: glob.LOGGER("[EDIT JRNY] Invalid Request: Missing Existing_Doc") print("[EDIT JRNY] Invalid Request: Missing Existing_Doc") return HttpResponse(status=400) if not 'Changes' in body.keys() or not body['Changes']: glob.LOGGER("[EDIT JRNY] Invalid Request: Missing Changes") print("[EDIT JRNY] Invalid Request: Missing Changes") return HttpResponse(status=400) glob.LOGGER("[EDIT JRNY] New Request {}".format(body)) print("[EDIT JRNY] New Request {}".format(body)) Username = body['Whos_Asking'] existingDoc = body['Existing_Doc'] changes = body['Changes'] glob.LOGGER("[EDIT JRNY] Request by {}: \n {}".format(Username, body)) print("[EDIT JRNY] Request by {}: \n {}".format(Username, body)) try: userRef = glob.COUCH_USER_ACTIVITY[\ ':'.join((glob.PARTITION_KEY_DICT[ Username[0].lower() ], Username))\ ] except KeyError: glob.LOGGER( "[EDIT JRNY] User activity not found for {}".format(Username)) print("[EDIT JRNY] User activity not found for {}".format(Username)) glob.LOGGER("[EDIT JRNY] Request handled successfully! Response: 404") print("[EDIT JRNY] Request handled successfully! Response: 404") return HttpResponse(status=404) except Exception as err: glob.LOGGER("[EDIT JRNY] Error: \n {}".format(err)) print("[EDIT JRNY] Error: \n {}".format(err)) return HttpResponse(status=500) if 'Journeys' in userRef: index = userRef['Journeys'].index(existingDoc) if index > -1: userRef['Journeys'][index].update(changes) userRef.save() glob.LOGGER("[EDIT JRNY] Updated Journeys of {}".format(Username)) print("[EDIT JRNY] Updated Journeys of {}".format(Username)) if 'Private_Journeys' in userRef: index = userRef['Private_Journeys'].index(existingDoc) if index > -1: userRef['Private_Journeys'][index].update(changes) userRef.save() glob.LOGGER( "[EDIT JRNY] Updated Private Journeys of {}".format(Username)) print( "[EDIT JRNY] Updated Private Journeys of {}".format(Username)) glob.LOGGER("[EDIT JRNY] Request handled successfully! Response: 200") print("[EDIT JRNY] Request handled successfully! Response: 200") return HttpResponse(status=200)
def TimeJourneysHandler(req): if not req.body: glob.LOGGER("[TIME JRNY] Invalid Request: Null body") print("[TIME JRNY] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if not 'Username' in body.keys() or not body['Username']: glob.LOGGER("[TIME JRNY] Invalid Request: Missing Username") print("[TIME JRNY] Invalid Request: Missing Username") return HttpResponse(status=400) if not 'Search_Time' in body.keys() or not body['Search_Time']: glob.LOGGER("[TIME JRNY] Invalid Request: Missing Search Time") print("[TIME JRNY] Invalid Request: Missing Search Time") return HttpResponse(status=400) if not 'Search_Type' in body.keys( ) or not body['Search_Type'] or body['Search_Type'] not in ('At', 'Over', 'Under'): glob.LOGGER("[TIME JRNY] Invalid Request: Missing Search Type") print("[TIME JRNY] Invalid Request: Missing Search Type") return HttpResponse(status=400) Username = body['Username'] searchTime = int(body['Search_Time']) if 'Whos_Asking' in body.keys() and body['Whos_Asking']: privileged = bool(body['Username'] == body['Whos_Asking']) glob.LOGGER("[TIME JRNY] Request by {} for {}: \n {}".format( body['Whos_Asking'], Username, body)) print("[TIME JRNY] Request by {} for {}: \n {}".format( body['Whos_Asking'], Username, body)) else: glob.LOGGER("[TIME JRNY] Request for {}: \n {}".format(Username, body)) print("[TIME JRNY] Request for {}: \n {}".format(Username, body)) def SeachTimeInJourneysArray(journeysArray, searchTime, searchType): if searchType == 'At': ''' At / On ''' glob.LOGGER("[TIME JRNY] At request") print("[TIME JRNY] At request") return list(filter(lambda journeyDoc:\ 'Time_In' in journeyDoc and 'Time_Out' in journeyDoc\ and journeyDoc['Time_In'] < searchTime and journeyDoc['Time_Out'] > searchTime\ , journeysArray\ )) elif searchType == 'Under': ''' Under ''' glob.LOGGER("[TIME JRNY] Under request") print("[TIME JRNY] Under request") return list(filter(lambda journeyDoc:\ 'Time_Out' in journeyDoc and journeyDoc['Time_Out'] < searchTime\ , journeysArray\ )) elif searchType == 'Over': ''' Over ''' glob.LOGGER("[TIME JRNY] Over request") print("[TIME JRNY] Over request") return list(filter(lambda journeyDoc:\ 'Time_In' in journeyDoc and journeyDoc['Time_In'] > searchTime\ , journeysArray\ )) try: userRef = glob.COUCH_USER_ACTIVITY[\ ':'.join((glob.PARTITION_KEY_DICT[ Username[0].lower() ], Username))\ ] if 'Private' in body.keys(): ''' Private Journeys ''' res = SeachTimeInJourneysArray(userRef['Private_Journeys'], searchTime, 1) glob.LOGGER( "[TIME JRNY] Request handled successfully! Response: \n {}". format(str(res))) print("[TIME JRNY] Request handled successfully! Response: \n {}". format(str(res))) return JsonResponse(res, safe=False) else: ''' Public Journeys ''' res = SeachTimeInJourneysArray(userRef['Journeys'], searchTime, body['Search_Type']) glob.LOGGER( "[TIME JRNY] Request handled successfully! Response: \n {}". format(str(res))) print("[TIME JRNY] Request handled successfully! Response: \n {}". format(str(res))) return JsonResponse(res, safe=False) except KeyError: glob.LOGGER("[TIME JRNY] User {} has no activity".format(Username)) print("[TIME JRNY] User {} has no activity".format(Username)) glob.LOGGER("[TIME JRNY] Request handled successfully! Response: 204") print("[TIME JRNY] Request handled successfully! Response: 204") return HttpResponse(status=204) except Exception as err: glob.LOGGER("[TIME JRNY] Error: \n {}".format(err)) print("[TIME JRNY] Error: \n {}".format(err)) return HttpResponse(status=500)
def UserJourneysHandler(req): if not req.body: glob.LOGGER("[LIST JRNY] Invalid Request: Null body") print("[LIST JRNY] Invalid Request: Null body") return HttpResponse(status=400) body = JSON.loads(req.body) if not 'Username' in body.keys() or not body['Username']: glob.LOGGER("[LIST JRNY] Invalid Request: Missing Username") print("[LIST JRNY] Invalid Request: Missing Username") return HttpResponse(status=400) Username = body['Username'] res = [] if 'Whos_Asking' in body.keys() and body['Whos_Asking']: privileged = bool(body['Username'] == body['Whos_Asking']) glob.LOGGER("[LIST JRNY] Request by {} for {}: \n {}".format( body['Whos_Asking'], Username, str(body))) print("[LIST JRNY] Request by {} for {}: \n {}".format( body['Whos_Asking'], Username, str(body))) else: glob.LOGGER("[LIST JRNY] Request for {}: \n {}".format( Username, str(body))) print("[LIST JRNY] Request for {}: \n {}".format(Username, str(body))) try: userRef = glob.COUCH_USER_ACTIVITY[\ ':'.join((glob.PARTITION_KEY_DICT[ Username[0].lower() ], Username))\ ]['Journeys'] glob.LOGGER( "[LIST JRNY] User {} has previous journeys".format(Username)) print("[LIST JRNY] User {} has previous journeys".format(Username)) for jDoc in userRef: if 'Train_Number' in jDoc and 'Train_Name' not in jDoc: try: trainQuery = list(\ Train.objects.filter(\ Train_Number = int(jDoc[ 'Train_Number' ])\ ).values_list('Train_Name', flat=True)\ ) jDoc.update({"Train_Name": trainQuery[0]}) except: print("[LIST JRNY] Could not find train {}".format( jDoc['Train_Number'])) res.append(jDoc) # for journeyDoc in userRef: # if 'Train_Number' in journeyDoc and 'Train_Name' not in journeyDoc: # trainRef = glob.COUCH_TRAIN_DATA[ str(journeyDoc[ 'Train_Number' ]) ]['Train_Name'] # journeyDoc['Train_Name'] = trainRef # res.append(journeyDoc) except KeyError: glob.LOGGER( "[LIST JRNY] User {} does not have journeys".format(Username)) print("[LIST JRNY] User {} does not have journeys".format(Username)) except Exception as err: glob.LOGGER("[LIST JRNY] Error: \n {}".format(err)) print("[LIST JRNY] Error: \n {}".format(err)) return HttpResponse(status=500) if 'Private' in body.keys() and bool(body['Private']) and privileged: try: userRef = glob.COUCH_USER_ACTIVITY[\ ':'.join((glob.PARTITION_KEY_DICT[ Username[0].lower() ], Username))\ ]['Private_Journeys'] glob.LOGGER( "[LIST JRNY] User {} has previous Private Journeys".format( Username)) print("[LIST JRNY] User {} has previous Private Journeys".format( Username)) for jDoc in userRef: if 'Train_Number' in jDoc and 'Train_Name' not in jDoc: try: trainQuery = list(\ Train.objects.filter(\ Train_Number = int(jDoc[ 'Train_Number' ])\ ).values_list('Train_Name', flat=True)\ ) jDoc.update({"Train_Name": trainQuery[0]}) except: print("[LIST JRNY] Could not find train {}".format( jDoc['Train_Number'])) res.append(jDoc) # for journeyDoc in userRef: # journeyDoc['Private'] = True # if 'Train_Number' in journeyDoc and 'Train_Name' not in journeyDoc: # trainRef = glob.COUCH_TRAIN_DATA[ str(journeyDoc[ 'Train_Number' ]) ]['Train_Name'] # journeyDoc['Train_Name'] = trainRef # res.append(journeyDoc) except KeyError: glob.LOGGER( "[LIST JRN] User {} does not have Private Journeys".format( Username)) print("[LIST JRN] User {} does not have Private Journeys".format( Username)) except Exception as err: glob.LOGGER("[LIST JRNY] Error: \n {}".format(err)) print("[LIST JRNY] Error: \n {}".format(err)) return HttpResponse(status=500) if not len(res): glob.LOGGER("[LIST JRNY] Request handled successfully! Response: 204") print("[LIST JRNY] Request handled successfully! Response: 204") return JsonResponse([], safe=False, status=204) else: res.sort(key=lambda doc: doc['Date_Time'], reverse=True) glob.LOGGER( "[LIST JRNY] Request handled successfully! Response: \n {}".format( str(res))) print( "[LIST JRNY] Request handled successfully! Response: \n {}".format( str(res))) return JsonResponse(res, safe=False)