Exemple #1
0
def envelope(**kwargs):
    """Create OAI-PMH envelope for response."""
    e_oaipmh = Element(etree.QName(NS_OAIPMH, 'OAI-PMH'), nsmap=NSMAP)
    e_oaipmh.set(etree.QName(NS_XSI, 'schemaLocation'),
                 '{0} {1}'.format(NS_OAIPMH, NS_OAIPMH_XSD))
    e_tree = ElementTree(element=e_oaipmh)

    if current_app.config['OAISERVER_XSL_URL']:
        e_oaipmh.addprevious(
            etree.ProcessingInstruction(
                'xml-stylesheet', 'type="text/xsl" href="{0}"'.format(
                    current_app.config['OAISERVER_XSL_URL'])))

    e_responseDate = SubElement(e_oaipmh, etree.QName(NS_OAIPMH,
                                                      'responseDate'))
    # date should be first possible moment
    e_responseDate.text = datetime_to_datestamp(datetime.utcnow())
    e_request = SubElement(e_oaipmh, etree.QName(NS_OAIPMH, 'request'))
    for key, value in kwargs.items():
        if key == 'from_' or key == 'until':
            value = datetime_to_datestamp(value)
        elif key == 'resumptionToken':
            value = value['token']
        e_request.set(key, value)
    e_request.text = url_for('invenio_oaiserver.response', _external=True)
    return e_tree, e_oaipmh
def envelope(**kwargs):
    """Create OAI-PMH envelope for response."""
    e_oaipmh = Element(etree.QName(NS_OAIPMH, 'OAI-PMH'), nsmap=NSMAP)
    e_oaipmh.set(etree.QName(NS_XSI, 'schemaLocation'),
                 '{0} {1}'.format(NS_OAIPMH, NS_OAIPMH_XSD))
    e_tree = ElementTree(element=e_oaipmh)

    e_oaipmh.addprevious(etree.ProcessingInstruction(
        'xml-stylesheet', 'type="text/xsl" href="{0}"'.format(url_for(
            'invenio_oaiserver.static', filename='xsl/oai2.v1.0.xsl'))))

    e_responseDate = SubElement(
        e_oaipmh, etree.QName(
            NS_OAIPMH, 'responseDate'))
    # date should be first possible moment
    e_responseDate.text = datetime_to_datestamp(datetime.utcnow())
    e_request = SubElement(e_oaipmh, etree.QName(NS_OAIPMH, 'request'))
    for key, value in kwargs.items():
        if key == 'from_' or key == 'until':
            value = datetime_to_datestamp(value)
        elif key == 'resumptionToken':
            value = value['token']
        e_request.set(key, value)
    e_request.text = url_for('invenio_oaiserver.response', _external=True)
    return e_tree, e_oaipmh
def link_xslt(root: ET.Element, href: str = None):
    if not ET_HAVE_LXML:
        raise NotImplementedError("Please install the LXML package")
    pseudoattrs = {'type': 'text/xsl', 'href': href}
    value = ' '.join("{:s}='{:s}'".format(k, html.escape(v, quote=True))
                     for (k, v) in pseudoattrs.items())
    root.addprevious(ET.ProcessingInstruction('xml-stylesheet', value))
Exemple #4
0
def createFinvoice(expense, expenselines):
    top = Element('Finvoice')
    top.set('Version', '1.2')

    top.addprevious(
        etree.PI('xml-stylesheet', 'type="text/xsl" href="Finvoice.xsl"'))

    sp = SubElement(top, 'SellerPartyDetails')
    spi = SubElement(sp, 'SellerPartyIdentifier')
    spi.text = expense.personno.upper()
    spn = SubElement(sp, 'SellerOrganisationName')
    spn.text = expense.name

    spad = SubElement(sp, 'SellerPostalAddressDetails')
    ssn = SubElement(spad, 'SellerStreetName')
    ssn.text = expense.address

    scd = SubElement(top, 'SellerCommunicationDetails')
    sei = SubElement(scd, 'SellerEmailaddressIdentifier')
    sei.text = expense.email
    spni = SubElement(scd, 'SellerPhoneNumberIdentifier')
    spni.text = expense.phone

    si = SubElement(top, 'SellerInformationDetails')
    sa = SubElement(si, 'SellerAccountDetails')
    said = SubElement(sa, 'SellerAccountID')
    said.set('IdentificationSchemeName', 'IBAN')
    said.text = expense.iban
    sab = SubElement(sa, 'SellerBic')
    sab.set('IdentificationSchemeName', 'BIC')
    sab.text = expense.swift_bic

    b = SubElement(top, 'BuyerPartyDetails')
    bpi = SubElement(b, 'BuyerPartyIdentifier')
    bpi.text = expense.organisation.business_id
    bon = SubElement(b, 'BuyerOrganisationName')
    bon.text = expense.organisation.name

    i = SubElement(top, 'InvoiceDetails')
    itc = SubElement(i, 'InvoiceTypeCode')
    itc.text = 'INV01'
    itt = SubElement(i, 'InvoiceTypeText')
    itt.text = 'LASKU'
    i_n = SubElement(i, 'OriginCode')
    i_n.text = 'Original'
    i_n = SubElement(i, 'InvoiceNumber')
    i_n.text = str(expense.id)
    i_d = SubElement(i, 'InvoiceDate')
    i_d.set('Format', 'CCYYMMDD')
    i_d.text = expense.created_at.strftime('%Y%m%d')

    if expense.needsKatre():
        i_ref = SubElement(i, 'BuyerReferenceIdentifier')
        i_ref.text = 'KATRE_EMCE'

    itvea = SubElement(i, 'InvoiceTotalVatExcludedAmount')
    itvea.set('AmountCurrencyIdentifier', 'EUR')
    itvea.text = currency(expense.amount(), '')
    itvva = SubElement(i, 'InvoiceTotalVatAmount')
    itvva.set('AmountCurrencyIdentifier', 'EUR')
    itvva.text = '0'
    itvia = SubElement(i, 'InvoiceTotalVatIncludedAmount')
    itvia.set('AmountCurrencyIdentifier', 'EUR')
    itvia.text = currency(expense.amount(), '')
    iv = SubElement(i, 'VatSpecificationDetails')
    ivba = SubElement(iv, 'VatBaseAmount')
    ivba.set('AmountCurrencyIdentifier', 'EUR')
    ivba.text = currency(expense.amount(), '')
    ivrp = SubElement(iv, 'VatRatePercent')
    ivrp.text = '0'
    ivra = SubElement(iv, 'VatRateAmount')
    ivra.set('AmountCurrencyIdentifier', 'EUR')
    ivra.text = '0'
    iftd = SubElement(i, 'InvoiceFreeText')
    iftd.text = expense.description
    iftm = SubElement(i, 'InvoiceFreeText')
    iftm.text = expense.memo

    for line in expenselines:
        row = SubElement(top, 'InvoiceRow')
        ran = SubElement(row, 'ArticleName')
        ran.text = line.expensetype.name + ': ' + line.description
        raq = SubElement(row, 'DeliveredQuantity')
        raq.set('QuantityUnitCode', line.expensetype.unit)
        raq.text = currency(line.basis, '')
        raa = SubElement(row, 'UnitPriceAmount')
        raa.set('AmountCurrencyIdentifier', 'EUR')
        raa.text = currency(line.expensetype.multiplier, '')
        ra = SubElement(row, 'RowShortProposedAccountIdentifier')
        ra.text = line.expensetype.account
        rd = SubElement(row, 'RowAccountDimensionText')
        if line.accountdimension:
            rd.text = line.accountdimension.code
        rvva = SubElement(row, 'RowVatRatePercent')
        rvva.text = '0'
        rvva = SubElement(row, 'RowVatAmount')
        rvva.set('AmountCurrencyIdentifier', 'EUR')
        rvva.text = '0'
        rvea = SubElement(row, 'RowVatExcludedAmount')
        rvea.set('AmountCurrencyIdentifier', 'EUR')
        rvea.text = currency(line.sum(), '')
        rva = SubElement(row, 'RowAmount')
        rva.set('AmountCurrencyIdentifier', 'EUR')
        rva.text = currency(line.sum(), '')

        # Nyt jännittää -Joonas
        # 10.1.2013 - Added if-statements to verify that the values actually exist
        if line.begin_at:
            rsd = SubElement(row, 'StartDate')
            rsd.set('Format', 'CCYYMMDD')
            rsd.text = line.begin_at.strftime('%Y%m%d')
        if line.ended_at:
            red = SubElement(row, 'EndDate')
            red.set('Format', 'CCYYMMDD')
            red.text = line.ended_at.strftime('%Y%m%d')

        if line.expensetype.requires_endtime:
            rft = SubElement(i, 'InvoiceFreeText')
            rft.text = (
                line.expensetype.name + ', ' + line.description + ': ' +
                timezone.localtime(line.begin_at).strftime('%d.%m.%Y %H:%M') +
                ' - ' +
                timezone.localtime(line.ended_at).strftime('%d.%m.%Y %H:%M'))

    e = SubElement(top, 'EpiDetails')
    ei = SubElement(e, 'EpiIdentificationDetails')
    eid = SubElement(ei, 'EpiDate')
    eid.set('Format', 'CCYYMMDD')
    eid.text = expense.created_at.strftime('%Y%m%d')
    SubElement(ei, 'EpiReference')
    ep = SubElement(e, 'EpiPartyDetails')
    epb = SubElement(ep, 'EpiBfiPartyDetails')
    epbi = SubElement(epb, 'EpiBfiIdentifier')
    epbi.set('IdentificationSchemeName', 'BIC')
    epbi.text = expense.swift_bic
    epd = SubElement(ep, 'EpiBeneficiaryPartyDetails')
    epdn = SubElement(epd, 'EpiNameAddressDetails')
    epdn.text = expense.name
    epda = SubElement(epd, 'EpiAccountID')
    epda.set('IdentificationSchemeName', 'IBAN')
    epda.text = expense.iban
    ey = SubElement(e, 'EpiPaymentInstructionDetails')
    er = SubElement(ey, 'EpiRemittanceInfoIdentifier')
    er.set('IdentificationSchemeName', 'SPY')
    refno = str(expense.created_at.strftime('%Y')) + str(expense.id).zfill(5)
    from expenseapp.helpers import viitenumeron_tarkiste
    er.text = refno + str(viitenumeron_tarkiste(refno))
    eya = SubElement(ey, 'EpiInstructedAmount')
    eya.set('AmountCurrencyIdentifier', 'EUR')
    eya.text = currency(expense.amount(), '')
    ec = SubElement(ey, 'EpiCharge')
    ec.set('ChargeOption', 'SHA')
    eyd = SubElement(ey, 'EpiDateOptionDate')
    eyd.set('Format', 'CCYYMMDD')
    eyd.text = expense.created_at.strftime('%Y%m%d')

    return tostring(top.getroottree(),
                    encoding='UTF-8',
                    xml_declaration=True,
                    pretty_print=True)
Exemple #5
0
def write_svg(
    svg: Union[str, IO[bytes]],
    xml: etree.Element,
    stylesheet: Optional[str] = None,
    do_link_css: bool = False,
    **tostring_kwargs,
) -> str:
    """
    Write an xml element as an svg file.

    :param svg: open binary file object or path to output file (include extension .svg)
    :param xml: root node of your svg geometry
    :param stylesheet: optional path to css stylesheet
    :param do_link_css: link to stylesheet, else (default) write contents of stylesheet
        into svg (ignored if stylesheet is None)
    :param tostring_kwargs: keyword arguments to etree.tostring. xml_header=True for
        sensible default values. See below.
    :return: svg filename
    :effects: creates svg file at ``svg``

    It's often useful to write a temporary svg file, so a tempfile.NamedTemporaryFile
    object (or any open binary file object can be passed instead of an svg filename).

    You may never need an xml_header. Inkscape doesn't need it, your browser doesn't
    need it, and it's forbidden if you'd like to "inline" your svg in an html file.
    The most pressing need might be to set an encoding. If you pass
    ``xml_declaration=True`` as a tostring_kwarg, this function will attempt to pass
    the following defaults to ``lxml.etree.tostring``:

    * doctype: str = (
        '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"\n'
        '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
    )
    * encoding = "UTF-8"

    Always, this function will default to ``pretty_print=True``

    These can be overridden by tostring_kwargs.

    e.g., ``write_svg(..., xml_declaration=True, doctype=None``)
    e.g., ``write_svg(..., xml_declaration=True, encoding='ascii')``

    ``lxml.etree.tostring`` is documented here: https://lxml.de/api/index.html,
    but I know that to be incomplete as of 2020 Feb 01, as it does not document the
    (perhaps important to you) 'encoding' kwarg.
    """
    if stylesheet is not None:
        if do_link_css is True:
            relative_css_path = Path(stylesheet).relative_to(Path(svg).parent)
            link = etree.PI("xml-stylesheet",
                            f'href="{relative_css_path}" type="text/css"')
            xml.addprevious(link)
        else:
            style = etree.Element("style", type="text/css")
            with open(stylesheet) as css_file:
                style.text = etree.CDATA("\n" + "".join(css_file.readlines()) +
                                         "\n")
            xml.insert(0, style)

    svg_contents = svg_tostring(xml, **tostring_kwargs)

    try:
        svg.write(svg_contents)
        return svg.name
    except AttributeError:
        with open(svg, "wb") as svg_file:
            svg_file.write(svg_contents)
        return svg