def send_email(self, subject, template, context):
     context.update({'user': self.user, 'VERIFICATION_KEY_DAYS': VERIFICATION_KEY_DAYS})
     context.update(scheme_and_domain())
     message = render_to_string(template, context)
     return send_mail(subject=subject,
         message=message,
         from_email=None,
         recipient_list=[self.user.email, ])
    def create_for_action(self, action_flag, context_dict=None, extra=None, reason=None):
        u"""
        создается запись в логах + создаются сообщения для всех уровней
        логирования(основываясь на шаблонах ACTION_TEMPLATES)

        Аргументы:
        action_flag - тип действия, записанный в workflow
        context_dict - контекст, передающийся в шаблон
        extra - дополнительные параметры:
            user - пользователь выполнивший действие
            sadik_group - группа ДОУ по отношению к которой выполнеяется действие,
                        например распределение заявки
            age_group - возрастная группа
            added_pref_sadiks - ДОУ, которые были добавлены
            removed_pref_sadiks - ДОУ, которые были удалены
        """
        from sadiki.core.workflow import DISABLE_EMAIL_ACTIONS
        from sadiki.core.workflow import ACTION_TEMPLATES
        context = Context(context_dict)
        if extra is None:
            extra = {}
        log_dict = {'reason': reason,
                    'action_flag': action_flag,
                    'user': extra.get('user')}
        obj = extra.get('obj')
        if obj:
            log_dict.update({'content_object': obj})
        log = Logger(**log_dict)
        # к логу добавляем дополнительную информацию
        if isinstance(obj, Requestion):
            if obj.distributed_in_vacancy:
                log.vacancy = obj.distributed_in_vacancy
                # надо сохранить возрастную группу, т.к. может изменяться у группы в ДОУ
                age_groups = (obj.distributed_in_vacancy.sadik_group.age_group,)
            else:
                age_groups = obj.age_groups()
            if 'profile' in extra:
                log.profile = extra['profile']
            if 'distribution_type' in extra:
                log.distribution_type = extra['distribution_type']
            # need save instance before work with many to many(pk required)
            log.save()
            if age_groups:
                log.age_groups = age_groups
            if 'added_pref_sadiks' in extra:
                log.added_pref_sadiks = extra['added_pref_sadiks']
            if 'removed_pref_sadiks' in extra:
                log.removed_pref_sadiks = extra['removed_pref_sadiks']
        else:
            log.save()
            if 'age_group' in extra:
                log.age_groups = (extra['age_group'],)

        # для данного типа изменений создаем сообщения в логах для всех
        # уровней логирования
        main_message = u''
        if action_flag in ACTION_TEMPLATES:
            for log_level, template in ACTION_TEMPLATES[action_flag].iteritems():
                message = template.render(context).strip()
                # убираем лишние пробелы
                message = re.sub(r"\s+", u" ", message)
                # если текстового сообщения нет(например не изменялись публичные поля)
                # то не сохраняем
                if message:
                    main_message = u"%s %s" % (main_message, message)
                    LoggerMessage.objects.create(
                        level=log_level, message=message, logger=log,)
        # а теперь отсылаем сообщение(если работаем с заявкой)
        # и это действие не находится в исключениях
        if isinstance(obj, Requestion) and action_flag not in DISABLE_EMAIL_ACTIONS:
            profile = obj.profile
            if profile.user.email and profile.email_verified:
                context = scheme_and_domain()
                context.update({'requestion': log.content_object,
                                'user': log.user,
                                'change_type': log.get_action_flag_display(),
                                'changes_message': main_message})
                message = render_to_string("logger/emails/base.html", context)
                try:
                    send_mail(subject=u"Изменение заявки %s" % extra['obj'],
                              message=message, from_email=None,
                              recipient_list=[obj.profile.user.email, ])
                except SMTPException:
                    pass