def handle(self, *args, **options): start_time_range = (datetime.datetime.now() - datetime.timedelta(days=6), datetime.datetime.now() - datetime.timedelta(days=5)) users = User.objects.filter(user_plans__is_active=True, user_plans__ads_limit__gt=0, user_plans__start__range=start_time_range, ads_count=0, subscribe_info=True, email__gt='').distinct().order_by('id') print '--> Start to send notification', datetime.datetime.now() utm = make_utm_dict(utm_campaign='plan_notification') for user in users: print ' --> user #%d' % user.id translation.activate(user.language) content = render_to_string( 'paid_services/mail/plan-notification.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm), 'plan': user.get_active_plan() }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage(_('Активируйте свои объявления'), content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send() print '--> Finish to send notification', datetime.datetime.now()
def handle(self, **options): if 'test_users' in options and options['test_users']: users_query = User.objects.filter(id__in=options['test_users']) else: users_query = User.objects.filter( realtors__is_active=True, last_action__gt='2016-02-28', email__gt='', subscribe_news=True).distinct().order_by('id') if options['start_from_user']: users_query = users_query.filter( id__gte=options['start_from_user']) print 'Total users: ', users_query.count() utm = make_utm_dict(utm_campaign='valion') for user in users_query: print 'user #%d' % user.id translation.activate(user.language) template = 'mail/mailing/valion_franchise.jinja.html' subject = u'Франшиза для частных риэлторов от Valion' content = render_to_string( template, { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm) }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage(subject, content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send()
def dirty_loyalty(sender, instance, **kwargs): if 'loyalty_started' in instance.get_dirty_fields().keys(): logger = logging.getLogger('loyalty') loyalty_bonus = instance.get_loyalty_bonus() utm = make_utm_dict(utm_campaign='loyalty') ga_pixel = make_ga_pixel_dict(instance, utm) translation.activate(instance.language) if loyalty_bonus: # Подключили программу лояльности loyalty_bonus = int(loyalty_bonus * 100.0) instance.send_email( subject=_( u'Поздравляем, Вы стали участником программы лояльности'), content= _(u'Вы стали участником программы лояльности портала mesto.ua\n' u'Теперь при пополнении баланса, %(loyalty_bonus)s%% от суммы будут начислены Вам бонусом!\n' u'При условии постоянного пополнения баланса процент начисляемого бонуса будет увеличиваться.' ) % {'loyalty_bonus': loyalty_bonus}, template='paid_services/mail/loyalty-balance.jinja.html', utm=utm, ga_pixel=ga_pixel) logger.info( 'Loyalty', extra={ 'user_id': instance.id, 'action': 'Send loyalty notification after apply value: %s (current bonus is %d%%)' % (instance.loyalty_started, loyalty_bonus) }) else: # Отключили программу лояльности instance.send_email( subject=_( u'Программа лояльности клиентов была приостановлена'), content= _(u'Нам очень жаль, но мы были вынуждены отключить Вашу программу лояльности, потому как Вы ' u'приостановили использование услуг на mesto.ua\n' u'Свяжитесь со своим личным менеджером – и он подумает, что можно сделать для того, чтобы ' u'восстановить действие программы.'), template='paid_services/mail/loyalty-manager.jinja.html', utm=utm, ga_pixel=ga_pixel) logger.info('Loyalty', extra={ 'user_id': instance.id, 'action': 'Send loyalty notification about disable action' })
def handle(self, *args, **options): now = datetime.datetime.now() print 'start', now # интервал запуска команды (должен совпадать с кроном), если потребуется чаще, можно будет сделать опцию --interval interval = datetime.timedelta(days=1) for expiration_days_delta in (-7, -3, -1, 0, +3, +7, +15): userplan_end_range = [ now - datetime.timedelta(days=expiration_days_delta) - interval, now - datetime.timedelta(days=expiration_days_delta), ] users_to_mail = User.objects.filter( is_active=True, email__gt='', subscribe_info=True, user_plans__end__range=userplan_end_range, ).exclude( user_plans__end__gt=userplan_end_range[1], # для продленных тарифов ).exclude( id__in=ActivityPeriod.objects.filter(end=None).values('user') ) utm = make_utm_dict(utm_campaign='Prodolzhenie_paketa', utm_term='Uslugi') for user in users_to_mail: print 'mail: user #%d, expiration_days_delta=%d' % (user.id, expiration_days_delta) translation.activate(user.language) subject = _(u'Напоминание об окончании тарифного плана') if expiration_days_delta < 0: content = render_to_string('paid_services/mail/plan_expired_before.jinja.html', {'days_before': -expiration_days_delta}) elif expiration_days_delta == 0: content = render_to_string( 'paid_services/mail/plan_expired.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm) } ) elif expiration_days_delta > 0: content = render_to_string('paid_services/mail/plan_expired_after.jinja.html', {'days_after': expiration_days_delta}) subject = _(u'Ваш аккаунт неактивен') content_with_inline_css = pynliner.fromString(content) message = EmailMessage(subject, content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send()
def handle(self, **options): translation.activate('uk') # translation.activate('ru') if 'test_users' in options and options['test_users']: users_query = User.objects.filter(id__in=options['test_users']) else: date_range = [ datetime.datetime.now() - datetime.timedelta(days=30*3), datetime.datetime.now() - datetime.timedelta(days=0) ] users_query = User.objects.filter(email__gt='', subscribe_news=True, last_action__range=date_range) \ .distinct().order_by('id') #users_query = users_query.filter(region__slug='kievskaya-oblast') if options['start_from_user']: users_query = users_query.filter(id__gte=options['start_from_user']) print 'total users', users_query.count() utm = make_utm_dict(utm_campaign='new_services') for user in users_query: print 'user #%d' % user.id template = 'mail/mailing/mail_saint_mykholay.jinja.html' subject = u'З днем Святого Миколая!' content = render_to_string(template, { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm), }) content_with_inline_css = pynliner.fromString(content) content_with_inline_css = content message = EmailMessage(subject, content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send()
def check_lead_type(): # условие .exclude(user__leadgenerationbonuses__end=None) пропускает бонусную лидогенерацию на 10 звонков/лидов # для этого бонуса отключение происходит в paid_services.models.leadgeneration_bonus, а уведомления о балансе не нужны for activityperiod in ActivityPeriod.objects.filter(end=None): user = activityperiod.user if activityperiod.lead_type == 'ads' and user.leadgenerationbonuses.filter( end=None).exists(): continue if user.get_balance() < 10: print 'Balance < 10. Stop leadgeneration period %d' % activityperiod.id activityperiod.stop() # смс-сообщение или пуш-уведомление в приложении notification_content = u'Уважаемый пользователь, на Вашем балансе %d грн, ' \ u'услуга Оплата за звонок приостановлена. ' \ u'Пополните баланс и продолжайте получать звонки!' % user.get_balance() user.send_notification(notification_content, sms_numbers_limit=1) if user.subscribe_info: translation.activate(user.language) subject = _(u'Вы не можете получать звонки') utm = make_utm_dict(utm_campaign='popolnenie_balansa', utm_content='klienti_s_ppc') content = render_to_string( 'ppc/mail/money_not_enough.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm) }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage(subject, content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send()
def handle(self, *args, **options): users_id = LeadGeneration.objects.filter( dedicated_numbers=True, user__in=User.get_user_ids_with_active_ppk()).values_list( 'user', flat=True) # Уведомляем об окончании услуги Выделенный номер за день до окончания service_will_end_for_users = User.objects.filter( Q(transactions__type=80, receive_sms=True, id__in=users_id) & (Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=29), datetime.datetime.now() - datetime.timedelta(days=28))))).distinct().order_by('id') print '--> Start beforehand notification by sms', datetime.datetime.now( ) text = u'Завтра заканчивается срок действия услуги "Выделенный номер". Пополните баланс на 100 грн' for user in service_will_end_for_users: # если на балансе есть 100 грн, то за номер выделенный нлмер автоматически спишется if user.get_balance() < 100: print ' --> user #%d' % user.id user.send_notification(text) # Уведомляем об окончании услуги Выделенный номер за 7, 3 и в день окончания предоставления услуги service_will_end_for_users = User.objects.filter( Q(transactions__type=80, subscribe_info=True, id__in=users_id) & (Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=23), datetime.datetime.now() - datetime.timedelta(days=22))) | Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=27), datetime.datetime.now() - datetime.timedelta(days=26))) | Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=30), datetime.datetime.now() - datetime.timedelta(days=29))))).distinct().order_by('id') print '--> Start beforehand notification', datetime.datetime.now() utm = make_utm_dict(utm_campaign='ppc_notification') for user in service_will_end_for_users: print ' --> user #%d' % user.id translation.activate(user.language) # Количество дней до окончания тарифа days = 30 - (datetime.datetime.now() - user.transactions.filter(type=80).first().time).days content = render_to_string( 'ppc/mail/ppc-notification-beforehand.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm), 'days': days }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage( _('Заканчивается срок действия абон.платы услуги "Выделенный номер"' ), content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send() # Уведомляем пользователей о неактивной услуге Выделенный номер # на следующий день после окончания услуги и через неделю print '--> Start afterward notification', datetime.datetime.now() service_ended_for_users = User.objects.filter( Q(transactions__type=80, subscribe_info=True) & (Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=32), datetime.datetime.now() - datetime.timedelta(days=31))) | Q(transactions__time__range=( datetime.datetime.now() - datetime.timedelta(days=39), datetime.datetime.now() - datetime.timedelta(days=38))))).distinct().order_by('id') for user in service_ended_for_users: # Если у пользователя не было транзакций за Выделенный номер за последние 7 дней if not user.transactions.filter( type=80, time__gte=(datetime.datetime.now() - datetime.timedelta(days=7))).exists(): print ' --> user #%d' % user.id translation.activate(user.language) content = render_to_string( 'ppc/mail/ppc-notification-afterward.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict(user, utm) }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage( _('Закончился срок действия абон.платы услуги "Выделенный номер"' ), content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [user.email]) message.content_subtype = 'html' message.send()
def handle(self, *args, **options): utm = make_utm_dict(utm_campaign='loyalty') logger = logging.getLogger('loyalty') users = User.objects.filter(loyalty_started__isnull=False) for user in users: translation.activate(user.language) ga_pixel = make_ga_pixel_dict(user, utm) loyalty_bonus = int(user.get_loyalty_bonus() * 100.0) previous_loyalty_bonus = int( user.get_loyalty_bonus( (datetime.datetime.now() - datetime.timedelta(days=1)).date()) * 100.0) # Сначала радостные новости, проверяем изменился ли у пользователя бонус лояльности if loyalty_bonus != previous_loyalty_bonus: user.send_email( subject=_(u'Поздравляем, Вы перешли на новый уровень'), content= _(u'Ура, поздравляем, Вы перешли на новый уровень нашей программы лояльности.\n' u'Теперь Вы будете получать %(loyalty_bonus)s%% бонус от каждого пополнения ' u'Баланса на сайте.\n' u'Желаем вам успешных продаж и новых клиентов.') % {'loyalty_bonus': loyalty_bonus}, utm=utm, ga_pixel=ga_pixel) logger.info( 'Loyalty', extra={ 'user_id': user.id, 'action': 'Send notification about changed loyalty from %s%% to %s%%' % (previous_loyalty_bonus, loyalty_bonus) }) inactive_date = datetime.date.today() - datetime.timedelta(days=5) # Проверяем активные пакеты user_plan = user.user_plans.order_by('-end').first() if user_plan: inactive_date = max(inactive_date, user_plan.end.date()) # Проверяем активные ППК if user.activityperiods.filter(end__isnull=True).exists(): continue ppk = user.activityperiods.exclude( end__isnull=True).order_by('-end').first() if ppk: inactive_date = max(inactive_date, ppk.end.date()) # Проверем всякие размещения placements = VipPlacement.objects.filter(is_active=True, transaction__user=user) if placements.exists(): continue placements = VipPlacement.objects.filter( transaction__user=user).order_by('-until').first() if placements: inactive_date = max(inactive_date, placements.until.date()) placements = CatalogPlacement.objects.filter( is_active=True, transaction__user=user) if placements.exists(): continue placements = CatalogPlacement.objects.filter( transaction__user=user).order_by('-until').first() if placements: inactive_date = max(inactive_date, placements.until.date()) days_difference = (datetime.date.today() - inactive_date).days if days_difference == 1: # Первый день, когда у пользователя нет ничего активного user.send_email( subject=_(u'Ваш бонус ждет Вас'), content= _(u'Спешите пополнить Баланс и получите %(loyalty_bonus)s%% бонус от суммы пополнения.\n' u'Нам будет очень жаль, если вы не станете участником программы лояльности и ' u'потеряете свой бонус.\n' u'Приобретайте услуги публикации объявлений на mesto.ua для продолжения участия ' u'в программе лояльности') % {'loyalty_bonus': loyalty_bonus}, template='paid_services/mail/loyalty-balance.jinja.html', utm=utm, ga_pixel=ga_pixel) logger.info( 'Loyalty', extra={ 'user_id': user.id, 'action': 'Send loyalty notification about first day without activity' }) elif days_difference == 4: # Последний допустимый день, когда у пользователя нет ничего активного user.send_email( subject=_( u'Остался последний день. Спешите получить бонус'), content= _(u'Сегодня остался последний день действия программы лояльности.\n' u'Приобретайте услуги публикации объявлений на mesto.ua для продолжения участия в ' u'программе лояльности\n' u'Нам будет очень жаль, если вы прекратите участие в программе лояльности и потеряете ' u'свой бонус.'), template='paid_services/mail/loyalty-balance.jinja.html', utm=utm, ga_pixel=ga_pixel) logger.info( 'Loyalty', extra={ 'user_id': user.id, 'action': 'Send loyalty notification about last available day without activity' }) elif days_difference > 4: # Отключаем программу лояльности, письмо отправляется в сигналах User user.loyalty_started = None user.save()
def detail(request, type, slug): """ Отображаем один вебинар """ webinar = get_object_or_404(Webinar, type=type, slug=slug) comments = None next_page_token = None last_comment_id = None if webinar.is_active: gapi = GoogleAPI() # Загружаем комментарии comments_data = gapi.youtube_get_video_comments(embed=webinar.video) comments = comments_data.get('items', []) if comments: last_comment_id = comments[0]['id'] next_page_token = comments_data.get('nextPageToken', None) initial_data = { 'email': request.user.email if request.user.is_authenticated() else '', 'name': request.user.get_full_name() if request.user.is_authenticated() else '' } form = WebinarReminderForm(initial=initial_data) show_form = webinar.is_registration_available if request.method == 'POST': if 'csrfmiddlewaretoken' not in request.POST and '.mesto.ua/' not in request.META.get( 'HTTP_REFERER', ''): return HttpResponseForbidden() form = WebinarReminderForm(request.POST) if form.is_valid(): show_form = False webinar_reminder = form.save(commit=False) webinar_reminder.webinar = webinar webinar_reminder.language = translation.get_language() if request.user.is_authenticated(): webinar_reminder.user = request.user webinar_reminder.save() event_type_str = { u'seminar': (_(u'семинар'), _(u'семинара')), u'webinar': (_(u'вебинар'), _(u'вебинара')) }[webinar.type] messages.info( request, _(u'Поздравляем, Вы зарегистрированы на супер-крутой %s <b>Mesto School</b><br/><br/>' u'В день проведения %s Вы получите<br/> уведомление на Ваш email' ) % event_type_str, extra_tags='modal-dialog-w500 modal-mesto-school') # Отправка сообщения об успешной регистрации на мероприятие if webinar.type == 'webinar': subject = _(u'Регистрация на бесплатный вебинар Mesto School') else: subject = _(u'Регистрация на бесплатный семинар Mesto School') utm = make_utm_dict(utm_campaign=webinar.type, utm_term=webinar.slug) content = render_to_string( 'webinars/mail/event-registration.jinja.html', { 'utm': utm, 'ga_pixel': make_ga_pixel_dict( request.user if request.user.is_authenticated() else None, utm), 'event': webinar }) content_with_inline_css = pynliner.fromString(content) message = EmailMessage(subject, content_with_inline_css, settings.DEFAULT_FROM_EMAIL, [webinar_reminder.email]) message.content_subtype = 'html' message.send() if 'next' in request.POST: return redirect(request.POST['next'] or request.META['HTTP_REFERER']) if type == 'seminar' and webinar.is_archived: previous_seminars = Webinar.objects.filter( type='seminar', finish_at__lt=datetime.datetime.now(), is_published=True).exclude(id=webinar.id).order_by('-start_at')[:3] type_display = _(u'вебинары') if type == 'webinar' else _(u'семинары') title = webinar.__unicode__() return render(request, 'webinars/detail.jinja.html', locals())