예제 #1
0
    def media_resources(self):
        PREFIX = 'jr://file/'
        # you have to call remove_unused_mappings
        # before iterating through multimedia_map
        self.app.remove_unused_mappings()
        if self.app.multimedia_map is None:
            self.app.multimedia_map = {}
        for path, m in self.app.multimedia_map.items():
            unchanged_path = path
            if path.startswith(PREFIX):
                path = path[len(PREFIX):]
            else:
                raise MediaResourceError('%s does not start with jr://file/commcare/' % path)
            path, name = split_path(path)
            # CommCare assumes jr://media/,
            # which is an alias to jr://file/commcare/media/
            # so we need to replace 'jr://file/' with '../../'
            # (this is a hack)
            path = '../../' + path

            if not getattr(m, 'unique_id', None):
                # lazy migration for adding unique_id to map_item
                m.unique_id = HQMediaMapItem.gen_unique_id(m.multimedia_id, unchanged_path)

            yield MediaResource(
                id=self.id_strings.media_resource(m.unique_id, name),
                path=path,
                version=m.version,
                local=None,
                remote=get_url_base() + reverse(
                    'hqmedia_download',
                    args=[m.media_type, m.multimedia_id]
                ) + urllib.quote(name.encode('utf-8')) if name else name
            )
예제 #2
0
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
    })
예제 #3
0
파일: api.py 프로젝트: jmaina/commcare-hq
def convert_media_path_to_hq_url(path, app):
    media = app.multimedia_map.get(path, None)
    if media is None:
        return None
    else:
        url_base = get_url_base()
        return url_base + HQMediaMapItem.format_match_map(path, media_type=media.media_type, media_id=media.multimedia_id)["url"] + "foo.wav"
예제 #4
0
파일: utils.py 프로젝트: atinus/commcare-hq
def send_new_request_update_email(user, requesting_ip, entity_name, entity_type="domain", is_new_user=False, is_confirming=False):
    entity_texts = {"domain": ["project space", "Project"],
                   "org": ["organization", "Organization"]}[entity_type]
    if is_confirming:
        message = "A (basically) brand new user just confirmed his/her account. The %s requested was %s." % (entity_texts[0], entity_name)
    elif is_new_user:
        message = "A brand new user just requested a %s called %s." % (entity_texts[0], entity_name)
    else:
        message = "An existing user just created a new %s called %s." % (entity_texts[0], entity_name)
    message = u"""%s

Details include...

Username: %s
IP Address: %s

You can view the %s here: %s""" % (
        message,
        user.username,
        requesting_ip,
        entity_texts[0],
        get_url_base() + "/%s/%s/" % ("o" if entity_type == "org" else "a", entity_name))
    try:
        recipients = settings.NEW_DOMAIN_RECIPIENTS
        send_mail(u"New %s: %s" % (entity_texts[0], entity_name), message, settings.SERVER_EMAIL, recipients)
    except Exception:
        logging.warning("Can't send email, but the message was:\n%s" % message)
예제 #5
0
def render_form(request, domain):
    # get session
    session_id = request.GET.get('session_id')

    session = get_object_or_404(EntrySession, session_id=session_id)

    response = requests.post("{base_url}/webforms/get-xml/{session_id}".format(
        base_url=get_url_base(),
        session_id=session_id)
    )

    if response.status_code is not 200:
        err = "Session XML could not be found"
        return HttpResponse(err, status=500, content_type="text/plain")

    response_json = json.loads(response.text)
    xmlns = response_json["xmlns"]
    form_data_xml = response_json["output"]

    _, form_data_json = xml2json(form_data_xml)
    pretty_questions = readable.get_questions(domain, session.app_id, xmlns)

    readable_form = readable.get_readable_form_data(form_data_json, pretty_questions)

    rendered_readable_form = render_to_string(
        'reports/form/partials/readable_form.html',
        {'questions': readable_form}
    )

    return json_response({
        'form_data': rendered_readable_form,
        'instance_xml': render_pretty_xml(form_data_xml)
    })
예제 #6
0
def convert_media_path_to_hq_url(path, app):
    media = app.multimedia_map.get(path, None)
    if media is None:
        return None
    else:
        url_base = get_url_base()
        return url_base + media.url + "foo.wav"
예제 #7
0
    def bug_report(self, couch_user, error_id):
        error = PillowError.objects.get(id=error_id)

        context = {
            'error': error,
            'url': "{}{}?error={}".format(get_url_base(), reverse(EditPillowError.urlname), error_id)
        }
        message = render_to_string('hqpillow_retry/fb.txt', context)
        subject = 'PillowTop error: {} - {}'.format(error.pillow, error.error_type)

        reply_to = u'"{}" <{}>'.format(couch_user.full_name, couch_user.get_email())
        email = EmailMessage(
            subject=subject,
            body=message,
            to=settings.BUG_REPORT_RECIPIENTS,
            headers={'Reply-To': reply_to}
        )

        # only fake the from email if it's an @dimagi.com account
        if re.search('@dimagi\.com$', couch_user.username):
            email.from_email = couch_user.username
        else:
            email.from_email = settings.CCHQ_BUG_REPORT_EMAIL

        email.send(fail_silently=False)
예제 #8
0
 def media_resources(self):
     PREFIX = 'jr://file/'
     # you have to call remove_unused_mappings
     # before iterating through multimedia_map
     self.app.remove_unused_mappings()
     for path, m in self.app.multimedia_map.items():
         if path.startswith(PREFIX):
             path = path[len(PREFIX):]
         else:
             raise MediaResourceError('%s does not start with jr://file/commcare/' % path)
         path, name = split_path(path)
         # CommCare assumes jr://media/,
         # which is an alias to jr://file/commcare/media/
         # so we need to replace 'jr://file/' with '../../'
         # (this is a hack)
         path = '../../' + path
         multimedia_id = m.multimedia_id
         yield MediaResource(
             id=self.id_strings.media_resource(multimedia_id, name),
             path=path,
             version=1,
             local=None,
             remote=get_url_base() + reverse(
                 'hqmedia_download',
                 args=[m.media_type, multimedia_id]
             ) + name
         )
예제 #9
0
def _render_report_configs(request, configs, domain, owner_id, couch_user, email, notes=None, attach_excel=False):
    from dimagi.utils.web import get_url_base

    report_outputs = []
    excel_attachments = []
    format = Format.from_format(request.GET.get('format') or Format.XLS_2007)
    for config in configs:
        content, excel_file = config.get_report_content(attach_excel=attach_excel)
        if excel_file:
            excel_attachments.append({
                'title': config.full_name + "." + format.extension,
                'file_obj': excel_file,
                'mimetype': format.mimetype
            })
        report_outputs.append({
            'title': config.full_name,
            'url': config.url,
            'content': content,
            'description': config.description,
        })

    date_range = config.get_date_range()
    return render(request, "reports/report_email.html", {
        "reports": report_outputs,
        "domain": domain,
        "couch_user": owner_id,
        "DNS_name": get_url_base(),
        "owner_name": couch_user.full_name or couch_user.get_email(),
        "email": email,
        "notes": notes,
        "startdate": date_range["startdate"] if date_range else "",
        "enddate": date_range["enddate"] if date_range else "",
    }), excel_attachments
예제 #10
0
def form_context(request, domain, app_id, module_id, form_id):
    app = Application.get(app_id)
    form_url = "%s%s" % (get_url_base(), reverse('download_xform', args=[domain, app_id, module_id, form_id]))
    case_id = request.GET.get('case_id')

    try:
        form = app.get_module(module_id).get_form(form_id).name.values()[0]
    except (FormNotFoundException, ModuleNotFoundException):
        raise Http404()

    # make the name for the session we will use with the case and form
    session_name = u'{app} > {form}'.format(
        app=app.name,
        form=form,
    )
    if case_id:
        session_name = u'{0} - {1}'.format(session_name, CommCareCase.get(case_id).name)

    delegation = request.GET.get('task-list') == 'true'
    offline = request.GET.get('offline') == 'true'
    session_helper = SessionDataHelper(domain, request.couch_user, case_id, delegation=delegation, offline=offline)
    return json_response(session_helper.get_full_context(
        {'form_url': form_url,},
        {'session_name': session_name, 'app_id': app._id}
    ))
예제 #11
0
파일: views.py 프로젝트: dimagi/commcare-hq
def osdd(request, template='osdd.xml'):
    response = render(request, template, {
        'url_base': get_url_base(),
        'env': get_environment_friendly_name()
    })
    response['Content-Type'] = 'application/xml'
    return response
예제 #12
0
 def get_user_link(self, user):
     from corehq.apps.reports.standard.cases.basic import CaseListReport
     user_link_template = '<a href="%(link)s?individual=%(user_id)s">%(username)s</a>'
     user_link = user_link_template % {"link": "%s%s" % (get_url_base(),
                                                         CaseListReport.get_url(domain=self.domain)),
                                       "user_id": user.get('user_id'),
                                       "username": user.get('username_in_report')}
     return self.table_cell(user.get('raw_username'), user_link)
예제 #13
0
파일: views.py 프로젝트: tsinkala/core-hq
def form_context(request, domain, app_id, module_id, form_id):
    app = Application.get(app_id)
    form_url = "%s%s" % (get_url_base(), reverse('download_xform', args=[domain, app_id, module_id, form_id]))
    case_id = request.GET.get('case_id')
    delegation = request.GET.get('task-list') == 'true'
    return json_response(
        touchforms_api.get_full_context(domain, request.couch_user, 
                                        app, form_url, case_id, delegation=delegation))
예제 #14
0
def url_is_location_safe(url):
    from corehq.apps.locations.permissions import is_location_safe
    url = url.split(get_url_base())[-1] if url else None
    try:
        match = resolve(url)
    except Resolver404:
        return False
    return is_location_safe(match.func, match.args, match.kwargs)
예제 #15
0
 def get_user_link(self, user):
     user_link_template = '<a href="%(link)s">%(username)s</a>'
     from corehq.apps.users.views.mobile import EditCommCareUserView
     user_link = user_link_template % {"link": "%s%s" % (get_url_base(),
                                                         reverse(EditCommCareUserView.urlname,
                                                                 args=[self.domain, user._id])),
                                       "username": user.username_in_report}
     return self.table_cell(user.raw_username, user_link)
예제 #16
0
def url_is_location_safe(url):
    from corehq.apps.locations.permissions import is_location_safe
    url = url.split(get_url_base())[-1] if url else None
    try:
        match = resolve(url)
    except Resolver404:
        return False
    # pass empty request, since we should exclude any url that requires request context
    return is_location_safe(match.func, None, match.args, match.kwargs)
예제 #17
0
파일: utils.py 프로젝트: dimagi/commcare-hq
 def get_context_data(self, **kwargs):
     context = super(DataFileDownloadList, self).get_context_data(**kwargs)
     context.update({
         'timezone': get_timezone_for_user(self.request.couch_user, self.domain),
         'data_files': DataFile.get_all(self.domain),
         'is_admin': self.request.couch_user.is_domain_admin(self.domain),
         'url_base': get_url_base(),
     })
     return context
예제 #18
0
def get_dropbox_auth_flow(session):
    from .views import DropboxAuthCallback

    redirect_uri = '{}{}'.format(
        get_url_base(),
        reverse(DropboxAuthCallback.slug),
    )
    return DropboxOAuth2Flow(settings.DROPBOX_KEY, settings.DROPBOX_SECRET, redirect_uri,
         session, DROPBOX_CSRF_TOKEN)
예제 #19
0
    def get_user_link(self, user):
        user_link_template = '<a href="%(link)s?individual=%(user_id)s">%(username)s</a>'
        from corehq.apps.reports.standard.inspect import CaseListReport

        user_link = user_link_template % {
            "link": "%s%s" % (get_url_base(), CaseListReport.get_url(self.domain)),
            "user_id": user.get("user_id"),
            "username": user.get("username_in_report"),
        }
        return self.table_cell(user.get("raw_username"), user_link)
예제 #20
0
def reverse(viewname, params=None, absolute=False, **kwargs):
    """
    >>> reverse('create_location', args=["test"], params={"selected": "foo"})
    '/a/test/settings/locations/new/?selected=foo'
    """
    url = _reverse(viewname, **kwargs)
    if absolute:
        url = "{}{}".format(get_url_base(), url)
    if params:
        url = "{}?{}".format(url, urlencode(params))
    return url
예제 #21
0
파일: views.py 프로젝트: mchampanis/core-hq
def bug_report(req):
    report = dict([(key, req.POST.get(key, '')) for key in (
        'subject',
        'username',
        'domain',
        'url',
        'now',
        'when',
        'message',
        'app_id',
    )])

    report['datetime'] = datetime.utcnow()

    report['time_description'] = u'just now' if report['now'] else u'earlier: {when}'.format(**report)
    if report['app_id']:
        app = import_app(report['app_id'], BUG_REPORTS_DOMAIN)
        report['copy_url'] = "%s%s" % (get_url_base(), reverse('view_app', args=[BUG_REPORTS_DOMAIN, app.id]))
    else:
        report['copy_url'] = None

    subject = u'CCHQ Bug Report ({domain}): {subject}'.format(**report)
    message = (
        u"username: {username}\n"
        u"domain: {domain}\n"
        u"url: {url}\n"
        u"copy url: {copy_url}\n"
        u"datetime: {datetime}\n"
        u"error occured: {time_description}\n"
        u"Message:\n\n"
        u"{message}\n"
    ).format(**report)

    from django.core.mail.message import EmailMessage
    from django.core.mail import send_mail

    if req.POST.get('five-hundred-report'):
        message = "%s \n\n This messge was reported from a 500 error page! Please fix this ASAP (as if you wouldn't anyway)..." % message
    email = EmailMessage(
        subject,
        message,
        report['username'],
        settings.BUG_REPORT_RECIPIENTS,
        headers = {'Reply-To': report['username']}
    )
    email.send(fail_silently=False)


    if req.POST.get('five-hundred-report'):
        messages.success(req, "Your CommCare HQ Issue Report has been sent. We are working quickly to resolve this problem.")
        return HttpResponseRedirect(reverse('homepage'))

    return HttpResponse()
예제 #22
0
    def to_json(self, data, options=None):
        options = options or {}
        domain = data.pop('domain', None)
        if not domain:
            raise Exception('API requires domain to be set! Did you add it in a custom create_response function?')
        case_type = data.pop('case_type', None)
        if not case_type:
            raise Exception(
                'API requires case_type to be set! Did you add it in a custom create_response function?'
            )
        api_path = data.pop('api_path', None)
        if not api_path:
            raise Exception(
                'API requires api_path to be set! Did you add it in a custom create_response function?'
            )
        data = self.to_simple(data, options)
        data['@odata.context'] = '{}#{}'.format(absolute_reverse('odata_meta', args=[domain]), case_type)

        next_url = data.pop('meta', {}).get('next')
        if next_url:
            data['@odata.nextLink'] = '{}{}{}'.format(get_url_base(), api_path, next_url)
        # move "objects" to "value"
        data['value'] = data.pop('objects')

        # clean properties
        def _clean_property_name(name):
            # for whatever ridiculous reason, at least in Tableau,
            # when these are nested inside an object they can't have underscores in them
            return name.replace('_', '')

        for i, case_json in enumerate(data['value']):
            case_json['properties'] = {_clean_property_name(k): v for k, v in case_json['properties'].items()}

        case_type_to_properties = get_case_type_to_properties(domain)
        properties_to_include = [
            'casename', 'casetype', 'dateopened', 'ownerid', 'backendid'
        ] + case_type_to_properties.get(case_type, [])

        for value in data['value']:
            for remove_property in [
                'id',
                'indexed_on',
                'indices',
                'resource_uri',
            ]:
                value.pop(remove_property)
            properties = value.get('properties')
            for property_name in list(properties):
                if property_name not in properties_to_include:
                    properties.pop(property_name)

        return json.dumps(data, cls=DjangoJSONEncoder, sort_keys=True)
예제 #23
0
    def get_report_content(self, attach_excel=False):
        """
        Get the report's HTML content as rendered by the static view format.

        """
        try:
            if self.report is None:
                return _("The report used to create this scheduled report is no"
                         " longer available on CommCare HQ.  Please delete this"
                         " scheduled report and create a new one using an available"
                         " report."), None
        except Exception:
            pass

        from django.http import HttpRequest, QueryDict
        request = HttpRequest()
        request.couch_user = self.owner
        request.user = self.owner.get_django_user()
        request.domain = self.domain
        request.couch_user.current_domain = self.domain

        request.GET = QueryDict(self.query_string + '&filterSet=true')

        # Make sure the request gets processed by PRBAC Middleware
        CCHQPRBACMiddleware.apply_prbac(request)

        try:
            response = self._dispatcher.dispatch(request, render_as='email',
                **self.view_kwargs)
            if attach_excel is True:
                file_obj = self._dispatcher.dispatch(request, render_as='excel',
                **self.view_kwargs)
            else:
                file_obj = None
            return json.loads(response.content)['report'], file_obj
        except PermissionDenied:
            return _("We are sorry, but your saved report '%(config_name)s' "
                     "is no longer accessible because your subscription does "
                     "not allow Custom Reporting. Please talk to your Project "
                     "Administrator about enabling Custom Reports. If you "
                     "want CommCare HQ to stop sending this message, please "
                     "visit %(saved_reports_url)s to remove this "
                     "Emailed Report.") % {
                         'config_name': self.name,
                         'saved_reports_url': "%s%s" % (
                             get_url_base(), reverse(
                                 'saved_reports', args=[request.domain])),
                     }, None
        except Exception as e:
            notify_exception(None, "Error generating report")
            return _("An error occurred while generating this report."), None
예제 #24
0
 def get_attachment_server_url(self, attachment_key):
     """
     A server specific URL for remote clients to access case attachment resources async.
     """
     if attachment_key in self.case_attachments:
         return "%s%s" % (web.get_url_base(),
                          reverse("api_case_attachment", kwargs={
                              "domain": self.domain,
                              "case_id": self._id,
                              "attachment_id": attachment_key,
                          })
         )
     else:
         return None
예제 #25
0
    def email_from_request(self):
        context = self.as_dict()
        context['settings_url'] = u"{url_base}{path}".format(
            url_base=get_url_base(),
            path=reverse('transfer_domain_view', args=[self.domain]))

        html_content = render_to_string("{template}.html".format(template=self.TRANSFER_FROM_EMAIL), context)
        text_content = render_to_string("{template}.txt".format(template=self.TRANSFER_FROM_EMAIL), context)

        send_HTML_email(
            _(u'Transfer of ownership for CommCare project space.'),
            self.from_user.email,
            html_content,
            text_content=text_content)
예제 #26
0
 def get_attachment_server_url(self, identifier):
     """
     A server specific URL for remote clients to access case attachment resources async.
     """
     if identifier in self.case_attachments:
         from dimagi.utils import web
         from django.core.urlresolvers import reverse
         return "%s%s" % (web.get_url_base(),
              reverse("api_case_attachment", kwargs={
                  "domain": self.domain,
                  "case_id": self.case_id,
                  "attachment_id": identifier,
              })
         )
     else:
         return None
예제 #27
0
def incomplete_domains_to_email():
    domains = _real_incomplete_domains()
    domains = _domains_over_x_forms(domains=list(domains))

    email_domains = []
    for domain in domains:
        users = list(WebUser.get_dimagi_emails_by_domain(domain))
        if users:
            email_domains.append(
                {
                    "domain_name": domain,
                    "email_to": users,
                    "settings_link": get_url_base() + reverse(EditBasicProjectInfoView.urlname, args=[domain]),
                }
            )

    return email_domains
예제 #28
0
    def invoke_kookoo_outbound_api(self, phone_number):
        url_base = get_url_base()
        params = urlencode(
            {
                "phone_no": phone_number,
                "api_key": self.config.api_key,
                "outbound_version": "2",
                "url": url_base + reverse("corehq.messaging.ivrbackends.kookoo.views.ivr"),
                "callback_url": url_base + reverse("corehq.messaging.ivrbackends.kookoo.views.ivr_finished"),
            }
        )
        url = "http://www.kookoo.in/outbound/outbound.php?%s" % params

        try:
            return urlopen(url, timeout=settings.IVR_GATEWAY_TIMEOUT).read()
        except Exception:
            notify_exception(None, message="[IVR] Error connecting to KooKoo")
            raise GatewayConnectionError("Error connecting to KooKoo")
예제 #29
0
파일: views.py 프로젝트: dimagi/commcare-hq
def form_context(request, domain, app_id, module_id, form_id):
    app = Application.get(app_id)
    form_url = '{}{}'.format(
        settings.CLOUDCARE_BASE_URL or get_url_base(),
        reverse('download_xform', args=[domain, app_id, module_id, form_id])
    )
    case_id = request.GET.get('case_id')
    instance_id = request.GET.get('instance_id')
    try:
        form = app.get_module(module_id).get_form(form_id)
    except (FormNotFoundException, ModuleNotFoundException):
        raise Http404()

    form_name = list(form.name.values())[0]

    # make the name for the session we will use with the case and form
    session_name = '{app} > {form}'.format(
        app=app.name,
        form=form_name,
    )

    if case_id:
        case = CaseAccessors(domain).get_case(case_id)
        session_name = '{0} - {1}'.format(session_name, case.name)

    root_context = {
        'form_url': form_url,
        'formplayer_url': settings.FORMPLAYER_URL,
    }
    if instance_id:
        try:
            root_context['instance_xml'] = FormAccessors(domain).get_form(instance_id).get_xml()
        except XFormNotFound:
            raise Http404()

    session_extras = {'session_name': session_name, 'app_id': app._id}
    session_extras.update(get_cloudcare_session_data(domain, form, request.couch_user))

    delegation = request.GET.get('task-list') == 'true'
    session_helper = CaseSessionDataHelper(domain, request.couch_user, case_id, app, form, delegation=delegation)
    return json_response(session_helper.get_full_context(
        root_context,
        session_extras
    ))
예제 #30
0
파일: util.py 프로젝트: kkrampa/commcare-hq
def expose_zipped_blob_download(data_path, filename, format, domain):
    """Expose zipped file content as a blob download

    :param data_path: Path to data file. Will be deleted.
    :param filename: File name.
    :param format: `couchexport.models.Format` constant.
    :param domain: Domain name.
    :returns: A link to download the file.
    """
    try:
        _, zip_temp_path = tempfile.mkstemp(".zip")
        with ZipFile(zip_temp_path, 'w') as zip_file_:
            zip_file_.write(data_path, filename)
    finally:
        os.remove(data_path)

    try:
        expiry_mins = 60 * 24
        file_format = Format.from_format(format)
        file_name_header = safe_filename_header(filename, file_format.extension)
        ref = expose_blob_download(
            filename,
            expiry=expiry_mins * 60,
            mimetype=file_format.mimetype,
            content_disposition=file_name_header
        )
        with open(zip_temp_path, 'rb') as file_:
            get_blob_db().put(
                file_,
                domain=domain,
                parent_id=domain,
                type_code=CODES.tempfile,
                key=ref.download_id,
                timeout=expiry_mins
            )
    finally:
        os.remove(zip_temp_path)

    return "%s%s?%s" % (
        get_url_base(),
        reverse('retrieve_download', kwargs={'download_id': ref.download_id}),
        "get_file"  # download immediately rather than rendering page
    )
예제 #31
0
def form_context(request, domain, app_id, module_id, form_id):
    app = Application.get(app_id)
    form_url = '{}{}'.format(
        settings.CLOUDCARE_BASE_URL or get_url_base(),
        reverse('download_xform', args=[domain, app_id, module_id, form_id])
    )
    case_id = request.GET.get('case_id')
    instance_id = request.GET.get('instance_id')
    try:
        form = app.get_module(module_id).get_form(form_id)
    except (FormNotFoundException, ModuleNotFoundException):
        raise Http404()

    form_name = list(form.name.values())[0]

    # make the name for the session we will use with the case and form
    session_name = '{app} > {form}'.format(
        app=app.name,
        form=form_name,
    )

    if case_id:
        case = CaseAccessors(domain).get_case(case_id)
        session_name = '{0} - {1}'.format(session_name, case.name)
예제 #32
0
    def _release_report(self, domain_link, model):
        report_id = model['detail']['report_id']
        found = False
        for linked_report in get_report_configs_for_domain(
                domain_link.linked_domain):
            if linked_report.report_meta.master_id == report_id:
                found = True
                update_linked_ucr(domain_link, linked_report.get_id)

        if not found:
            report = ReportConfiguration.get(report_id)
            if report.report_meta.created_by_builder:
                view = 'edit_report_in_builder'
            else:
                view = 'edit_configurable_report'
            url = get_url_base() + reverse(
                view, args=[domain_link.master_domain, report_id])
            return self._error_tuple(
                _('Could not find report. <a href="{}">Click here</a> and click "Link Report" to link this '
                  + 'report.').format(url),
                text=
                _('Could not find report. Please check that the report has been linked.'
                  ),
            )
예제 #33
0
def send_new_request_update_email(user,
                                  requesting_ip,
                                  entity_name,
                                  entity_type="domain",
                                  is_new_user=False,
                                  is_confirming=False):
    entity_texts = {
        "domain": ["project space", "Project"],
        "org": ["organization", "Organization"]
    }[entity_type]
    if is_confirming:
        message = "A (basically) brand new user just confirmed his/her account. The %s requested was %s." % (
            entity_texts[0], entity_name)
    elif is_new_user:
        message = "A brand new user just requested a %s called %s." % (
            entity_texts[0], entity_name)
    else:
        message = "An existing user just created a new %s called %s." % (
            entity_texts[0], entity_name)
    message = u"""%s

Details include...

Username: %s
IP Address: %s

You can view the %s here: %s""" % (
        message, user.username, requesting_ip, entity_texts[0],
        get_url_base() + "/%s/%s/" %
        ("o" if entity_type == "org" else "a", entity_name))
    try:
        recipients = settings.NEW_DOMAIN_RECIPIENTS
        send_mail_async.delay(u"New %s: %s" % (entity_texts[0], entity_name),
                              message, settings.SERVER_EMAIL, recipients)
    except Exception:
        logging.warning("Can't send email, but the message was:\n%s" % message)
예제 #34
0
 def get_next_url(meta, api_path):
     next_page = meta['next']
     if next_page:
         return '{}{}{}'.format(get_url_base(), api_path, next_page)
예제 #35
0
def initiate_outbound_call(call_log_entry, *args, **kwargs):
    phone_number = call_log_entry.phone_number
    if phone_number.startswith("+"):
        phone_number = phone_number[1:]

    if phone_number.startswith("91"):
        phone_number = "0" + phone_number[2:]
    else:
        call_log_entry.error = True
        call_log_entry.error_message = "Kookoo can only send to Indian phone numbers."
        call_log_entry.save()
        return False

    form = Form.get_form(call_log_entry.form_unique_id)
    app = form.get_app()
    module = form.get_module()

    # Only precache the first response if it's not an only-label form, otherwise we could end up
    # submitting the form regardless of whether the person actually answers the call.
    if form_requires_input(form):
        recipient = call_log_entry.recipient
        case_id = get_case_id(call_log_entry)
        session, responses = start_session(recipient.domain,
                                           recipient,
                                           app,
                                           module,
                                           form,
                                           case_id,
                                           yield_responses=True,
                                           session_type=XFORMS_SESSION_IVR)

        ivr_responses = []
        if len(responses) == 0:
            call_log_entry.error = True
            call_log_entry.error_message = "No prompts seen in form. Please check that the form does not have errors."
            call_log_entry.save()
            return False

        for response in responses:
            ivr_responses.append(
                format_ivr_response(response.event.caption, app))

        input_length = get_input_length(responses[-1])

        call_log_entry.use_precached_first_response = True
        call_log_entry.xforms_session_id = session.session_id

    url_base = get_url_base()

    params = urlencode({
        "phone_no":
        phone_number,
        "api_key":
        kwargs["api_key"],
        "outbound_version":
        "2",
        "url":
        url_base + reverse("corehq.apps.kookoo.views.ivr"),
        "callback_url":
        url_base + reverse("corehq.apps.kookoo.views.ivr_finished"),
    })
    url = "http://www.kookoo.in/outbound/outbound.php?%s" % params
    response = urlopen(url, timeout=settings.IVR_GATEWAY_TIMEOUT).read()

    root = XML(response)
    for child in root:
        if child.tag.endswith("status"):
            status = child.text
        elif child.tag.endswith("message"):
            message = child.text

    if status == "queued":
        call_log_entry.error = False
        call_log_entry.gateway_session_id = "KOOKOO-" + message
    elif status == "error":
        call_log_entry.error = True
        call_log_entry.error_message = message
    else:
        call_log_entry.error = True
        call_log_entry.error_message = "Unknown status received from Kookoo."

    if call_log_entry.error:
        call_log_entry.use_precached_first_response = False

    if call_log_entry.use_precached_first_response:
        call_log_entry.first_response = get_http_response_string(
            call_log_entry.gateway_session_id,
            ivr_responses,
            collect_input=True,
            hang_up=False,
            input_length=input_length)

    call_log_entry.save()
    return not call_log_entry.error
예제 #36
0
def bug_report(req):
    report = dict([(key, req.POST.get(key, ''))
                   for key in ('subject', 'username', 'domain', 'url',
                               'message', 'app_id', 'cc')])

    report['user_agent'] = req.META['HTTP_USER_AGENT']
    report['datetime'] = datetime.utcnow()

    if report['app_id']:
        app = import_app(report['app_id'], BUG_REPORTS_DOMAIN)
        report['copy_url'] = "%s%s" % (
            get_url_base(),
            reverse('view_app', args=[BUG_REPORTS_DOMAIN, app.id]))
    else:
        report['copy_url'] = None

    try:
        couch_user = CouchUser.get_by_username(report['username'])
        full_name = couch_user.full_name
        email = couch_user.get_email()
    except Exception:
        full_name = None
        email = None
    report['full_name'] = full_name
    report['email'] = email or report['username']

    matching_subscriptions = Subscription.objects.filter(
        is_active=True,
        subscriber__domain=report['domain'],
    )

    if len(matching_subscriptions) >= 1:
        report['software_plan'] = matching_subscriptions[0].plan_version
    else:
        report['software_plan'] = u'domain has no active subscription'

    subject = u'{subject} ({domain})'.format(**report)
    message = (u"username: {username}\n"
               u"full name: {full_name}\n"
               u"domain: {domain}\n"
               u"software plan: {software_plan}\n"
               u"url: {url}\n"
               u"copy url: {copy_url}\n"
               u"datetime: {datetime}\n"
               u"User Agent: {user_agent}\n"
               u"Message:\n\n"
               u"{message}\n").format(**report)
    cc = report['cc'].strip().split(",")
    cc = filter(None, cc)

    if full_name and not any([c in full_name for c in '<>"']):
        reply_to = u'"{full_name}" <{email}>'.format(**report)
    else:
        reply_to = report['email']

    # if the person looks like a commcare user, fogbugz can't reply
    # to their email, so just use the default
    if settings.HQ_ACCOUNT_ROOT in reply_to:
        reply_to = settings.SERVER_EMAIL

    if req.POST.get('five-hundred-report'):
        message = "%s \n\n This messge was reported from a 500 error page! Please fix this ASAP (as if you wouldn't anyway)..." % message
    email = EmailMessage(subject=subject,
                         body=message,
                         to=settings.BUG_REPORT_RECIPIENTS,
                         headers={'Reply-To': reply_to},
                         cc=cc)

    uploaded_file = req.FILES.get('report_issue')
    if uploaded_file:
        filename = uploaded_file.name
        content = uploaded_file.read()
        email.attach(filename=filename, content=content)

    # only fake the from email if it's an @dimagi.com account
    if re.search('@dimagi\.com$', report['username']):
        email.from_email = report['username']
    else:
        email.from_email = settings.CCHQ_BUG_REPORT_EMAIL

    email.send(fail_silently=False)

    if req.POST.get('five-hundred-report'):
        messages.success(
            req,
            "Your CommCare HQ Issue Report has been sent. We are working quickly to resolve this problem."
        )
        return HttpResponseRedirect(reverse('homepage'))

    return HttpResponse()
예제 #37
0
def get_nimbus_url():
    formplayer_url = settings.FORMPLAYER_URL
    if not formplayer_url.startswith('http'):
        formplayer_url = '{}{}'.format(get_url_base(), formplayer_url)
    return formplayer_url
예제 #38
0
 def activate_url(self):
     return "{url_base}/domain/transfer/{guid}/activate".format(
         url_base=get_url_base(), guid=self.transfer_guid)
예제 #39
0
def _get_full_sso_url(view_name, identity_provider):
    return "{}{}".format(get_url_base(),
                         reverse(view_name, args=(identity_provider.slug, )))
예제 #40
0
def osdd(request, template='osdd.xml'):
    response = render(request, template, {'url_base': get_url_base()})
    response['Content-Type'] = 'application/xml'
    return response
예제 #41
0
def get_saml2_config(identity_provider):
    sp_settings = {
        "entityId":
        "{}{}".format(
            get_url_base(),
            reverse("sso_saml_metadata", args=(identity_provider.slug, ))),
        "assertionConsumerService": {
            "url":
            "{}{}".format(
                get_url_base(),
                reverse("sso_saml_acs", args=(identity_provider.slug, ))),
            "binding":
            OneLogin_Saml2_Constants.BINDING_HTTP_POST,
        },
        "singleLogoutService": {
            "url":
            "{}{}".format(
                get_url_base(),
                reverse("sso_saml_sls", args=(identity_provider.slug, ))),
            "binding":
            OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT,
        },
        "attributeConsumingService": {
            "serviceName":
            "CommCare HQ",
            "serviceDescription":
            "SSO for CommCare HQ",
            "requestedAttributes": [
                {
                    "name": "emailAddress",
                    "isRequired": True,
                    "nameFormat":
                    OneLogin_Saml2_Constants.NAMEID_EMAIL_ADDRESS,
                    "friendlyName": "Email Address",
                    "attributeValue": ["*****@*****.**"],
                },
            ],
        },
        "NameIDFormat":
        OneLogin_Saml2_Constants.NAMEID_EMAIL_ADDRESS,
        "x509cert":
        identity_provider.sp_cert_public,
        "privateKey":
        identity_provider.sp_cert_private,
    }

    if identity_provider.sp_rollover_cert_public:
        sp_settings['x509certNew'] = identity_provider.sp_rollover_cert_public

    saml_config = {
        "strict": True,
        "debug": settings.SAML2_DEBUG,
        "sp": sp_settings,
        "idp": {
            "entityId": identity_provider.entity_id,
            "singleSignOnService": {
                "url": identity_provider.login_url,
                "binding": OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT,
            },
            "singleLogoutService": {
                "url": identity_provider.logout_url,
                "binding": OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT,
            },
            "x509cert": identity_provider.idp_cert_public,
        },
    }

    saml_config.update(_get_advanced_saml2_settings())
    return saml_config
예제 #42
0
def bug_report(req):
    report = dict([(key, req.POST.get(key, '')) for key in (
        'subject',
        'username',
        'domain',
        'url',
        'message',
        'app_id',
    )])

    report['user_agent'] = req.META['HTTP_USER_AGENT']
    report['datetime'] = datetime.utcnow()

    if report['app_id']:
        app = import_app(report['app_id'], BUG_REPORTS_DOMAIN)
        report['copy_url'] = "%s%s" % (
            get_url_base(),
            reverse('view_app', args=[BUG_REPORTS_DOMAIN, app.id]))
    else:
        report['copy_url'] = None

    try:
        couch_user = CouchUser.get_by_username(report['username'])
        full_name = couch_user.full_name
    except Exception:
        full_name = None
    report['full_name'] = full_name

    subject = u'{subject} ({domain})'.format(**report)
    message = (u"username: {username}\n"
               u"full name: {full_name}\n"
               u"domain: {domain}\n"
               u"url: {url}\n"
               u"copy url: {copy_url}\n"
               u"datetime: {datetime}\n"
               u"User Agent: {user_agent}\n"
               u"Message:\n\n"
               u"{message}\n").format(**report)

    if full_name and not any([c in full_name for c in '<>"']):
        reply_to = '"{full_name}" <{username}>'.format(**report)
    else:
        reply_to = report['username']

    # if the person looks like a commcare user, fogbugz can't reply
    # to their email, so just use the default
    if settings.HQ_ACCOUNT_ROOT in reply_to:
        reply_to = settings.SERVER_EMAIL

    if req.POST.get('five-hundred-report'):
        message = "%s \n\n This messge was reported from a 500 error page! Please fix this ASAP (as if you wouldn't anyway)..." % message
    email = EmailMessage(subject=subject,
                         body=message,
                         to=settings.BUG_REPORT_RECIPIENTS,
                         headers={'Reply-To': reply_to})

    # only fake the from email if it's an @dimagi.com account
    if re.search('@dimagi\.com$', report['username']):
        email.from_email = report['username']

    email.send(fail_silently=False)

    if req.POST.get('five-hundred-report'):
        messages.success(
            req,
            "Your CommCare HQ Issue Report has been sent. We are working quickly to resolve this problem."
        )
        return HttpResponseRedirect(reverse('homepage'))

    return HttpResponse()