def get_scheduled_report_response(couch_user, domain, scheduled_report_id, email=True): from dimagi.utils.web import get_url_base from django.http import HttpRequest request = HttpRequest() request.couch_user = couch_user request.user = couch_user.get_django_user() request.domain = domain request.couch_user.current_domain = domain notification = ReportNotification.get(scheduled_report_id) report_outputs = [] for config in notification.configs: report_outputs.append({ 'title': config.full_name, 'url': config.url, 'content': config.get_report_content() }) return render(request, "reports/report_email.html", { "reports": report_outputs, "domain": notification.domain, "couch_user": notification.owner._id, "DNS_name": get_url_base(), "owner_name": couch_user.full_name or couch_user.get_email(), "email": email })
def get_scheduled_report_response(couch_user, domain, scheduled_report_id, email=True, attach_excel=False): """ This function somewhat confusingly returns a tuple of: (response, excel_files) If attach_excel is false, excel_files will always be an empty list. """ # todo: clean up this API? from django.http import HttpRequest request = HttpRequest() request.couch_user = couch_user request.user = couch_user.get_django_user() request.domain = domain request.couch_user.current_domain = domain notification = ReportNotification.get(scheduled_report_id) return _render_report_configs(request, notification.configs, notification.domain, notification.owner_id, couch_user, email, attach_excel=attach_excel)
def send_report(notification_id): notification = ReportNotification.get(notification_id) owner = WebUser.get(notification.owner_id) language = owner.get_language_code() try: with localize(language): notification.send() except UnsupportedScheduledReportError: pass
def delete_scheduled_report(request, domain, scheduled_report_id): user_id = request.couch_user._id rep = ReportNotification.get(scheduled_report_id) if user_id != rep.owner._id: return HttpResponseBadRequest() rep.delete() messages.success(request, "Scheduled report deleted!") return HttpResponseRedirect(reverse("reports_home", args=(domain,)))
def drop_scheduled_report(request, domain, couch_user_id, report_id): rep = ReportNotification.get(report_id) try: rep.user_ids.remove(couch_user_id) except ValueError: pass # odd, the user wasn't there in the first place if len(rep.user_ids) == 0: rep.delete() else: rep.save() messages.success(request, "Scheduled report dropped!") return HttpResponseRedirect(reverse("user_account", args=(domain, couch_user_id )))
def delete_scheduled_report(request, domain, scheduled_report_id): user_id = request.couch_user._id try: rep = ReportNotification.get(scheduled_report_id) except ResourceNotFound: # was probably already deleted by a fast-clicker. pass else: if user_id != rep.owner._id: return HttpResponseBadRequest() rep.delete() messages.success(request, "Scheduled report deleted!") return HttpResponseRedirect(reverse("reports_home", args=(domain, )))
def delete_scheduled_report(request, domain, scheduled_report_id): user_id = request.couch_user._id try: rep = ReportNotification.get(scheduled_report_id) except ResourceNotFound: # was probably already deleted by a fast-clicker. pass else: if user_id != rep.owner._id: return HttpResponseBadRequest() rep.delete() messages.success(request, "Scheduled report deleted!") return HttpResponseRedirect(reverse("reports_home", args=(domain,)))
def test_scheduled_report(request, domain, couch_user_id, report_id): rep = ReportNotification.get(report_id) try: user = WebUser.get_by_user_id(couch_user_id, domain) except CouchUser.AccountTypeError: user = CommCareUser.get_by_user_id(couch_user_id, domain) try: send_report(rep, user) except SMTPRecipientsRefused: messages.error(request, "You have no email address configured") else: messages.success(request, "Test message sent to %s" % user.get_email()) return HttpResponseRedirect(reverse("user_account", args=(domain, couch_user_id )))
def get_scheduled_report_response(couch_user, domain, scheduled_report_id, email=True): from django.http import HttpRequest request = HttpRequest() request.couch_user = couch_user request.user = couch_user.get_django_user() request.domain = domain request.couch_user.current_domain = domain notification = ReportNotification.get(scheduled_report_id) return _render_report_configs(request, notification.configs, notification.domain, notification.owner_id, couch_user, email)
def get_scheduled_report_response(couch_user, domain, scheduled_report_id, email=True): from django.http import HttpRequest request = HttpRequest() request.couch_user = couch_user request.user = couch_user.get_django_user() request.domain = domain request.couch_user.current_domain = domain notification = ReportNotification.get(scheduled_report_id) return _render_report_configs(request, notification.configs, notification.domain, notification.owner_id, couch_user, email)
def send_test_scheduled_report(request, domain, scheduled_report_id): from corehq.apps.reports.tasks import send_report from corehq.apps.users.models import CouchUser, CommCareUser, WebUser user_id = request.couch_user._id notification = ReportNotification.get(scheduled_report_id) try: user = WebUser.get_by_user_id(user_id, domain) except CouchUser.AccountTypeError: user = CommCareUser.get_by_user_id(user_id, domain) try: send_report.delay(notification._id) except Exception, e: import logging logging.exception(e) messages.error(request, "An error occured, message unable to send")
def send_test_scheduled_report(request, domain, scheduled_report_id): from corehq.apps.reports.tasks import send_report from corehq.apps.users.models import CouchUser, CommCareUser, WebUser user_id = request.couch_user._id notification = ReportNotification.get(scheduled_report_id) try: user = WebUser.get_by_user_id(user_id, domain) except CouchUser.AccountTypeError: user = CommCareUser.get_by_user_id(user_id, domain) try: send_report.delay(notification._id) except Exception, e: import logging logging.exception(e) messages.error(request, "An error occured, message unable to send")
def get_scheduled_report_response(couch_user, domain, scheduled_report_id, email=True, attach_excel=False): """ This function somewhat confusingly returns a tuple of: (response, excel_files) If attach_excel is false, excel_files will always be an empty list. """ # todo: clean up this API? from django.http import HttpRequest request = HttpRequest() request.couch_user = couch_user request.user = couch_user.get_django_user() request.domain = domain request.couch_user.current_domain = domain notification = ReportNotification.get(scheduled_report_id) return _render_report_configs(request, notification.configs, notification.domain, notification.owner_id, couch_user, email, attach_excel=attach_excel)
def send_report(notification_id): notification = ReportNotification.get(notification_id) try: notification.send() except UnsupportedScheduledReportError: pass
def edit_scheduled_report(request, domain, scheduled_report_id=None, template="reports/edit_scheduled_report.html"): from corehq.apps.users.models import WebUser from corehq.apps.reports.forms import ScheduledReportForm context = { "form": None, "domain": domain, "report": { "show": request.couch_user.can_view_reports() or request.couch_user.get_viewable_reports(), "slug": None, "default_url": reverse("reports_home", args=(domain,)), "is_async": False, "section_name": ProjectReport.section_name, }, } user_id = request.couch_user._id configs = ReportConfig.by_domain_and_owner(domain, user_id) config_choices = [(c._id, c.full_name) for c in configs if c.report and c.report.emailable] if not config_choices: return render(request, template, context) web_users = WebUser.view("users/web_users_by_domain", reduce=False, key=domain, include_docs=True).all() web_user_emails = [u.get_email() for u in web_users] if scheduled_report_id: instance = ReportNotification.get(scheduled_report_id) if instance.owner_id != user_id or instance.domain != domain: raise HttpResponseBadRequest() else: instance = ReportNotification( owner_id=user_id, domain=domain, config_ids=[], hour=8, send_to_owner=True, recipient_emails=[] ) is_new = instance.new_document initial = instance.to_json() initial["recipient_emails"] = ", ".join(initial["recipient_emails"]) kwargs = {"initial": initial} args = (request.POST,) if request.method == "POST" else () form = ScheduledReportForm(*args, **kwargs) form.fields["config_ids"].choices = config_choices form.fields["recipient_emails"].choices = web_user_emails if request.method == "POST" and form.is_valid(): for k, v in form.cleaned_data.items(): setattr(instance, k, v) instance.save() if is_new: messages.success(request, "Scheduled report added!") else: messages.success(request, "Scheduled report updated!") touch_saved_reports_views(request.couch_user, domain) return HttpResponseRedirect(reverse("reports_home", args=(domain,))) context["form"] = form context["day_value"] = getattr(instance, "day", 1) context["weekly_day_options"] = ReportNotification.day_choices() context["monthly_day_options"] = [(i, i) for i in range(1, 32)] if is_new: context["form_action"] = "Create a new" context["report"]["title"] = "New Scheduled Report" else: context["form_action"] = "Edit" context["report"]["title"] = "Edit Scheduled Report" return render(request, template, context)
def edit_scheduled_report(request, domain, scheduled_report_id=None, template="reports/edit_scheduled_report.html"): from corehq.apps.users.models import WebUser from corehq.apps.reports.forms import ScheduledReportForm context = { 'form': None, 'domain': domain, 'report': { 'show': request.couch_user.can_view_reports() or request.couch_user.get_viewable_reports(), 'slug': None, 'default_url': reverse('reports_home', args=(domain,)), 'is_async': False, 'section_name': ProjectReport.section_name, } } user_id = request.couch_user._id configs = ReportConfig.by_domain_and_owner(domain, user_id).all() config_choices = [(c._id, c.full_name) for c in configs if c.report and c.report.emailable] if not config_choices: return render(request, template, context) web_users = WebUser.view('users/web_users_by_domain', reduce=False, key=domain, include_docs=True).all() web_user_emails = [u.get_email() for u in web_users] if scheduled_report_id: instance = ReportNotification.get(scheduled_report_id) if instance.owner_id != user_id or instance.domain != domain: raise HttpResponseBadRequest() else: instance = ReportNotification(owner_id=user_id, domain=domain, config_ids=[], day_of_week=-1, hours=8, send_to_owner=True, recipient_emails=[]) is_new = instance.new_document initial = instance.to_json() initial['recipient_emails'] = ', '.join(initial['recipient_emails']) kwargs = {'initial': initial} args = (request.POST,) if request.method == "POST" else () form = ScheduledReportForm(*args, **kwargs) form.fields['config_ids'].choices = config_choices form.fields['recipient_emails'].choices = web_user_emails if request.method == "POST" and form.is_valid(): for k, v in form.cleaned_data.items(): setattr(instance, k, v) instance.save() if is_new: messages.success(request, "Scheduled report added!") else: messages.success(request, "Scheduled report updated!") return HttpResponseRedirect(reverse('reports_home', args=(domain,))) context['form'] = form if is_new: context['form_action'] = "Create a new" context['report']['title'] = "New Scheduled Report" else: context['form_action'] = "Edit" context['report']['title'] = "Edit Scheduled Report" return render(request, template, context)
def edit_scheduled_report(request, domain, scheduled_report_id=None, template="reports/edit_scheduled_report.html"): from corehq.apps.users.models import WebUser from corehq.apps.reports.forms import ScheduledReportForm context = { 'form': None, 'domain': domain, 'report': { 'show': request.couch_user.can_view_reports() or request.couch_user.get_viewable_reports(), 'slug': None, 'default_url': reverse('reports_home', args=(domain,)), 'is_async': False, 'section_name': ProjectReport.section_name, } } user_id = request.couch_user._id configs = ReportConfig.by_domain_and_owner(domain, user_id) config_choices = [(c._id, c.full_name) for c in configs if c.report and c.report.emailable] if not config_choices: return render(request, template, context) web_users = WebUser.view('users/web_users_by_domain', reduce=False, key=domain, include_docs=True).all() web_user_emails = [u.get_email() for u in web_users] if scheduled_report_id: instance = ReportNotification.get(scheduled_report_id) time_difference = get_timezone_difference(domain) (instance.hour, day_change) = recalculate_hour(instance.hour, int(time_difference[:3]), int(time_difference[3:])) instance.minute = 0 if day_change: instance.day = calculate_day(instance.interval, instance.day, day_change) if instance.owner_id != user_id or instance.domain != domain: raise HttpResponseBadRequest() else: instance = ReportNotification(owner_id=user_id, domain=domain, config_ids=[], hour=8, minute=0, send_to_owner=True, recipient_emails=[]) is_new = instance.new_document initial = instance.to_json() initial['recipient_emails'] = ', '.join(initial['recipient_emails']) kwargs = {'initial': initial} args = (request.POST,) if request.method == "POST" else () form = ScheduledReportForm(*args, **kwargs) form.fields['config_ids'].choices = config_choices form.fields['recipient_emails'].choices = web_user_emails form.fields['hour'].help_text = "This scheduled report's timezone is %s (%s GMT)" % \ (Domain._get_by_name(domain)['default_timezone'], get_timezone_difference(domain)[:3] + ':' + get_timezone_difference(domain)[3:]) if request.method == "POST" and form.is_valid(): for k, v in form.cleaned_data.items(): setattr(instance, k, v) time_difference = get_timezone_difference(domain) (instance.hour, day_change) = calculate_hour(instance.hour, int(time_difference[:3]), int(time_difference[3:])) instance.minute = int(time_difference[3:]) if day_change: instance.day = calculate_day(instance.interval, instance.day, day_change) instance.save() if is_new: messages.success(request, "Scheduled report added!") else: messages.success(request, "Scheduled report updated!") touch_saved_reports_views(request.couch_user, domain) return HttpResponseRedirect(reverse('reports_home', args=(domain,))) context['form'] = form context['day_value'] = getattr(instance, "day", 1) context['weekly_day_options'] = ReportNotification.day_choices() context['monthly_day_options'] = [(i, i) for i in range(1, 32)] if is_new: context['form_action'] = "Create a new" context['report']['title'] = "New Scheduled Report" else: context['form_action'] = "Edit" context['report']['title'] = "Edit Scheduled Report" return render(request, template, context)
def send_report(notification_id): notification = ReportNotification.get(notification_id) try: notification.send() except UnsupportedScheduledReportError: pass
def edit_scheduled_report(request, domain, scheduled_report_id=None, template="reports/edit_scheduled_report.html"): from corehq.apps.users.models import WebUser from corehq.apps.reports.forms import ScheduledReportForm context = { 'form': None, 'domain': domain, 'report': { 'show': request.couch_user.can_view_reports() or request.couch_user.get_viewable_reports(), 'slug': None, 'default_url': reverse('reports_home', args=(domain, )), 'is_async': False, 'section_name': ProjectReport.section_name, } } user_id = request.couch_user._id configs = ReportConfig.by_domain_and_owner(domain, user_id) config_choices = [(c._id, c.full_name) for c in configs if c.report and c.report.emailable] if not config_choices: return render(request, template, context) web_users = WebUser.view('users/web_users_by_domain', reduce=False, key=domain, include_docs=True).all() web_user_emails = [u.get_email() for u in web_users] if scheduled_report_id: instance = ReportNotification.get(scheduled_report_id) if instance.owner_id != user_id or instance.domain != domain: raise HttpResponseBadRequest() else: instance = ReportNotification(owner_id=user_id, domain=domain, config_ids=[], hour=8, send_to_owner=True, recipient_emails=[]) is_new = instance.new_document initial = instance.to_json() initial['recipient_emails'] = ', '.join(initial['recipient_emails']) kwargs = {'initial': initial} args = (request.POST, ) if request.method == "POST" else () form = ScheduledReportForm(*args, **kwargs) form.fields['config_ids'].choices = config_choices form.fields['recipient_emails'].choices = web_user_emails if request.method == "POST" and form.is_valid(): for k, v in form.cleaned_data.items(): setattr(instance, k, v) instance.save() if is_new: messages.success(request, "Scheduled report added!") else: messages.success(request, "Scheduled report updated!") touch_saved_reports_views(request.couch_user, domain) return HttpResponseRedirect(reverse('reports_home', args=(domain, ))) context['form'] = form context['day_value'] = getattr(instance, "day", 1) context['weekly_day_options'] = ReportNotification.day_choices() context['monthly_day_options'] = [(i, i) for i in range(1, 32)] if is_new: context['form_action'] = "Create a new" context['report']['title'] = "New Scheduled Report" else: context['form_action'] = "Edit" context['report']['title'] = "Edit Scheduled Report" return render(request, template, context)