def test_exception_propagation(monkeypatch): schedule_messages('text', recipients('telegram', '')) schedule_messages('text', recipients('telegram', '')) def new_method(*args, **kwargs): raise Exception('telegram beforesend failed') monkeypatch.setattr(messenger_telegram, 'before_send', new_method) send_scheduled_messages() errors = list(DispatchError.objects.all()) assert len(errors) == 2 assert errors[0].error_log == 'telegram beforesend failed' assert errors[1].error_log == 'telegram beforesend failed'
def test_sitemessage_check_undelivered(capsys, command_run): message = Message(cls='test_message') message.save() Dispatch.create(message, recipients('test_messenger', 'someoner')) dispatch = Dispatch.objects.all() assert len(dispatch) == 1 dispatch = dispatch[0] dispatch.dispatch_status = dispatch.DISPATCH_STATUS_FAILED dispatch.save() def run_command(count=1): command_run('sitemessage_check_undelivered') out, err = capsys.readouterr() assert f'Undelivered dispatches count: {count}' in out assert err == '' run_command() # Now let's check a fallback works. try: GET_DISPATCHES_ARGS[0] = lambda kwargs: None run_command(3) assert GET_DISPATCHES_ARGS[0] is _get_dispatches finally: GET_DISPATCHES_ARGS[0] = _get_dispatches_for_update
def setup(self, user, request_client): def catcher_success(*args, **kwargs): self.status = self.STATUS_SUCCESS self.catcher_success = catcher_success def catcher_fail(*args, **kwargs): self.status = self.STATUS_FAIL self.catcher_fail = catcher_fail self.user = user self.request_client = request_client() msg_type = MessagePlainForTest('sometext') self.msg_type = msg_type msg_model, _ = schedule_messages(msg_type, recipients(MessengerForTest, user))[0] dispatch = Dispatch.objects.all()[0] self.msg_model = msg_model self.dispatch = dispatch dispatch_hash = msg_type.get_dispatch_hash(dispatch.id, msg_model.id) self.dispatch_hash = dispatch_hash
def test_schedule_message(user): msg = MessagePlainForTest('schedule_func') model, _ = schedule_messages(msg)[0] assert model.cls == msg.get_alias() assert model.context == msg.get_context() assert model.priority == MessagePlainForTest.priority assert not model.dispatches_ready msg = MessagePlainForTest('schedule_func') model, _ = schedule_messages(msg, priority=33)[0] assert model.cls == msg.get_alias() assert model.context == msg.get_context() assert model.priority == 33 assert not model.dispatches_ready model, dispatch_models = \ schedule_messages( 'simple message', recipients('test_messenger', ['gogi', 'givi']), sender=user)[0] assert model.cls == 'plain' assert model.context == {'use_tpl': False, MessageBase.SIMPLE_TEXT_ID: 'simple message', 'tpl': None} assert model.sender == user assert model.dispatches_ready assert len(dispatch_models) == 2 assert dispatch_models[0].address == 'gogi%s' % WONDERLAND_DOMAIN assert dispatch_models[0].messenger == 'test_messenger'
def test_schedule_message(user): msg = MessagePlainForTest('schedule_func') model, _ = schedule_messages(msg)[0] assert model.cls == msg.get_alias() assert model.context == msg.get_context() assert model.priority == MessagePlainForTest.priority assert not model.dispatches_ready msg = MessagePlainForTest('schedule_func') model, _ = schedule_messages(msg, priority=33)[0] assert model.cls == msg.get_alias() assert model.context == msg.get_context() assert model.priority == 33 assert not model.dispatches_ready model, dispatch_models = \ schedule_messages( 'simple message', recipients('test_messenger', ['gogi', 'givi']), sender=user)[0] assert model.cls == 'plain' assert model.context == {'use_tpl': False, MessageBase.SIMPLE_TEXT_ID: 'simple message', 'tpl': None} assert model.sender == user assert model.dispatches_ready assert len(dispatch_models) == 2 assert dispatch_models[0].address == f'gogi{WONDERLAND_DOMAIN}' assert dispatch_models[0].messenger == 'test_messenger'
def test_send_scheduled_messages(): # This one won't count, as won't fit into message priority filter. schedule_messages( MessagePlainDynamicForTest('my_dyn_msg'), recipients('test_messenger', ['three', 'four'])) msgr = get_registered_messenger_object('test_messenger') # type: MessengerForTest msg = MessagePlainForTest('my_message') schedule_messages(msg, recipients(msgr, ['one', 'two'])) send_scheduled_messages(priority=MessagePlainForTest.priority) assert len(msgr.last_send['dispatch_models']) == 2 assert msgr.last_send['message_model'].cls == 'testplain' assert msgr.last_send['message_cls'] == MessagePlainForTest assert msgr.last_send['dispatch_models'][0].message_cache == 'my_message' assert msgr.last_send['dispatch_models'][1].message_cache == 'my_message'
def schedule_email(message, to, subject=None, sender=None, priority=None): """Schedules an email message for delivery. :param dict, str message: str or dict: use str for simple text email; dict - to compile email from a template (default: `sitemessage/messages/email_html__smtp.html`). :param list|str|unicode to: recipients addresses or Django User model heir instances :param str subject: email subject :param User sender: User model heir instance :param int priority: number describing message priority. If set overrides priority provided with message type. """ if SHORTCUT_EMAIL_MESSAGE_TYPE: message_cls = get_registered_message_type(SHORTCUT_EMAIL_MESSAGE_TYPE) else: if isinstance(message, dict): message_cls = EmailHtmlMessage else: message_cls = EmailTextMessage schedule_messages(message_cls(subject, message), recipients(SHORTCUT_EMAIL_MESSENGER_TYPE, to), sender=sender, priority=priority)
def test_send(self): schedule_messages('text', recipients('fb', '')) send_scheduled_messages() assert_called_n(messenger_fb.lib.post) assert messenger_fb.lib.post.call_args[1]['proxies'] == { 'https': '0.0.0.0' }
def test_send(self): schedule_messages('text', recipients('telegram', '1234567')) send_scheduled_messages() assert_called_n(messenger_telegram.lib.post, 2) assert messenger_telegram.lib.post.call_args[1]['proxies'] == { 'https': 'socks5://user:pass@host:port' }
def test_create(self, user): message = Message(cls='test_message') message.save() recipients_ = recipients('test_messenger', [user]) recipients_ += recipients('buggy', 'idle') dispatches = Dispatch.create(message, recipients_) assert isinstance(dispatches[0], Dispatch) assert isinstance(dispatches[1], Dispatch) assert dispatches[0].message_id == message.id assert dispatches[1].message_id == message.id assert dispatches[0].messenger == 'test_messenger' assert dispatches[1].messenger == 'buggy' dispatches = Dispatch.create(message, Recipient('msgr', None, 'address')) assert len(dispatches) == 1
def test_send_scheduled_messages_dynamic_context(): msgr = get_registered_messenger_object('test_messenger') # type: MessengerForTest msg_dyn = MessagePlainDynamicForTest('my_dyn_msg') schedule_messages(msg_dyn, recipients(msgr, ['three', 'four'])) send_scheduled_messages() assert len(msgr.last_send['dispatch_models']) == 2 assert msgr.last_send['message_model'].cls == 'testplain_dyn' assert msgr.last_send['message_cls'] == MessagePlainDynamicForTest assert msgr.last_send['dispatch_models'][0].message_cache == f'my_dyn_msg -- three{WONDERLAND_DOMAIN}' assert msgr.last_send['dispatch_models'][1].message_cache == f'my_dyn_msg -- four{WONDERLAND_DOMAIN}'
def schedule_facebook_message(message, sender=None, priority=None): """Schedules Facebook wall message for delivery. :param str message: text or URL to publish. :param User sender: User model heir instance :param int priority: number describing message priority. If set overrides priority provided with message type. """ schedule_messages(message, recipients('fb', ''), sender=sender, priority=priority)
def test_send_scheduled_messages_dynamic_context(): msgr = get_registered_messenger_object('test_messenger') # type: MessengerForTest msg_dyn = MessagePlainDynamicForTest('my_dyn_msg') schedule_messages(msg_dyn, recipients(msgr, ['three', 'four'])) send_scheduled_messages() assert len(msgr.last_send['dispatch_models']) == 2 assert msgr.last_send['message_model'].cls == 'testplain_dyn' assert msgr.last_send['message_cls'] == MessagePlainDynamicForTest assert msgr.last_send['dispatch_models'][0].message_cache == 'my_dyn_msg -- three%s' % WONDERLAND_DOMAIN assert msgr.last_send['dispatch_models'][1].message_cache == 'my_dyn_msg -- four%s' % WONDERLAND_DOMAIN
def schedule_telegram_message(message, to, sender=None, priority=None): """Schedules Telegram message for delivery. :param str message: text to send. :param list|str|unicode to: recipients addresses or Django User model heir instances with `telegram` attributes. :param User sender: User model heir instance :param int priority: number describing message priority. If set overrides priority provided with message type. """ schedule_messages(message, recipients('telegram', to), sender=sender, priority=priority)
def schedule_vkontakte_message(message, to, sender=None, priority=None): """Schedules VKontakte message for delivery. :param str message: text or URL to publish on wall. :param list|str|unicode to: recipients addresses or Django User model heir instances with `vk` attributes. :param User sender: User model heir instance :param int priority: number describing message priority. If set overrides priority provided with message type. """ schedule_messages(message, recipients('vk', to), sender=sender, priority=priority)
def test_recipients(user_create): user = user_create(attributes=dict(username='******')) to = ['gogi', 'givi', user] r1 = recipients('test_messenger', to) assert len(r1) == len(to) assert r1[0].address == 'gogi%s' % WONDERLAND_DOMAIN assert r1[0].messenger == 'test_messenger' assert r1[1].address == 'givi%s' % WONDERLAND_DOMAIN assert r1[1].messenger == 'test_messenger' assert r1[2].address == 'user_myuser%s' % WONDERLAND_DOMAIN assert r1[2].messenger == 'test_messenger'
def test_recipients(user_create): user = user_create(attributes=dict(username='******')) to = ['gogi', 'givi', user] r1 = recipients('test_messenger', to) assert len(r1) == len(to) assert r1[0].address == f'gogi{WONDERLAND_DOMAIN}' assert r1[0].messenger == 'test_messenger' assert r1[1].address == f'givi{WONDERLAND_DOMAIN}' assert r1[1].messenger == 'test_messenger' assert r1[2].address == f'user_myuser{WONDERLAND_DOMAIN}' assert r1[2].messenger == 'test_messenger'
def test_send(): m = MessengerForTest('l', 'p') m.send('message_cls', 'message_model', 'dispatch_models') assert m.last_send['message_cls'] == 'message_cls' assert m.last_send['message_model'] == 'message_model' assert m.last_send['dispatch_models'] == 'dispatch_models' m = BuggyMessenger() recipiets_ = recipients('test_messenger', ['a', 'b', 'c', 'd']) with pytest.raises(Exception): m.send('a buggy message', '', recipiets_)
def notify_new_entity(entity): """Отсылает оповещение о создании новой сущности. Рассылается администраторам проекта. :param RealmBaseModel entity: :return: """ context = { 'entity_title': entity.title, 'entity_url': entity.get_absolute_url() } m = PythonzEmailNewEntity(get_email_full_subject('Добавлена новая сущность - %s' % entity.title), context) schedule_messages(m, recipients('smtp', get_admins_emails()))
def notify_entity_published(entity): """Отсылает оповещение о публикации сущности. :param RealmBaseModel entity: :return: """ MAX_LEN = 139 # Максимальная длина тивта. Для верности меньше. prefix = 'Новое: %s «' % entity.get_verbose_name() url = 'http://pythonz.net%s' % entity.get_absolute_url() postfix = '» %s' % url if settings.AGRESSIVE_MODE: postfix = '%s #python #dev' % postfix title = Truncator(entity.title).chars(MAX_LEN - len(prefix) - len(postfix)) message = '%s%s%s' % (prefix, title, postfix) schedule_messages(PythonzTwitterMessage(message), recipients('twitter', ''))
def test_send_fail(self): schedule_messages('text', recipients('smtp', 'someone')) def new_method(*args, **kwargs): raise Exception('smtp failed') old_method = messenger_smtp.smtp.sendmail messenger_smtp.smtp.sendmail = new_method try: send_scheduled_messages() errors = DispatchError.objects.all() assert len(errors) == 1 assert errors[0].error_log == 'smtp failed' assert errors[0].dispatch.address == 'someone' finally: messenger_smtp.smtp.sendmail = old_method
def test_send_fail(self): schedule_messages('text', recipients('vk', '12345')) def new_method(*args, **kwargs): raise Exception('vk failed') old_method = messenger_vk.lib.post messenger_vk.lib.post = new_method try: send_scheduled_messages() errors = DispatchError.objects.all() assert len(errors) == 1 assert errors[0].error_log == 'vk failed' assert errors[0].dispatch.address == '12345' finally: messenger_vk.lib.post = old_method
def test_send_fail(self): schedule_messages('text', recipients('twitter', 'someone')) def new_method(*args, **kwargs): raise Exception('tweet failed') old_method = messenger_twitter.api.statuses.update messenger_twitter.api.statuses.update = new_method try: send_scheduled_messages() errors = DispatchError.objects.all() assert len(errors) == 1 assert errors[0].error_log == 'tweet failed' assert errors[0].dispatch.address == 'someone' finally: messenger_twitter.api.statuses.update = old_method
def test_send_fail(self): schedule_messages('text', recipients('xmppsleek', 'someone')) def new_method(*args, **kwargs): raise Exception('xmppsleek failed') old_method = messenger_xmpp.xmpp.send_message messenger_xmpp.xmpp.send_message = new_method messenger_xmpp._session_started = True try: send_scheduled_messages() errors = DispatchError.objects.all() assert len(errors) == 1 assert errors[0].error_log == 'xmppsleek failed' assert errors[0].dispatch.address == 'someone' finally: messenger_xmpp.xmpp.send_message = old_method
def create_digest(): """Создаёт депеши для рассылки еженедельного дайджеста. Реальная компиляция дайджеста происходит в PythonzEmailDigest.compile(). :return: """ if settings.DEBUG: # На всякий случай, чем чёрт не шутит. return False from .models import User date_till = timezone.now() date_from = date_till-timedelta(days=7) context = {'date_from': date_from.timestamp(), 'date_till': date_till.timestamp()} format_date = lambda d: d.date().strftime('%d.%m.%Y') m = PythonzEmailDigest(get_email_full_subject('Подборка материалов %s-%s' % (format_date(date_from), format_date(date_till))), context) subscribers = User.get_digest_subsribers() schedule_messages(m, recipients('smtp', subscribers))
def create_message(dispatches_count): message = Message(cls='test_message') message.save() users = [] for _ in range(dispatches_count): users.append(user_create()) Dispatch.create(message, recipients('test_messenger', users)) dispatches = Dispatch.objects.filter( dispatch_status=Dispatch.DISPATCH_STATUS_PENDING) for dispatch in dispatches: dispatch.dispatch_status = dispatch.DISPATCH_STATUS_SENT dispatch.save() return message, dispatches
def send_messages_view(request, id): """ Sends an internal email to the desired recipients. """ # We extract the recipient's id. to_user = User.objects.get(pk=id) sender = request.user # Here we define the smtp recipients to inform them via email that # they have an unread notification. # my_smtp_recipients = recipients(SMTPMessenger, [to_user.email]), # Here we define the internal mail recipients # my_recipients = recipients(MyMessenger, [to_user]) # schedule_email('There is hope.', [to_user, sender.username]) #schedule_email('You have an unread notification in eduanalytics.',[my_smtp_recipients, sender] # schedule_messages('You are awesome VEER.', recipients('mymessenger', ['user1--address', user2])) schedule_messages( # You can pass one or several message objects: [ # The first param of this Message Type is `subject`. The second a dictionary. EmailHtmlMessage('Congratulations Nancy for your baby', { 'title': 'Message to my Sister', 'entry': 'I will stand by you.' }), ], # The same applies to recipients: add one or many as required: recipients(MyMessenger, [ to_user, ]), # It's useful sometimes to know message sender in terms of Django users: sender=request.user) # this function sends all scheduled messages. send_scheduled_messages(ignore_unknown_messengers=True, ignore_unknown_message_types=True) HttpResponseRedirect(reverse('correo:inbox'))
def test_send(self): schedule_messages('text', recipients('xmppsleek', 'someone')) send_scheduled_messages() messenger_xmpp.xmpp.send_message.assert_called_once_with( mtype='chat', mbody='text', mfrom='somjid', mto='someone')
def test_send(self): schedule_messages('text', recipients('xmppsleek', 'someone')) send_scheduled_messages() messenger_xmpp.xmpp.send_message.assert_called_once_with( mtype='chat', mbody='text', mfrom='somjid', mto='someone' )
def test_send(self): schedule_messages('text', recipients('telegram', '1234567')) send_scheduled_messages() assert_called_n(messenger_telegram.lib.post, 2)
def test_send(self): schedule_messages('text', recipients('fb', '')) send_scheduled_messages() assert_called_n(messenger_fb.lib.post)
def schedule_email(text, to, subject): message_cls = get_message_type_for_app('sitegate', 'email_plain') schedule_messages(message_cls(subject, text), recipients('smtp', to))
def test_send(self): schedule_messages('text', recipients('twitter', 'someone')) send_scheduled_messages() messenger_twitter.api.statuses.update.assert_called_with( status='@someone text')
def test_send(self): schedule_messages('text', recipients('vk', '12345')) send_scheduled_messages() assert_called_n(messenger_vk.lib.post)
def test_send(self): schedule_messages('text', recipients('smtp', 'someone')) send_scheduled_messages() assert_called_n(messenger_smtp.smtp.sendmail)
def test_send(self): schedule_messages('text', recipients('twitter', 'someone')) send_scheduled_messages() messenger_twitter.api.statuses.update.assert_called_with(status='@someone text')
def schedule_email(text, to, subject): message_cls = get_message_type_for_app( 'sitegate', 'email_plain') schedule_messages(message_cls(subject, text), recipients('smtp', to))