def test_filter_messages_by_sender_firstname_lastname(self):
     # Add dummy messages
     Message.generate_fake(10)
     # Remove any message with (possibly) matching names.
     Message.objects(
         Q(sender_firstname__icontains='john')
         | Q(sender_lastname__icontains='john')).delete()
     # Add 2 legit messages
     Message(sender_firstname='doe', sender_lastname='john').save()
     Message(sender_firstname='johnathen', sender_lastname='angel').save()
     # Get messages
     msgs = procedures.filter_messages(name='john')
     self.assertEqual(len(msgs), 2)
Esempio n. 2
0
def filtering():
    """
    This function displays the form for getting filtering criteria from the user
     and redirects user  to the page containing filtered messages.
    :return: ../filtered_messages
    """
    form = FilteringForm(time_int_field='',
                         text_field='',
                         fn_ln_field='',
                         bot_field=0,
                         time_field=0,
                         username_field='')
    # Populate form fields initially.
    form.bot_field.choices = [(0, 'Select an option')] + list(
        MyBot.objects().all().values_list('bot_id', 'username'))
    form.username_field.choices = \
        [('#', 'Select')] + \
        list(Message.objects(sender_username__nin=['unknown', ''])
             .values_list('sender_username', 'sender_username'))

    if form.validate_on_submit():
        # Get filtering criteria from the submitted form.
        try:
            if int(form.time_field.data) > 0:
                time_offset = form.time_field.data
            elif int(form.time_int_field.data) > 0:
                time_offset = form.time_int_field.data
            else:
                time_offset = int(time.time()) / 60
            # Redirect to page showing filtered message.
            web_logger.info('User redirected to filtered messages page with '
                            'given criteria: botid:{bid},time_off:{tim},'
                            'text:{txt},username:{uname},name:{name}'.format(
                                bid=form.bot_field.data,
                                tim=time_offset,
                                txt=form.text_field.data,
                                uname=form.username_field.data,
                                name=form.fn_ln_field.data))
            return redirect(
                url_for('.filtered_messages',
                        botid=int(form.bot_field.data)
                        if form.bot_field.data != '' else '#',
                        time_off=time_offset,
                        text=form.text_field.data
                        if form.text_field.data != '' else '#',
                        username=form.username_field.data,
                        name=form.fn_ln_field.data
                        if form.fn_ln_field.data != '' else '#'))
        except Exception as e:
            web_logger.error('Error:{msg} during redirecting user to filtered'
                             ' messages page.'.format(msg=e.message))
            return render_template('500.html', error_message=e.message)

    return render_template('filtering.html', form=form)
Esempio n. 3
0
def filter_messages(time_min=0, botid=None, text='#', username=None, name='#'):
    """
    This function filters the messages logged by Bots based on the 5 given
    fields.
    :param time_min: Time (in minutes) for filtering messages by date.
    :param botid: ID of bot from which message was received.
    :param text: Message text (partially matched.)
    :param username: Senders username (exactly matched.)
    :param name: Sender's firstname or lastname (partially matched.)
    :return messages: Query Set containing filtered messages.
    """
    time_min = time_min if time_min > 0 else int(time.time()) / 60
    if botid:
        msgs = Message.objects(bot_id=int(botid),
                               date__gt=datetime.now() -
                               timedelta(minutes=time_min)).order_by('-date')
    else:
        msgs = Message.objects(date__gt=datetime.now() -
                               timedelta(minutes=time_min)).order_by('-date')
    if msgs is None:
        return None
    if text and text != '#':  # Wildcards
        msgs = msgs.filter(Q(text_content__icontains=text))
    if username is not None and username != '#':  # Wildcards
        msgs = msgs.filter(Q(sender_username__iexact=username))
    if name and name != '#':  # Wildcards
        msgs = msgs.filter(
            Q(sender_lastname__icontains=name)
            | Q(sender_firstname__icontains=name))
    proc_logger.info(
        '{count} messages filtered for criteria.botid:{botid}, time(in minutes)'
        ':{time_min}, text:{text}, username={uname},name:{name}'.format(
            count=len(msgs),
            botid=botid,
            time_min=time_min,
            uname=username,
            text=text,
            name=name))
    return msgs
Esempio n. 4
0
 def test_message_creation(self):
     m_id = random.randint(1, 100000)
     Message(msg_id=m_id,
             date=datetime.now(),
             sender_username='******',
             sender_firstname='test',
             sender_lastname='sender',
             chatid=random.randint(1, 1000),
             text_content='text message',
             bot_id=random.randint(1, 25)).save()
     msg = Message.objects(msg_id=m_id).first()
     self.assertIsNotNone(msg)
     self.assertEqual(msg.sender_username, 'test_sender')
     self.assertEqual(msg.sender_firstname, 'test')
     self.assertEqual(msg.sender_lastname, 'sender')
     self.assertEqual(msg.text_content, 'text message')
     self.assertEqual(Message.objects.count(), 1)
Esempio n. 5
0
class FilteringForm(FlaskForm):
    """
    FlaskForm for setting up form for filtering logged messages.
    :parameter bot_field: Drop-down list containing all bots in the databases.
    :parameter time_field: Drop-down list for choosing time for filtering.
    :parameter time_int_field: Input field for getting time (in minutes) for
    filtering.
    :parameter text_field: Input field for entering text for filtering.
    :parameter username_field: Usernames of all users from which messages
    were recieved.
    :parameter name_field: (Partial) name for sender's firstname, lastname.
    """
    bot_field = SelectField(
        'Choose Bot',
        coerce=int,
        choices=[(0, 'Select an option')] +
        list(MyBot.objects().all().values_list('bot_id', 'username')))

    time_field = SelectField('Time',
                             coerce=int,
                             choices=[(0, 'Choose'), (10, '10 minutes'),
                                      (30, '30 minutes'), (60, '60 minutes')])

    time_int_field = IntegerField(
        'Enter time (in Minutes)',
        validators=[
            NumberRange(0,
                        int(time.time()) / 60,
                        message="Please enter valid time or 0.")
        ])

    text_field = StringField('Text (contains)')

    username_field = SelectField(
        'Sender username',
        coerce=str,
        choices=[('#', 'Select')] + list(
            Message.objects(sender_username__nin=['unknown', '']).values_list(
                'sender_username', 'sender_username')))
    fn_ln_field = StringField('First name/ Last name (contains)')
    submit = SubmitField('Filter')
Esempio n. 6
0
    def test_get_bot_info(self):
        base_address = 'http://127.0.0.1:5000/web/index'
        # Add a special bot and some expected messages.
        bot = MyBot(bot_id=123456,
                    username='******',
                    token='special-dummy-token',
                    first_name='special',
                    last_name='bot').save()
        for i in range(5):
            Message(bot_id=bot.bot_id, text_content='message' + str(i)).save()

        # navigate to home page
        self.client.get(base_address)
        # Navigate to filtering page
        self.client.find_element_by_link_text('Get-Bot-Info').click()
        self.assertTrue(
            re.search('Get Bot Information', self.client.page_source,
                      re.IGNORECASE))

        self.client.find_element_by_name('choose_bot').send_keys(bot.username)
        self.client.find_element_by_name('submit').click()

        # Redirected to bot information page. Make Assertions.
        self.assertTrue(
            re.search(bot.username, self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search(
                '{fname}\s+{lname}'.format(fname=bot.first_name,
                                           lname=bot.last_name),
                self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search('Token:\s+{token}'.format(token=bot.token),
                      self.client.page_source, re.IGNORECASE))
        msgs = Message.objects(bot_id=bot.bot_id).all()
        for msg in msgs:
            self.assertTrue(msg.text_content in self.client.page_source)