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)
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)
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
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)
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')
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)