def get_incomplete_laps(track_name, session_name): ''' Gets incomplete laps for a track session. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :authorization: Administrators, riders and spectators. :returns: Details of incomplete laps. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'get_incomplete_laps' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check check = api_utils.check_if_not_found(Session, method, session_name) if check != True: return check session = Session.objects.get(name=session_name, track__name=track_name) laps = Lap.objects.filter(session=session, finish__isnull=True) logger.info('%s: %s' % (method, data)) return ApiResult(method, ok=True, data=laps) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def change_rider_for_lap(track_name, session_name, rider_name, start_time, new_rider_name): ''' Changes the rider associated with a lap and its sensor events. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :param rider_name: Name of current rider for lap. :type rider_name: str :param start_time: Start time of lap. :type time: datetime :param new_rider_name: Name of new rider for lap. :type new_rider_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of changed lap. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'change_rider_for_lap' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check check = api_utils.check_if_not_found(Session, method, session_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, new_rider_name) if check != True: return check session = Session.objects.get(name=session_name, track__name=track_name) rider = Rider.objects.get(name=rider_name) new_rider = Rider.objects.get(name=new_rider_name) lap = Lap.objects.get(session=session, rider=rider, \ start__time=start_time) lap.rider = new_rider lap.save() logger.info( 'Changed rider for lap starting: %s from: %s to: %s in session: %s' \ % (start_time, rider_name, new_rider_name, session_name)) return ApiResult(method, ok=True, data=lap) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def change_session(track_name, session_name, new_session_name=None, new_track_name=None): ''' Changes the session or track name. :param track_name: Name of track. :type track_name: str :param session_name: Current session name. Must exist for track. :type session_name: str :param session_name: New unique session name. :type session_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of changed session. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'change_session' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check if not Session.objects.filter(track__name=track_name, name=session_name).exists(): error = 'Session not found' return ApiResult(method, ok=False, data=error) if new_session_name == None and new_track_name == None: error = 'New session or track name is required' # TODO: i18n return ApiResult(method, ok=False, data=error) if new_track_name != None: check = api_utils.check_if_not_found(Track, method, new_track_name) if check != True: return check session = Session.objects.get(name=session_name) if new_session_name != None: if Session.objects.filter(track=session.track, name=new_session_name).exists(): error = 'Session already exists' return ApiResult(method, ok=False, data=error) session.name = new_session_name if new_track_name != None: session.track = Track.objects.get(name=new_track_name) session.save() logger.info('%s: %s' % (method, session.name)) result = ApiResult(method, ok=True, data=session) # TODO: Broadcast return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def change_rider(rider_name, new_rider_name): ''' Changes the riders name. :param rider_name: Current name of rider. :type rider_name: str :param new_rider_name: New unique name of rider. :type new_rider_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of changed rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'change_rider' try: check = api_utils.check_if_found(Rider, method, new_rider_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) rider.name = new_rider_name rider.save() logger.info('%s: %s' % (method, rider.name)) result = ApiResult(method, ok=True, data=rider) # TODO: Broadcast result return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def change_track(track_name, new_track_name=None, new_track_distance=None, new_lap_timeout=None, new_unit_of_measurement=None): ''' Changes track details. :param track_name: Current name of track. :type track_name: str :param new_track_name: New unique name of track. :type new_track_name: str :param new_track_distance: Total track distance. :type new_track_distance: float :param new_lap_timeout: Maximum number of seconds before a lap times out.. :type new_lap_timeout: integer :param new_unit_of_measurement: Unit of measurement, either Metric or Imperial. :type new_unit_of_measurement: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of changed track. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'change_track' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check if new_track_name == None and new_track_distance == None \ and new_lap_timeout == None and new_unit_of_measurement == None: error = 'At least one new track detail is required' # TODO: i18n return ApiResult(method, ok=False, data=error) if new_unit_of_measurement != None \ and new_unit_of_measurement not in dict(settings.UNIT_OF_MEASUREMENT): error = 'Invalid unit of measurement' # TODO: i18n return ApiResult(method, ok=False, data=error) if new_track_name != None: check = api_utils.check_if_found(Track, method, new_track_name) if check != True: return check track = Track.objects.get(name=track_name) if new_track_name != None: track.name = new_track_name if new_track_distance != None: track.distance = new_track_distance if new_lap_timeout != None: track.timeout = new_lap_timeout if new_unit_of_measurement != None: track.unit_of_measurement = new_unit_of_measurement track.save() logger.info('%s: %s' % (method, track.name)) result = ApiResult(method, ok=True, data=track) # TODO: Broadcast result return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_rider(rider_name): ''' Removes a rider, including all track, session and lap data. :param rider_name: Name of rider to be removed. :type rider_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of removed rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'remove_rider' try: check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) rider.delete() logger.info('%s: %s' % (method, rider_name)) result = ApiResult(method, ok=True, data=rider_name) # TODO: Broadcast result return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_rider(rider_name): """ Removes a rider, including all track, session and lap data. :param rider_name: Name of rider to be removed. :type rider_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of removed rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. """ method = "remove_rider" try: check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) rider.delete() logger.info("%s: %s" % (method, rider_name)) result = ApiResult(method, ok=True, data=rider_name) # TODO: Broadcast result return result except Exception as e: logger.error("Exception caught in %s: %s" % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_track(track_name): ''' Removes a track, including all session and lap data. :param track_name: Name of track. :type track_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of removed track. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'remove_track' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check track = Track.objects.get(name=track_name) track.delete() logger.info('%s: %s' % (method, track_name)) result = ApiResult(method, ok=True, data=track_name) # TODO: Broadcast result return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def change_rider(rider_name, new_rider_name): """ Changes the riders name. :param rider_name: Current name of rider. :type rider_name: str :param new_rider_name: New unique name of rider. :type new_rider_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of changed rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. """ method = "change_rider" try: check = api_utils.check_if_found(Rider, method, new_rider_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) rider.name = new_rider_name rider.save() logger.info("%s: %s" % (method, rider.name)) result = ApiResult(method, ok=True, data=rider) # TODO: Broadcast result return result except Exception as e: logger.error("Exception caught in %s: %s" % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def add_session(track_name, session_name): ''' Adds a new session. Session name must be unique for track. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of new session. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'add_session' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check track = Track.objects.get(name=track_name) if Session.objects.filter(track=track, name=session_name).exists(): error = 'Session already exists' return ApiResult(method, ok=False, data=error) session = Session.objects.create(track_id=track.id, name=session_name) logger.info('%s: %s' % (method, session.name)) result = ApiResult(method, ok=True, data=session) # TODO: Broadcast return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_session(track_name, session_name): ''' Removes a session, including all lap data. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of removed session. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'remove_session' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check if not Session.objects.filter(name=session_name, track__name=track_name).exists(): error = 'Session not found' return ApiResult(method, ok=False, data=error) session = Session.objects.get(name=session_name, track__name=track_name) session.delete() logger.info('%s: %s' % (method, session_name)) result = ApiResult(method, ok=True, data=session_name) # TODO: Broadcast return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_lap(track_name, session_name, rider_name, start_time): ''' Removes a lap and associated sensor events. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :param rider_name: Name of rider. :type rider_name: str :param start_time: Start time of lap. :type time: datetime :authorization: Administrators. :broadcast: Administrators, riders and spectators. :returns: Details of removed lap. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'remove_lap' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check check = api_utils.check_if_not_found(Session, method, session_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check session = Session.objects.get(name=session_name, track__name=track_name) rider = Rider.objects.get(name=rider_name) lap = Lap.objects.get(session=session, rider=rider, \ start__time=start_time) lap.delete() events = SensorEvent.objects.filter(lap=lap) events.delete() logger.info('Removed lap starting: %s for rider: %s in session: %s' \ % (start_time, rider_name, session_name)) return ApiResult(method, ok=True, data=lap) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def remove_incomplete_laps(track_name, session_name, rider_name): ''' Removes incomplete laps. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :param rider_name: Name of rider. :type rider_name: str :authorization: Administrators. :broadcast: Administrators, riders, spectators and sensors. :returns: Details of incomplete laps removed. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' # TODO: Role enforcement - admin or current rider only method = 'remove_incomplete_laps' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check check = api_utils.check_if_not_found(Session, method, session_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check session = Session.objects.get(name=session_name, track__name=track_name) rider = Rider.objects.get(name=rider_name) laps = Lap.objects.filter(session=session, rider=rider, \ finish__isnull=True) count = laps.count() laps.delete() logger.info( 'Cancelled %s incomplete laps for rider: %s in session: %s' \ % (count, rider_name, session_name)) return ApiResult(method, ok=True, data=laps) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def get_rider(rider_name): """ Gets a rider. :param rider_name: Name of rider. :type rider_name: str :authorization: Administrators, riders and spectators. :returns: Details of rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. """ method = "get_rider" try: check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) logger.info("%s: %s" % (method, rider_name)) return ApiResult(method, ok=True, data=rider) except Exception as e: logger.error("Exception caught in %s: %s" % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def get_sessions(track_name): ''' Gets all sessions for a track. :param track_name: Name of track. :type track_name: str :authorization: Administrators, riders and spectators. :returns: Details of track sessions. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'get_sessions' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check sessions = Session.objects.filter(track__name=track_name) logger.info('%s: %s' % (method, sessions)) return ApiResult(method, ok=True, data=sessions) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def get_rider(rider_name): ''' Gets a rider. :param rider_name: Name of rider. :type rider_name: str :authorization: Administrators, riders and spectators. :returns: Details of rider. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'get_rider' try: check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check rider = Rider.objects.get(name=rider_name) logger.info('%s: %s' % (method, rider_name)) return ApiResult(method, ok=True, data=rider) except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)
def add_sensor_event(track_name, session_name, rider_name, sensor_name, time): ''' Adds a new sensor event. Depends on sensor position to determine if start, sector or finish time. :param track_name: Name of track. :type track_name: str :param session_name: Name of session. Must exist for track. :type session_name: str :param rider_name: Name of rider. :type rider_name: str :param sensor_name: Name of sensor. Must exist for track. :type sensor_name: str :param time: Local time of sensor event. :type time: datetime :authorization: Administrators and sensors. :broadcast: Administrators, riders, spectators and sensors. :returns: Details of sensor event. :rtype: Instance of :class:`laptimer.models.ApiResult`. ''' method = 'add_sensor_event' try: check = api_utils.check_if_not_found(Track, method, track_name) if check != True: return check check = api_utils.check_if_not_found(Session, method, session_name) if check != True: return check check = api_utils.check_if_not_found(Rider, method, rider_name) if check != True: return check check = api_utils.check_if_not_found(Sensor, method, sensor_name) if check != True: return check if time is None or type(time) is not datetime.datetime: error = 'Time must be valid datetime' # TODO: i18n return ApiResult(method, ok=False, data=error) session = Session.objects.get(name=session_name, track__name=track_name) rider = Rider.objects.get(name=rider_name) sensor = Sensor.objects.get(track__name=track_name, name=sensor_name) if sensor.sensor_pos == settings.SENSOR_POS_START: result = _add_sensor_event_start(method, session, rider, sensor, time) elif sensor.sensor_pos == settings.SENSOR_POS_FINISH: result = _add_sensor_event_finish(method, session, rider, sensor, time) elif sensor.sensor_pos == settings.SENSOR_POS_START_FINISH: result = _add_sensor_event_start_finish(method, session, rider, sensor, time) elif sensor.sensor_pos == settings.SENSOR_POS_SECTOR: result = _add_sensor_event_sector(method, session, rider, sensor, time) else: error = 'Unknown sensor position: %s' % sensor_pos # TODO: i18n result = ApiResult(method, ok=False, data=error) if result.ok: # TODO: Broadcast pass return result except Exception as e: logger.error('Exception caught in %s: %s' % (method, e)) error = type(e).__name__ return ApiResult(method, ok=False, data=error)