示例#1
0
    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()
示例#2
0
    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()
示例#3
0
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()
示例#5
0
    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()
示例#6
0
    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()
示例#7
0
    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()
示例#8
0
    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()
示例#9
0
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())