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 )
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 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"
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)
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) })
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"
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)
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 )
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
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} ))
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
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)
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))
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)
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)
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)
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
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)
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)
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
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()
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)
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
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
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)
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
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
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")
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 ))
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 )
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)
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.' ), )
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)
def get_next_url(meta, api_path): next_page = meta['next'] if next_page: return '{}{}{}'.format(get_url_base(), api_path, next_page)
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
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()
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
def activate_url(self): return "{url_base}/domain/transfer/{guid}/activate".format( url_base=get_url_base(), guid=self.transfer_guid)
def _get_full_sso_url(view_name, identity_provider): return "{}{}".format(get_url_base(), reverse(view_name, args=(identity_provider.slug, )))
def osdd(request, template='osdd.xml'): response = render(request, template, {'url_base': get_url_base()}) response['Content-Type'] = 'application/xml' return response
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
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()