docs: def validate_nrml(request):
      """
      Leverage oq-risklib to check if a given XML text is a valid NRML
  
      :param request:
          a `django.http.HttpRequest` object containing the mandatory
          parameter 'xml_text': the text of the XML to be validated as NRML
  
      :returns: a JSON object, containing:
          * 'valid': a boolean indicating if the provided text is a valid NRML
          * 'error_msg': the error message, if any error was found
                         (None otherwise)
          * 'error_line': line of the given XML where the error was found
                          (None if no error was found or if it was not a
                          validation error)
      """
      xml_text = request.POST.get('xml_text')
      if not xml_text:
          return HttpResponseBadRequest(
              'Please provide the "xml_text" parameter')
      xml_file = gettemp(xml_text, suffix='.xml')
      try:
          nrml.to_python(xml_file)
      except ExpatError as exc:
          return _make_response(error_msg=str(exc),
                                error_line=exc.lineno,
                                valid=False)
      except Exception as exc:
          # get the exception message
          exc_msg = exc.args[0]
          if isinstance(exc_msg, bytes):
              exc_msg = exc_msg.decode('utf-8')   # make it a unicode object
          elif isinstance(exc_msg, str):
              pass
          else:
              # if it is another kind of object, it is not obvious a priori how
              # to extract the error line from it
              return _make_response(
                  error_msg=str(exc_msg), error_line=None, valid=False)
          # if the line is not mentioned, the whole message is taken
          error_msg = exc_msg.split(', line')[0]
          # check if the exc_msg contains a line number indication
          search_match = re.search(r'line \d+', exc_msg)
          if search_match:
              error_line = int(search_match.group(0).split()[1])
          else:
              error_line = None
          return _make_response(
              error_msg=error_msg, error_line=error_line, valid=False)
      else:
          return _make_response(error_msg=None, error_line=None, valid=True)