def getuser():
    """
    Gets user from database and returns user data as JSON.
    Either 'id' or 'username' must be specified, with 'id'
    taking priority on what will be searched.

    """
    # Get data from JSON
    data = request.get_json()
    # If nethier field is specified, return failure
    if not data.get('id') and not data.get('username'):
        return jsonify(success=False,
                       messages=["Username or id must be specified."])
    # Get user by id if specified
    elif data.get('id'):
        id = str(data.get('id'))
        user = db.collection('users').document(id).get()
        # If user is not found, return failure
        if user.exists is False:
            return jsonify(success=False, messages=["User with id not found."])
    # Get user by username if specified
    elif data.get('username'):
        username = str(data.get('username'))
        user = check_collection_contains(db.collection('users'), 'username',
                                         username)
        if not user:
            return jsonify(success=False, messages=["User with id not found."])
    # Convert user into dictionary
    data = {"id": user.id, "username": user.to_dict()['username']}
    # Return user info in JSON
    return jsonify(data)
def createuser():
    """
    Adds new user to database based on JSON data.

    """
    # Get data
    data = request.get_json()
    # Check that all required fields are included
    if not data.get('username') or not data.get('password'):
        return jsonify(success=False,
                       messages=["Username and password required"])
    # Assign user variables
    username = str(data['username'])
    password = str(data['password'])
    # Check that username is unique
    user = check_collection_contains(db.collection('users'), 'username',
                                     username)
    if user is not None:
        return jsonify(success=False, messages=["Username already taken"])
    # Hash password
    passhash = PasswordHasher().hash(password)
    # Create and add user to database
    db.collection('users').add({'username': username, 'passhash': passhash})
    # Return success
    return jsonify(success=True)
Exemple #3
0
def index():
    code = request.args.get('code')
    if request.method == 'GET':
        country_file = open("app/data/country-by-continent.json")
        countries = json.load(country_file)
        language_file = open("app/data/languages.json", encoding="utf-8")
        languages = json.load(language_file)

        highlightColor = "#e2656b"
        event = db.collection('events').document(code).get().to_dict()

        if event:
            highlightColor = event['fgcolor']

        return render_template('main.html', countries=countries,
                               languages=languages, code=code,
                               highlightColor=highlightColor)

    # it's a POST
    to_insert = request.form.to_dict()
    to_insert['tag'] = code

    if 'condition' in to_insert:
        to_insert["condition"] = True if to_insert["condition"] == 'checked' else False

    db.collection('Information').add(to_insert)

    url = url_for('index')
    if code:
        url += '?code=' + code
    session['back_link'] = url

    return redirect(url_for("thanks"))
def deleteevent():
    """
    Removes specified event from database and deletes all associated warnings.

    """
    # Get data from JSON
    data = request.get_json()
    # Ensure all required fields are provided
    if not data.get('id'):
        return jsonify(success=False, messages=['Event ID required'])
    # Get event
    event = db.collection('events').document(data.get('id')).get()
    # Ensure that event exists
    if not event.exists:
        return jsonify(success=False, messages=['Event does not exist'])
    # Delete event from events
    db.collection('events').document(data.get('id')).delete()
    # Get any warnings for the event and delete them
    warnings = db.collection('event_warnings').where('from_event_id', '==',
                                                     data.get('id')).stream()
    for warning in warnings:
        db.collection('event_warnings').document(warning.id).delete()
    warnings = db.collection('event_warnings').where('to_event_id', '==',
                                                     data.get('id')).stream()
    for warning in warnings:
        db.collection('event_warnings').document(warning.id).delete()
    # Return success
    return jsonify(success=True)
Exemple #5
0
def signup():
    email = request.form['email']
    company = request.form['company']
    password = request.form['password']

    new_user = db.collection('users').document(email)
    new_user.set({'email': email, 'company': company, 'password': password})

    comp = db.collection('companies').document(company).get()
    if not comp.exists:
        new_company = db.collection('companies').document(company)
        new_company.set({'company': company, 'images': []})
    return render_template('login.html')
def getuserevents():
    """
    Gets all events for a given user.

    """
    # Get data from JSON
    data = request.get_json()
    # If nethier field is specified, return failure
    if not data.get('user_id'):
        return jsonify(success=False, messages=["User id must be specified."])
    from_time = None
    to_time = None
    if data.get('from_time'):
        from_time = parser.parse(data.get('from_time'))
    if data.get('to_time'):
        to_time = parser.parse(data.get('to_time'))
    # Query all events for the user sorted by start time and match criterea
    query = db.collection('events')
    query = query.where('user_id', '==', data.get('user_id'))
    if from_time:
        query = query.where('start_time', '>=', from_time)
    if to_time:
        query = query.where('start_time', '<=', to_time)
    query = query.order_by('start_time', direction=firestore.Query.ASCENDING)
    events = query.stream()
    # Query all event warnings for the user that relate to any queried event
    query = db.collection('event_warnings')
    query = query.where('user_id', '==', data.get('user_id'))
    warnings = query.stream()
    # Add events and warnings to dictionary
    data = dict()
    data['events'] = list()
    data['warnings'] = list()
    # Iterate over and add events
    for event in events:
        event_dict = event.to_dict()
        event_dict.update({"id": event.id})
        data['events'].append(event_dict)
    # Iterate over and add warnings
    for warning in warnings:
        warning_dict = warning.to_dict()
        warning_dict.update({"id": warning.id})
        # Only append warning if it relates to one of the events
        if warning_dict['from_event_id'] in map(
                lambda e: e['id'],
                data['events']) or warning_dict['to_event_id'] in map(
                    lambda e: e['id'], data['events']):
            data['warnings'].append(warning_dict)
    # Return event data
    return jsonify(data)
Exemple #7
0
 def query_all_users(self):
   try:
     users = db.collection(u'users').stream()
     return [user.to_dict() for user in users]
   except Exception as e:
     message = "Could not get users from firebase.\n\n{}".format(str(e))
     self.slack_bot.send_message(message=message)
def validateuser():
    """
    Validates that the username and password matches.

    """
    # Get data
    data = request.get_json()
    # Check that all required fields are included
    if not data.get('username') or not data.get('password'):
        return jsonify(success=False,
                       messages=["Username and assword required"])
    # Assign user variables
    username = str(data['username'])
    password = str(data['password'])
    # Get user
    user = check_collection_contains(db.collection('users'), 'username',
                                     username)
    # Check that user exists
    if user is None:
        return jsonify(success=False, messages=["User does not exist"])
    # Verify whether or not password is valid
    try:
        valid = PasswordHasher().verify(user.to_dict()['passhash'], password)
    except VerifyMismatchError:
        return jsonify(success=False, messages=["Invalid password"])
    # Return success
    return jsonify(success=True)
Exemple #9
0
def upload_image():
    upload = request.get_json()
    url = str(upload.get('url'))
    company = str(upload.get('company'))

    comp = db.collection('companies').document(company)
    images = comp.get().to_dict()['images']
    comp.update({'images': images + [url]})
Exemple #10
0
def users():
    _users = db.collection('users').stream()
    users = {}

    for user in _users:
        u = user.to_dict()
        u['role'] = roles[u['role']]
        users[user.id] = u

    return render_template('users.html', users=users)
Exemple #11
0
def retrieveCollection(collectionID):
    debug(f'[retrieveCollection - INFO]: Starting.')
    collectionID = f'{collectionID}'

    if not (collectionID in collectionIDs):
        err = f'[retrieveCollection - ERROR]: Collection name {collectionID} is not a known collection.'
        debug(err)
        return None, err

    col_ref = db.collection(collectionID)
    return col_ref, ''
Exemple #12
0
 def query_all_games(self):
   try:
     games = db.collection(u'games').stream()
     dict_games = []
     for game in games:
       game_id = game.id
       game_dict = game.to_dict()
       game_dict['id'] = game_id
       dict_games.append(game_dict)
     dict_games.sort(key=lambda game: datetime.strptime(game.get('date'), '%a %b %d %Y'))
     return dict_games
   except Exception as e:
     message = "Could not get games from firebase.\n\n{}".format(str(e))
     self.slack_bot.send_message(message=message)
Exemple #13
0
def createDocument(collectionID, documentID, creationData):
    debug(f'[createDocument - INFO]: Starting.')
    collectionID = f'{collectionID}'
    documentID = f'{documentID}'

    doc_ref = db.collection(collectionID).document(documentID)
    doc_ref.set(creationData)
    doc = doc_ref.get()
    if not doc.exists:
        err = f'[retrieveDocument - ERROR]: Document {documentID} does not exist in collection {collectionID}.'
        debug(err)
        return err

    return ''
Exemple #14
0
def retrieveDocument(collectionID, documentID, returnErrorOnNull=False):
    debug(f'[retrieveDocument - INFO]: Starting.')
    collectionID = f'{collectionID}'
    documentID = f'{documentID}'

    if not (collectionID in collectionIDs):
        err = f'[retrieveDocument - ERROR]: Collection name {collectionID} is not a known collection.'
        debug(err)
        return None, None, err

    doc_ref = db.collection(collectionID).document(documentID)
    doc = doc_ref.get()
    if not doc.exists:
        if not returnErrorOnNull:
            doc_ref.set({})
            doc_ref = db.collection(collectionID).document(documentID)
            doc = doc_ref.get()
        else:
            err = f'[retrieveDocument - ERROR]: Document {documentID} does not exist in collection {collectionID}.'
            debug(err)
            return None, None, err

    return doc_ref, doc, ''
Exemple #15
0
def user_add():
    if request.method == 'GET':
        return render_template('user_add.html')

    # it's a POST
    to_insert = request.form.to_dict()
    to_insert['created'] = SERVER_TIMESTAMP
    to_insert['role'] = int(to_insert['role'])
    to_insert['createdby'] = session['user']['username']

    user_ref = db.collection('users').document(to_insert['username'])
    user_ref.set(to_insert)

    session['message'] = 'Successfully modified user.'
    return redirect(url_for('users'))
Exemple #16
0
def addevent():
    """
    Adds event to database. Also generates warnings if events
    have tracel time conflicts.

    """
    # Get data from JSON
    data = request.get_json()
    # Ensure all required fields are provided
    valid = True
    messages = list()
    if not data.get('user_id'):
        valid = False
        messages.append("User id required.")
    if not data.get('title'):
        valid = False
        messages.append("Event title required.")
    if not data.get('start_time'):
        valid = False
        messages.append("Event start datetime required.")
    if not data.get('end_time'):
        valid = False
        messages.append("Event end datetime required.")
    # If given data is invalid, return failure with errors
    if not valid:
        return jsonify(success=False, messages=messages)
    # Add event
    timestmp, added_event = db.collection('events').add({
        'address':
        str(data.get('address')),
        'description':
        str(data.get('description')),
        'start_time':
        parser.parse(data.get('start_time')),
        'end_time':
        parser.parse(data.get('end_time')),
        'title':
        str(data.get('title')),
        'travel_method':
        str(data.get('travel_method')),
        'user_id':
        str(data.get('user_id')),
    })
    # Generate any warnings the added event
    generatewarnings(added_event.get())
    # Return success
    return jsonify(success=True)
Exemple #17
0
def login():
    email = request.form['email']
    password = request.form['password']

    user = db.collection('users').document(email).get()

    if user.exists:
        user_info = user.to_dict()
        correct = user_info['password']

        if re.match(password, correct):
            return render_template('home.html', user=user_info)
        else:
            print("Error: Incorrect password")
            return render_template('login.html')
    else:
        print("Error: No user associated with email.")
        return render_template('login.html')
Exemple #18
0
def getevent():
    """
    Gets event with given ID.

    """
    # Get data from JSON
    data = request.get_json()
    # Ensure all required fields are provided
    if not data.get('id'):
        return jsonify(success=False, messages=['Event ID required'])
    # Get event
    event = db.collection('events').document(data.get('id')).get()
    # Ensure that event exists
    if not event.exists:
        return jsonify(success=False, messages=['Event does not exist'])
    # Get event data
    data = {"id": event.id}
    data.update(event.to_dict())
    # Return event
    return jsonify(data)
Exemple #19
0
def partners():
    if request.method == 'GET':
        return render_template('partner.html')

    # it's a POST
    to_insert = request.form.to_dict()
    to_insert['timestamp'] = SERVER_TIMESTAMP
    to_insert['datestart'] = datestr_to_datetime(to_insert['datestart'])
    to_insert['dateend'] = datestr_to_datetime(to_insert['dateend'])

    print(request.files.to_dict())
    if 'logo' in request.files:
        file = request.files['logo']
        if file.filename != '':
            filename = secure_filename(file.filename)
            fs_loc = join(app.config['UPLOAD_FOLDER'], filename)
            file.save(fs_loc)
            to_insert['filename'] = filename
            bucket.blob(filename).upload_from_filename(fs_loc)
            remove(fs_loc)

    event_ref = db.collection('events').document(to_insert['code'])
    event_ref.set(to_insert)
    return render_template('partner_success.html', data=request.form.to_dict())
Exemple #20
0
def login():
    if request.method == 'GET':
        if 'message' in session:
            return render_template('login.html', message=session['message'])
        else:
            return render_template('login.html')

    # it's a POST
    to_verify = request.form.to_dict()
    candidate = db.collection('users').document(
        to_verify['username']).get().to_dict()
    if candidate:
        if to_verify['password'] == candidate['password']:
            if 'message' in session:
                del session['message']

            session['user'] = candidate
            if candidate['role'] == 2:  # partner
                return redirect(url_for('partners'))
            elif candidate['role'] == 1:  # admin
                return redirect(url_for('users'))

    session['message'] = 'Authentication failed.'
    return redirect(url_for('login'))
Exemple #21
0
def init_db_collection(name):
    # Initialize db collection
    return db.collection(name)
def add_game(player_id):
  current_player = None
  form = GameForm(request.form)

  for player in stats_builder.users:
    if player_id == player.get('uid'):
      current_player = player
      break

  if current_player:
    form.isCaptain.data = False
    form.loserScore.data = 0
    form.totalInnings.data =0
    form.error.data = 0
    form.pitchingStrikeouts.data = 0
    form.blownSaves.data = 0
    form.inningsPitched.data = 0
    form.loss.data = 0
    form.winnerScore.data = 0
    form.selectedOpponent.data = ''
    form.saves.data = 0
    form.baseOnBalls.data = 0
    form.hitByPitch.data = 0
    form.outs.data = 0
    form.singles.data = 0
    form.win.data = 0
    form.isGameWon.data = False
    form.runsBattedIn.data = 0
    form.earnedRuns.data = 0
    form.strikeouts.data = 0
    form.stolenBases.data = 0
    form.homeRuns.data = 0
    form.pitchingBaseOnBalls.data = 0
    form.caughtStealing.data = 0
    form.triples.data = 0
    form.runs.data = 0
    form.player.data = f'{current_player.get("firstName")} {current_player.get("lastName")}'
    form.doubles.data = 0

    if request.method == 'POST' and form.validate():

      # do the api call
      try:
        if not request.form['date']:
          raise Exception('No date provided')

        date = datetime.strptime(request.form['date'], '%Y-%m-%d')

        new_game = {
          'date': date.strftime('%a %b %d %Y'),
          'timestamp': int(date.timestamp()),
          'uid': player_id,
          'isCaptain': request.form.get('isCaptain', False) == 'y',
          'loserScore': int(request.form['loserScore']),
          'totalInnings': int(request.form['totalInnings']),
          'error': int(request.form['error']),
          'pitchingStrikeouts': int(request.form['pitchingStrikeouts']),
          'blownSaves': int(request.form['blownSaves']),
          'inningsPitched': int(request.form['inningsPitched']),
          'loss': int(request.form['loss']),
          'winnerScore': int(request.form['winnerScore']),
          'selectedOpponent': str(request.form['selectedOpponent']),
          'saves': int(request.form['saves']),
          'baseOnBalls': int(request.form['baseOnBalls']),
          'hitByPitch': int(request.form['hitByPitch']),
          'outs': int(request.form['outs']),
          'singles': int(request.form['singles']),
          'win': int(request.form['win']),
          'isGameWon': request.form.get('isGameWon', False) == 'y',
          'runsBattedIn': int(request.form['runsBattedIn']),
          'earnedRuns': int(request.form['earnedRuns']),
          'strikeouts': int(request.form['strikeouts']),
          'stolenBases': int(request.form['stolenBases']),
          'homeRuns': int(request.form['homeRuns']),
          'pitchingBaseOnBalls': int(request.form['pitchingBaseOnBalls']),
          'caughtStealing': int(request.form['caughtStealing']),
          'triples': int(request.form['triples']),
          'runs': int(request.form['runs']),
          'player': str(request.form['player']),
          'doubles': int(request.form['doubles']),
        }

        db.collection(u'games').add(new_game)
      except Exception as e:
        flash('Adding game failed, try again', 'error')

        if str(e) == 'No date provided':
          flash(str(e), 'error')
        return redirect(url_for('index'))

      flash('Game added', 'success')
      return redirect(url_for('index'))
  else: 
    return "no data"

  return render_template('add_game.html', form=form, player=current_player)
def game(game_id):
  game = None
  form = GameForm(request.form)

  for player_game in stats_builder.games:
    if game_id == player_game.get('id'):
      game = player_game
      break

  if game:
    form.isCaptain.data = game.get('isCaptain')
    form.loserScore.data = game.get('loserScore')
    form.totalInnings.data = game.get('totalInnings')
    form.error.data = game.get('error')
    form.pitchingStrikeouts.data = game.get('pitchingStrikeouts')
    form.blownSaves.data = game.get('blownSaves')
    form.inningsPitched.data = game.get('inningsPitched')
    form.loss.data = game.get('loss')
    form.winnerScore.data = game.get('winnerScore')
    form.selectedOpponent.data = game.get('selectedOpponent', '')
    form.saves.data = game.get('saves')
    form.baseOnBalls.data = game.get('baseOnBalls')
    form.hitByPitch.data = game.get('hitByPitch')
    form.outs.data = game.get('outs')
    form.singles.data = game.get('singles')
    form.win.data = game.get('win')
    form.isGameWon.data = game.get('isGameWon')
    form.runsBattedIn.data = game.get('runsBattedIn')
    form.earnedRuns.data = game.get('earnedRuns')
    form.strikeouts.data = game.get('strikeouts')
    form.stolenBases.data = game.get('stolenBases')
    form.homeRuns.data = game.get('homeRuns')
    form.pitchingBaseOnBalls.data = game.get('pitchingBaseOnBalls')
    form.caughtStealing.data = game.get('caughtStealing')
    form.triples.data = game.get('triples')
    form.runs.data = game.get('runs')
    form.player.data = game.get('player', '')
    form.doubles.data = game.get('doubles')

    if request.method == 'POST' and form.validate():

      # do the api call
      try:
        updated_game = {
          'isCaptain': request.form.get('isCaptain', False) == 'y',
          'loserScore': int(request.form['loserScore']),
          'totalInnings': int(request.form['totalInnings']),
          'error': int(request.form['error']),
          'pitchingStrikeouts': int(request.form['pitchingStrikeouts']),
          'blownSaves': int(request.form['blownSaves']),
          'inningsPitched': int(request.form['inningsPitched']),
          'loss': int(request.form['loss']),
          'winnerScore': int(request.form['winnerScore']),
          'selectedOpponent': str(request.form['selectedOpponent']),
          'saves': int(request.form['saves']),
          'baseOnBalls': int(request.form['baseOnBalls']),
          'hitByPitch': int(request.form['hitByPitch']),
          'outs': int(request.form['outs']),
          'singles': int(request.form['singles']),
          'win': int(request.form['win']),
          'isGameWon': request.form.get('isGameWon', False) == 'y',
          'runsBattedIn': int(request.form['runsBattedIn']),
          'earnedRuns': int(request.form['earnedRuns']),
          'strikeouts': int(request.form['strikeouts']),
          'stolenBases': int(request.form['stolenBases']),
          'homeRuns': int(request.form['homeRuns']),
          'pitchingBaseOnBalls': int(request.form['pitchingBaseOnBalls']),
          'caughtStealing': int(request.form['caughtStealing']),
          'triples': int(request.form['triples']),
          'runs': int(request.form['runs']),
          'player': str(request.form['player']),
          'doubles': int(request.form['doubles']),
        }

        db.collection(u'games').document(u'{}'.format(game_id)).update(updated_game)
      except Exception as e:
        flash('Game update failed, try again', 'error')
        return redirect(url_for('index'))


      flash('Game updated', 'success')
      return redirect(url_for('index'))

    return render_template('game.html', game=game, form=form)
  else: 
    return "no game data"
Exemple #24
0
def cache():
    cache = db.collection('cached').document("analytics").get()
    return cache.to_dict()
Exemple #25
0
todo_items = {'todo1':True, 'todo222':False,'just simple to do':True}
todos = [TodoItem('This is a mock todo that has not been completed yet',False, datetime.datetime.now())]
init = False

#mock data
ButtonPressed = 0

#mock data
currentUser = None

# Initialize Firestore DB
# cred = credentials.Certificate('key.json')
cred = credentials.Certificate(key_json_file_path)
default_app = initialize_app(cred)
db = firestore.client()
todo_ref = db.collection('todos')


def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

def query_db(query, args=(), one=False):
    cur = get_db().execute(query, args)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

#create a todo in database
Exemple #26
0
def generatewarnings(event_now):
    """
    Generates warnings if given event produces any time conflicts.

    """
    # Get user id of given event
    event_user_id = event_now.to_dict()['user_id']
    # Query all events for the user in order of start time
    query = db.collection('events')
    query = query.where('user_id', '==', event_user_id)
    query = query.order_by('start_time', direction=firestore.Query.ASCENDING)
    events = query.stream()
    # Iterate over each event and find any events before or after this one
    event_before = None
    event_after = None
    prev_event = None
    for event in events:
        if event.id == event_now.id:
            event_before = prev_event
        elif event_before is not None:
            event_after = event
            break
        prev_event = event
    # Get dictionaries for each event
    if event_before:
        event_before_dict = event_before.to_dict()
    if event_now:
        event_now_dict = event_now.to_dict()
    if event_after:
        event_after_dict = event_after.to_dict()
    # Call Google maps directions API to get the times between the events
    travel_time_to = timedelta(0)
    travel_time_from = timedelta(0)
    if event_before is not None:
        travel_time_to = timebetweenevents(event_before, event_now)
    if event_after is not None:
        travel_time_from = timebetweenevents(event_now, event_after)
    # Check for time conflicts between before and current events
    if event_before is not None:
        # Calculate the time between the events
        time_between_events = (event_now_dict['start_time'] -
                               event_before_dict['end_time'])
        # Check if the next event starts before the previous ends
        if time_between_events < timedelta(0):
            warning_message = (
                f"The start time for \"{event_now_dict['title']}\" is before "
                f"the end time for event \"{event_before_dict['title']}\". "
                f"Consider rescheduling these events to account for this.")
            db.collection('event_warnings').add({
                'from_event_id': event_before.id,
                'to_event_id': event_now.id,
                'user_id': event_user_id,
                'message': warning_message
            })
        # Check if the travel method permits arrival to the event on time
        elif time_between_events < (travel_time_to - timedelta(minutes=1)):
            diff_min = int(
                (travel_time_to - time_between_events).total_seconds() // 60)
            warning_message = (
                f"Time to get from event \"{event_before_dict['title']}\""
                f" to \"{event_now_dict['title']}\" by "
                f"{event_before_dict['travel_method']} is {diff_min} "
                f"minutes more than between the end of first event and start "
                f"of the second event. Consider rescheduling events or "
                f"changing mode of transport.")
            db.collection('event_warnings').add({
                'from_event_id': event_before.id,
                'to_event_id': event_now.id,
                'user_id': event_user_id,
                'message': warning_message
            })
    # Check for time conflicts between current and after events
    if event_after is not None:
        # Calculate the time between the events
        time_between_events = (event_after_dict['start_time'] -
                               event_now_dict['end_time'])
        # Check if the next event starts before the previous ends
        if time_between_events < timedelta(0):
            warning_message = (
                f"The start time for \"{event_after_dict['title']}\" is before"
                f" the end time for event \"{event_now_dict['title']}\". "
                f"Consider rescheduling these events to account for this.")
            db.collection('event_warnings').add({
                'from_event_id': event_before.id,
                'to_event_id': event_now.id,
                'user_id': event_user_id,
                'message': warning_message
            })
        # Check if the travel method permits arrival to the event on time
        elif time_between_events < (travel_time_from - timedelta(minutes=1)):
            diff_min = int(
                (travel_time_to - time_between_events).total_seconds() // 60)
            warning_message = (
                f"Time to get from event \"{event_now_dict['title']}\" "
                f"to \"{event_after_dict['title']}\" by "
                f"{event_now_dict['travel_method']} is {diff_min} "
                f"minutes more than between the end of first event and start "
                f"of the second event. Consider rescheduling events or "
                f"changing mode of transport.")
            db.collection('event_warnings').add({
                'from_event_id': event_now.id,
                'to_event_id': event_after.id,
                'user_id': event_user_id,
                'message': warning_message
            })