Esempio n. 1
0
def deserialize_fields(text):
    """
    Deserializes fields, according to RU-CENTER API rules
    :return:
    """
    fields = {}
    for record in text.split('\n'):
        record = record.strip()
        if record == '':
            continue

        logger.debug("Unpack record '%s'" % record)

        key_value = record.split(':', 1)
        if len(key_value) != 2:
            raise ValueError(_("Wrong field record '%s'" % record))

        (key, value) = key_value
        key = key.strip()

        if key not in fields:
            fields[key] = value.strip()
        else:
            fields[key] += ('\n' + value.strip())

    return fields
Esempio n. 2
0
    def send(self, url):
        """
        Send request to url and get Response
        """
        assert url

        request_body = ''

        # serialize headers
        header = ProtocolHeader(self.headers)
        request_body += header.serialize()
        request_body += "\n"

        # serialize sections
        for section in self.sections:
            request_body += section.serialize()
            request_body += "\n"

        # send request
        headers = {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Charset": "utf-8"
        }
        data = urlencode({
            'SimpleRequest': request_body.encode('KOI8-R', errors='ignore')
        })

        logger.debug("Sending request to: %s", url)
        logger.debug(request_body)

        http_response = requests.post(url, data, headers=headers)
        http_response.encoding = http_response.apparent_encoding
        if http_response.status_code >= 500 or http_response.status_code == 405:
            raise Exception(_("HTTP error %s. Service unavailable." % http_response.status_code))

        response = RucenterResponse.from_http(http_response)
        if response.state >= 400:
            error_section = response.get_section('error')
            raise Exception(_("API ERROR %s: %s" % (response.state, '; '.join(error_section.errors))))

        return response
Esempio n. 3
0
def serialize_fields(fields):
    """
    Serializes fields, according to RU-CENTER API rules
    :param fields:
    :return:
    """
    logger.debug("Serialize fields:")
    logger.debug(fields)

    serialized = ''
    for key in fields:
        if not fields[key]:
            continue

        for line in unicode(fields[key]).split('\n'):
            line = line.strip()
            if line == '':
                continue

            serialized += "%s:%s\n" % (key, line)

    logger.debug("Serialized: %s", serialized)

    return serialized