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))
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)
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