コード例 #1
0
def generate(template_path, data_file, out_file=None, year=None):
    """
    Generate a week calendar for an entire year in odt format.

    Args:
        template_path (str): The file path of the template to render.
        data_file (str): The path of the configuration to load.
        out_file (io.IOBase): A file-like object to write the calendar
            to.
        year (int): The year to render the calendar for. A year
            specified in the data_file is used as a fallback value.

    Raises:
        .BadConfigError: If the given configuration file is missing
            configurations.

    """
    with open(data_file) as f:
        calendar_data = yaml.load(f)
    try:
        year = year or calendar_data['year']
        birthdays = calendar_data['birthdays']
        weddings = calendar_data['weddings']
        special_dates = calendar_data['special dates']
    except KeyError:
        raise BadConfigError()
    weeks = create_weeks_for_year(year, birthdays, weddings, special_dates)
    template = Template(source=None, filepath=template_path)
    generated = template.generate(weeks=weeks)
    data = generated.render().getvalue()
    if not out_file:
        out_file = open('calendar-{:d}.odt'.format(year), 'wb')
    out_file.write(data)
コード例 #2
0
ファイル: test_odt.py プロジェクト: kakamble-aiims/work
 def test_generate_fod(self):
     "Testing generate fod"
     thisdir = os.path.dirname(__file__)
     filepath = os.path.join(thisdir, 'test.fodt')
     with open(filepath, mode='rb') as source:
         oot = Template(source)
         oot.generate(**self.data)
コード例 #3
0
def createLetter():

    #    if request.form:
    #        data={'recipient':json.loads(request.form['recipient']),
    #              'sender':json.loads(request.form['sender'])}
    #    elif (request.json):
    #        data=request.json
    #
    data = {"recipient": json.loads(request.form["recipient"]), "sender": json.loads(request.form["sender"])}

    letter_data = jsonToLetterData(data)
    print letter_data

    basic = Template(source="IPC_DATA", filepath=os.path.join(topPath, "IPC_ger_Letter.odt"))
    print ("TemplateDone")
    basic_generated = basic.generate(o=letter_data).render()
    print ("filled Done")
    odt_data = basic_generated.getvalue()
    print ("generated Done")

    f = tempfile.NamedTemporaryFile(delete=False, mode="wb", dir=os.path.join(topPath, "static"))
    print ("%s.odt" % f.name)

    f.write(odt_data)

    response = make_response(odt_data)
    fileRecipientFirst = letter_data["recipient"]["surname"].encode("ascii", "ignore")
    fileRecipientSur = letter_data["recipient"]["firstname"].encode("ascii", "ignore")
    fileDate = letter_data["date"]
    filename = "Letter_to_%s_%s_%s" % (fileRecipientFirst, fileRecipientSur, fileDate)
    response.headers["Content-Disposition"] = "attachment; filename=%s.odt" % filename
    response.mimetype = "text/odt"

    return response
コード例 #4
0
ファイル: test_odt.py プロジェクト: kakamble-aiims/work
 def setUp(self):
     thisdir = os.path.dirname(__file__)
     filepath = os.path.join(thisdir, 'test.odt')
     self._source = open(filepath, mode='rb')
     self.oot = Template(self._source)
     self.data = {
         'first_name':
         u'Trente',
         'last_name':
         u'Møller',
         'ville':
         u'Liège',
         'friends': [{
             'first_name': u'Camille',
             'last_name': u'Salauhpe'
         }, {
             'first_name': u'Mathias',
             'last_name': u'Lechat'
         }],
         'hobbies': [u'Music', u'Dancing', u'DJing'],
         'animals': [u'Felix da housecat', u'Dog eat Dog'],
         'images': [(open(os.path.join(thisdir, 'one.jpg'),
                          'rb'), 'image/jpeg', None, None, 'One'),
                    (open(os.path.join(thisdir, 'two.png'),
                          'rb'), 'image/png', '2cm', '2.2cm', 'Two')],
         'oeuf':
         open(os.path.join(thisdir, 'egg.jpg'), 'rb'),
         'footer':
         u'We sell stuff'
     }
コード例 #5
0
def generate(template_path, data_file, out_file=None, year=None):
    """
    Generate a week calendar for an entire year in odt format.

    Args:
        template_path (str): The file path of the template to render.
        data_file (str): The path of the configuration to load.
        out_file (io.IOBase): A file-like object to write the calendar
            to.
        year (int): The year to render the calendar for. A year
            specified in the data_file is used as a fallback value.

    Raises:
        .BadConfigError: If the given configuration file is missing
            configurations.

    """
    with open(data_file) as f:
        calendar_data = yaml.load(f, yaml.Loader)
    try:
        year = year or calendar_data['year']
        birthdays = calendar_data['birthdays']
        weddings = calendar_data['weddings']
        special_dates = calendar_data['special dates']
    except KeyError:
        raise BadConfigError()
    weeks = create_weeks_for_year(year, birthdays, weddings, special_dates)
    template = Template(source=None, filepath=template_path)
    generated = template.generate(weeks=weeks)
    data = generated.render().getvalue()
    if not out_file:
        out_file = open('calendar-{:d}.odt'.format(year), 'wb')
    out_file.write(data)
コード例 #6
0
ファイル: views.py プロジェクト: emilioramirez/eff
def eff_client_report(request, client_slug):

    client = get_object_or_404(Client, slug=client_slug)
    context = __process_dates(request)
    from_date = context['from_date']
    to_date = context['to_date']

    if 'export' in request.GET:
        if request.GET['export'] == 'odt':
            if 'detailed' in request.GET:
                basic = Template(source=None, filepath=os.path.join(cur_dir, '../templates/reporte_cliente_detallado.odt'))
                report_by_project = dict(map(lambda x:x[0], client.report(from_date, to_date, True)))
                report_data = format_report_data(report_by_project, client, from_date, to_date, True)
                report_data['clientname'] = client.name
                basic_generated = basic.generate(o=report_data).render()
                resp = HttpResponse(basic_generated.getvalue(), mimetype='application/vnd.oasis.opendocument.text')
                cd = 'filename=billing-%s-%s-logs.odt' % (from_date.year, from_date.strftime("%m"), )
                resp['Content-Disposition'] = cd
                return resp
            else:
                basic = Template(source=None, filepath=os.path.join(cur_dir, '../templates/reporte_cliente.odt'))
                report_by_project = dict(map(lambda x:x[0], client.report(from_date, to_date, with_rates=True)))
                report_data = format_report_data(report_by_project, client, from_date, to_date)
                basic_generated = basic.generate(o=report_data).render()
                resp = HttpResponse(basic_generated.getvalue(), mimetype='application/vnd.oasis.opendocument.text')
                cd = 'filename=billing-%s-%s.odt' % (from_date.year, from_date.strftime("%m"), )
                resp['Content-Disposition'] = cd
                return resp
        elif request.GET['export'] == 'csv':
            response = HttpResponse(mimetype='text/csv')
            if 'detailed' in request.GET:
                cd = 'attachment; filename=billing_%s_%s_%s_logs.csv' % (client_slug, from_date, to_date, )
                response['Content-Disposition'] = cd
                report_by_project = dict(map(lambda x:x[0], client.report(from_date, to_date, True)))
                report_data = format_report_data(report_by_project, client, from_date, to_date, True)
                t = loader.get_template('csv/reporte_cliente_detallado.txt')
                c = Context({'data': report_data['projects_users'],})
            else:
                cd = 'attachment; filename=billing_%s_%s_%s.csv' % (client_slug, from_date, to_date, )
                response['Content-Disposition'] = cd
                report_by_project = dict(map(lambda x:x[0], client.report(from_date, to_date)))
                report_data = format_report_data(report_by_project, client, from_date, to_date)
                t = loader.get_template('csv/reporte_cliente.txt')
                c = Context({'data': report_data['projects_users'],})

            response.write(t.render(c))
            return response

    context['report_by_project'] = client.report(from_date, to_date, True)
    context['clientname'] = client.name

    if MONTHLY_FLAG in request.GET:
        context[MONTHLY_FLAG] = request.GET[MONTHLY_FLAG]

    context['navs'] = [('prev', 'previo', '«'), ('next', 'siguiente', '»')]

    return render_to_response('reporte_cliente.html', context)
コード例 #7
0
def generate_odf(filename, template_path, data, tmp_path, uuid):
    uniq_tmp = tmp_path + '/' + uuid

    if not os.path.exists(tmp_path):
        os.makedirs(tmp_path)
    if not os.path.exists(uniq_tmp):
        os.makedirs(uniq_tmp)
    basic = Template(source='', filepath=template_path)
    with open(uniq_tmp + '/' + filename, 'wb') as file:
        file.write(basic.generate(o=data).render().getvalue())
コード例 #8
0
ファイル: hadronox.py プロジェクト: altaris/hadronox
 def make(self, metadatas):
     raw = []
     with open(self["input"]) as csvfile:
         raw = sorted(list(csv.DictReader(csvfile)),
                      key=lambda x: self._sortKey(x))
     data = self._makeGroups(raw, self.get("groups", []))
     with open(self["output"], "wb") as outfile:
         template = Template(source='', filepath=self["template"])
         doc = template.generate(data=data, meta=metadatas)
         outfile.write(doc.render().getvalue())
コード例 #9
0
 def render_template(self):
     """Returns document like BytesIO object and new filename"""
     template_name, template_ext = self.template.filename.split('.', 1)
     if self.ext == template_ext and self.ext in ALLOWED_EXTENSIONS:
         basic = Template(source=self.template, filepath='')
         basic_generated = basic.generate(o=self.data).render()
         document = BytesIO(basic_generated.getvalue())
         filename = self.new_filename(template_name)
         return document, filename
     else:
         raise DocumentWorkerException('Incorrect extension!')
コード例 #10
0
ファイル: views.py プロジェクト: pablo1n7/proyectoBs
def listarProductoPDF(request):
    """docstring for listarProducto"""
    listasProducto = []
    productos = []
    
    productoSinStock = []

    depositos = Deposito.objects.all()
    filtro = request.GET.get("filtro")
    filtroDeposito = request.GET.get("deposito")
    if filtroDeposito != "":
        filtroDeposito = Deposito.objects.get(pk=filtroDeposito)
    else:
        filtroDeposito = "ALL"
    if filtro == "":
        if filtroDeposito == "ALL":
            stocks = Stock.objects.all()
            productoSinStock = Producto.objects.filter(cantidad = 0)
        else:
            stocks = Stock.objects.filter(deposito=filtroDeposito)
    else:
        listasProducto = list(Producto.objects.filter(Q(nombre__contains=filtro) | Q(descripcion__contains=filtro)))
        if filtroDeposito == "ALL":
            stocks = []
            for producto in listasProducto:
                listaStock=Stock.objects.filter(producto=producto)
                stocks = stocks+list(listaStock)
            productoSinStock = filter(lambda x: x.cantidad == 0 , listasProducto)
        else:
            stocks = []
            for producto in listasProducto:
                try:
                    stocks.append(Stock.objects.get(producto=producto, deposito=filtroDeposito))
                except ObjectDoesNotExist:
                    pass
            #stocks = Stock.objects.filter(Q(producto__icontains=listasProducto) , Q(deposito=filtroDeposito))
    
    stocks = list(stocks)
    stocks.sort()
    stocks = filter(lambda x: x.disponibles != 0 , stocks)

    repos = relatorio.ReportRepository()

    basic = Template(source="",filepath=TEMPLATE_DIRS+'/gstProducto/listarProductoBase.odt')

    file(TEMPLATE_DIRS+'/gstProducto/listarProducto.odt', 'wb').write(basic.generate(stocks=stocks, productos=productoSinStock).render().getvalue())
    #    p = subprocess.Popen('unoconv -f pdf '+TEMPLATE_DIRS+'/gstDeposito/listarDeposito.odt', shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    os.system('unoconv -f pdf '+TEMPLATE_DIRS+'/gstProducto/listarProducto.odt')
    with open(TEMPLATE_DIRS+'/gstProducto/listarProducto.pdf', 'r') as pdf:
        response = HttpResponse(pdf.read(), mimetype='application/pdf')
        response['Content-Disposition'] = 'inline;filename=some_file.pdf'
        pdf.close()
    return response
コード例 #11
0
ファイル: models.py プロジェクト: pombredanne/autoreport
 def render_report(self, form_data, format='odt'):
     locals_ = locals()
     locals_.update(dict([(x.__name__, x) for x in get_models()]))
     locals_.update({'form': form_data})
     report = Template(source=None, filepath=self.template.path)
     if hasattr(settings, 'AUTOREPORT_CONTEXT_PROCESSOR'):
         path = settings.AUTOREPORT_CONTEXT_PROCESSOR
         i = path.rfind('.')
         context_processor = getattr(import_module(path[:i]), path[i+1:])
     else:
         context_processor = lambda d: d
     response = http.HttpResponse(report.generate(**context_processor(eval(self.params, globals(), locals_))).render().getvalue(), mimetype=self._formats[format])
     response['Content-Disposition'] = 'attachment; filename=%s.%s' % (self.short_name(), format)
     return response
コード例 #12
0
ファイル: __init__.py プロジェクト: oldrev/report_relatorio
def create_single_odt(self, cr, uid, ids, data, report_xml, context=None):
    if not context:
        context={}
    context = context.copy()
    report_type = report_xml.report_type
    context['parents'] = sxw_parents
    sxw_path = os.path.join(tools.config['addons_path'], report_xml.report_sxw)
    odt_template = Template(source=None, filepath=sxw_path)
    objs = self.getObjects(cr, uid, ids, context)
    odt_parser = self.parser(cr, uid, self.name2, context)
    odt_parser.set_context(objs, data, ids, report_xml.report_type)
    odt_generated = odt_template.generate(**odt_parser.localcontext).render()
    final_op = odt_generated.getvalue() 
    return (final_op, "odt")
コード例 #13
0
ファイル: views.py プロジェクト: pablo1n7/proyectoBs
def listadoProductoEstadistico(request):

    detallesFacturas = DetalleFactura.objects.all()
    
    af = AdaptadorFactura()
    af.setDetalles(detallesFacturas)

    repos = relatorio.ReportRepository()
    basic = Template(source="", filepath=TEMPLATE_DIRS+'/estadisticaBase.ods')
    file(TEMPLATE_DIRS+'/estadistica.ods', 'wb').write(basic.generate(detalles=af.detalles).render().getvalue())        
    
    with open(TEMPLATE_DIRS+'/estadistica.ods', 'r') as odt:
        response = HttpResponse(odt.read(), mimetype='application/vnd.oasis.opendocument.text')
        response['Content-Disposition'] = 'inline;filename=Estadistica.ods'
        odt.close()
    return response
コード例 #14
0
ファイル: document.py プロジェクト: nicolashainaux/memini
def generate(table_name,
             nb=DEFAULT_Q_NB,
             scheme=None,
             oldest_prevail=False,
             output=None,
             force=False,
             tpl=None,
             edit_after=True,
             use_previous=False):
    """
    Generate a new document using n data from the table and the matching
    template.
    """
    if use_previous:
        sw_data = sweepstakes.load_sweepstake(int(table_name))
        table_name, rows = sw_data[0], sw_data[1:]
        table_name = table_name[0]
        if len(rows[0]) != len(database.get_cols(table_name)):
            raise ColumnsDoNotMatchError(
                len(database.get_cols(table_name)), len(rows[0]), table_name,
                database.get_cols(table_name),
                sweepstakes._get_sweepstake_name(use_previous))
    if tpl is None:
        tpl_name = table_name
    else:
        if not os.path.isfile(template.path(tpl)):
            raise NotFoundError(f'Cannot find template file: {tpl}')
        tpl_name = tpl
    if output is None:
        output = f'{table_name}.{TEMPLATE_EXT}'
    if os.path.exists(output) and not force:
        overwrite = terminal.ask_yes_no(f'Output file {output} already '
                                        f'exists, overwrite it?')
        if not overwrite:
            raise CommandCancelledError('generate')
    if not use_previous:
        rows = database.draw_rows(table_name,
                                  nb,
                                  oldest_prevail=oldest_prevail)
    data = _process_data(rows, scheme=scheme)
    template.sanitize(template.path(tpl_name))
    basic = Template(source='', filepath=template.path(tpl_name))
    basic_generated = basic.generate(o=data).render()
    with open(output, 'wb') as f:
        f.write(basic_generated.getvalue())
    if edit_after:
        edit(output)
コード例 #15
0
ファイル: views.py プロジェクト: emilioramirez/eff
def eff_fixed_price_client_reports(request):
    if not request.is_ajax():
        context = __get_context(request)
        context['title'] = "Reporte de Clientes - Projectos con costo fijo"
        context['clients'] = Client.objects.filter(project__billing_type='FIXED').distinct()

        if request.method == 'POST':
            client = Client.objects.get(id=request.POST['client'])
            project = Project.objects.get(id=request.POST['project'])

            state_and_country = client.state or ''
            if state_and_country.strip(): state_and_country += ' - '
            state_and_country += client.country
            client_data = {'name' : client.name or '',
                           'address' : client.address or '',
                           'city' : client.city or '',
                           'state_and_country' : state_and_country,
                           'currency' : client.currency.ccy_symbol or client.currency.ccy_code,
                           }
            reverse_billing = FixedPriceClientReverseBilling(
                project_data = {'name' : project.name, 'price' : "%.2f" % project.fixed_price},
                client_data = client_data,
                today = datetime.now().strftime("%A, %d %B %Y")
                )

            basic = Template(source=None, filepath=os.path.join(cur_dir, '../templates/reporte_cliente_precio_fijo.odt'))
            basic_generated = basic.generate(o=reverse_billing).render()
            resp = HttpResponse(basic_generated.getvalue(), mimetype='application/vnd.oasis.opendocument.text')
            cd = 'filename=billing-%s.odt' % project.external_id
            resp['Content-Disposition'] = cd
            return resp

        return render_to_response('admin_reportes_cliente_costo_fijo.html', context)
    else:
        client_id = request.POST['client']
        client = get_object_or_404(Client, id=client_id)
        projects = Project.objects.filter(client=client, billing_type='FIXED')
        ret = '<option selected="selected" value="">----</option>'
        ret += ''.join(['<option value="%s">%s</option>' % (p.id, p.name) for p in projects])
        return HttpResponse(ret, mimetype="text/html")
コード例 #16
0
ファイル: views.py プロジェクト: pablo1n7/proyectoBs
def generarFactura(request):
    
    try:
        nroNota = request.GET.get("nroNota")
        notaVenta = NotaVenta.objects.get(pk = nroNota)
        af = AdaptadorFactura()
        af.inicializar(notaVenta)

        print "path = " + TEMPLATE_DIRS+'/facturaBase.odt'
        af.inicializar(notaVenta)
        repos = relatorio.ReportRepository()
        basic = Template(source="", filepath=TEMPLATE_DIRS+'/facturaBase.odt')

        file(TEMPLATE_DIRS+'/factura.odt', 'wb').write(basic.generate(factura=af, detalles=af.detalles).render().getvalue())        
        os.system('unoconv -f pdf '+TEMPLATE_DIRS+'/factura.odt')
        with open(TEMPLATE_DIRS+'/factura.pdf', 'r') as pdf:
            response = HttpResponse(pdf.read(), mimetype='application/pdf')
            response['Content-Disposition'] = 'inline;filename=some_file.pdf'
            pdf.close()
            return response

    except ObjectDoesNotExist:
        raise ErrorCobro()
コード例 #17
0
ファイル: views.py プロジェクト: pablo1n7/proyectoBs
def listarDepositoPDF(request):
    listasDepos=[] 
    filtro = request.GET.get("filtro")

    if filtro == "":
        listasDepos = Deposito.objects.all()    
    else:
        listasDeposDir = list(Deposito.objects.filter(direccion__contains=filtro))
        listasDeposTel = list(Deposito.objects.filter(telefono__contains=filtro))
        listasDepos = set(listasDeposDir + listasDeposTel)
    depositos= listasDepos

    repos = relatorio.ReportRepository()
    inv = depositos
    basic = Template(source="", filepath=TEMPLATE_DIRS+'/gstDeposito/listarDepositoBase.odt')

    file(TEMPLATE_DIRS+'/gstDeposito/listarDeposito.odt', 'wb').write(basic.generate(o=inv).render().getvalue())
    #    p = subprocess.Popen('unoconv -f pdf '+TEMPLATE_DIRS+'/gstDeposito/listarDeposito.odt', shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    os.system('unoconv -f pdf '+TEMPLATE_DIRS+'/gstDeposito/listarDeposito.odt')
    with open(TEMPLATE_DIRS+'/gstDeposito/listarDeposito.pdf', 'r') as pdf:
        response = HttpResponse(pdf.read(), mimetype='application/pdf')
        response['Content-Disposition'] = 'inline;filename=some_file.pdf'
        pdf.close()
        return response
コード例 #18
0
ファイル: test_odt.py プロジェクト: CARocha/python-relatorio
 def setUp(self):
     thisdir = os.path.dirname(__file__)
     filepath = os.path.join(thisdir, 'test.odt')
     self.oot = Template(open(filepath, mode='rb'))
     self.data = {'first_name': u'Trente',
                  'last_name': u'Møller',
                  'ville': u'Liège',
                  'friends': [{'first_name': u'Camille',
                               'last_name': u'Salauhpe'},
                              {'first_name': u'Mathias',
                               'last_name': u'Lechat'}],
                  'hobbies': [u'Music', u'Dancing', u'DJing'],
                  'animals': [u'Felix da housecat', u'Dog eat Dog'],
                  'images': [(open(os.path.join(thisdir, 'one.jpg'), 'rb'),
                              'image/jpeg'),
                             (open(os.path.join(thisdir, 'two.png'), 'rb'),
                              'image/png')],
                  'oeuf': open(os.path.join(thisdir, 'egg.jpg'), 'rb'),
                  'footer': u'We sell stuff'}
コード例 #19
0
# -*- coding: utf-8 -*-
"""
Created on Mon May 12 15:24:07 2014

@author: peterb
"""

#!python
from relatorio.templates.opendocument import Template
from ipc_data import letter_data
basic = Template(source="IPC_DATA", filepath='IPC_ger_Letter.odt')
basic_generated = basic.generate(o=letter_data).render()
file('IPC_FULL.odt', 'wb').write(basic_generated.getvalue())
コード例 #20
0
    def download_document(invoice, model, type_document_partner_it, inv_id, filename=None, **kw):
        cr, uid, context = request.cr, request.uid, request.context
        invoice = request.registry[model]
        invoice = invoice.browse(cr, uid, int(inv_id), context)

        picking_name = ""

        if invoice.picking_ids:
            pickings = [i.nro_documento for i in invoice.picking_ids]
            if i.nro_documento:
                picking_name = ", ".join(pickings)

        order_name = ""
        if invoice.sale_ids:
            orders = [i.name for i in invoice.sale_ids]
            if i.name:
                order_name = ", ".join(orders)
                
        lines = []

        for item in invoice.invoice_line:
            description = ""
            codigo = ""
            if item.name:
                description = str(item.name).upper()
            if item.product_id.default_code:
                codigo =  item.product_id.default_code
            lines.append({
                "codigo": codigo,
                "product": item.product_id.name,
                "description": description,
                "qty": int(item.quantity),
                "price_unit": item.price_unit,
                "price_subtotal":  '{:,.2f}'.format(item.price_subtotal),
                "price_subtotal_igv": '{:,.2f}'.format(item.invoice_line_tax_id.amount * item.price_subtotal + item.price_subtotal)
            })

        if(invoice.tax_line != False):
            igv = 18
        else:
            igv = 0

        #Validacion de datos
        name =""
        street = ""
        nro_documento = ""
        date_invoice = ""
        day = ""
        month = ""
        month_number = ""
        year = ""
        y = ""
        payment_term = ""
        user = ""
        doc_modificado = ""
        nro_doc_modificado = ""
        fecha_doc_modificado = ""
        informacion_adicional = ""
        tipo_nd = ""
        number_invoice = ""

        if invoice.number:
            number_invoice = invoice.number
        if invoice.partner_id.name:
            name = invoice.partner_id.name
        if invoice.partner_id.street:
            street = str(invoice.partner_id.street)[:90].upper()
        if invoice.partner_id.nro_documento:
            nro_documento = invoice.partner_id.nro_documento
        if invoice.date_invoice:
            date_invoice=invoice.date_invoice
            day = time.strftime('%d', time.strptime(invoice.date_invoice,'%Y-%m-%d'))
            month = str(time.strftime('%B', time.strptime(invoice.date_invoice,'%Y-%m-%d'))).upper()
            month_number = str(time.strftime('%m', time.strptime(invoice.date_invoice,'%Y-%m-%d'))).upper()
            year = time.strftime('%y', time.strptime(invoice.date_invoice,'%Y-%m-%d'))
            y = time.strftime('%y', time.strptime(invoice.date_invoice,'%Y-%m-%d'))[1]
        if invoice.payment_term:
            payment_term = str(invoice.payment_term.name).upper()
        if invoice.user_id.name:
            user = str(invoice.user_id.name).upper()

        datas = {
            "number": number_invoice,
            "name": name,
            "street": street,
            "nro_documento": nro_documento,
            "date_invoice": date_invoice,
            "guia": "",
            "day": day,
            "month": month,
            "month_number": month_number,
            "year": year,
            "y": y,
            "picking_name": picking_name,
            "order_name": order_name,
            "lines": lines,
            "payment_term": payment_term,
            "a_untaxed": 'S/{:,.2f}'.format(invoice.amount_untaxed),
            "igv": igv,
            "a_tax": 'S/{:,.2f}'.format(invoice.amount_tax),
            "a_total": 'S/{:,.2f}'.format(invoice.amount_total),
            "user": user,
            "number2letter": number_to_letter(str('{0:.2f}'.format(invoice.amount_total))) + " SOLES",
            ##################################
            "prueba": "",
            "null": "",
        }
        if "invoice" == type_document_partner_it:
            invoice_path = openerp.modules.get_module_resource('fxo_mv_print_documents','templates', "invoice.odt")
        if "ticket" == type_document_partner_it:
            invoice_path = openerp.modules.get_module_resource('fxo_mv_print_documents','templates', "ticket.odt")
        
        if not invoice_path:
            error = {
                'code': 200,  
                'message': "Odoo Server Error",
                'data': "Not found file template in module!."
            }
            return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))

        try:
            basic = Template(source="", filepath=invoice_path)
        except:
            error = {
                'code': 200,  
                'message': "Odoo Server Error",
                'data': "You do not have permission to read\nfile template!."
            }
            return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))

        basic_generated = basic.generate(o=datas).render()
        filecontent = basic_generated.getvalue()

        if not filecontent:
            return request.not_found()
        else:
            if not filename:
                filename = '%s_%s' % (model.replace('.', '_'), wid)
            return request.make_response(filecontent,
                                         [('Content-Type', 'application/octet-stream'),
                                          ('Content-Disposition', content_disposition(filename))])
コード例 #21
0
def form():
    if request.method == 'POST':
        classData = request.get_json(force=True)

        class Schedules(dict):

            testingCounter = 0
            contentCounter = -1
            yearCounter = -1
            monthIntervals = [1]
            monthNames = []
            years = []

            def __init__(self, classData):
                self.classData = classData

            def monthNumberToName(monthNumber):
                if monthNumber == '01':
                    return 'January'
                elif monthNumber == '02':
                    return 'February'
                elif monthNumber == '03':
                    return 'March'
                elif monthNumber == '04':
                    return 'April'
                elif monthNumber == '05':
                    return 'May'
                elif monthNumber == '06':
                    return 'June'
                elif monthNumber == '07':
                    return 'July'
                elif monthNumber == '08':
                    return 'August'
                elif monthNumber == '09':
                    return 'September'
                elif monthNumber == '10':
                    return 'October'
                elif monthNumber == '11':
                    return 'November'
                elif monthNumber == '12':
                    return 'December'

            monthNames.append(monthNumberToName(classData[0]['start'][5:7]))
            years.append(classData[0]['start'][0:4])

            monthIntervalsCounter = 1
            for index, item in enumerate(classData):
                monthIntervalsCounter += 1
                try:
                    if item['start'][5:7] != classData[index +
                                                       1]['start'][5:7]:
                        monthIntervals.append(monthIntervalsCounter)
                        monthNames.append(
                            monthNumberToName(classData[index +
                                                        1]['start'][5:7]))
                        # if item['start'][0:4] != classData[index + 1]['start'][0:4]:
                        years.append(classData[index + 1]['start'][0:4])
                except:
                    continue

            @property
            def testing(self):
                Schedules.testingCounter += 1
                for i in Schedules.monthIntervals:
                    if Schedules.testingCounter == i:
                        return True
                return False

            @property
            def content(self):
                Schedules.contentCounter += 1
                return Schedules.monthNames[Schedules.contentCounter]

            @property
            def year(self):
                Schedules.yearCounter += 1
                return Schedules.years[Schedules.yearCounter]

        sched = Schedules(classData)

        basic = Template(source='', filepath='template-schedules.odt')
        open('app/static/generated-iftest.odt',
             'wb').write(basic.generate(o=sched).render().getvalue())

        return str(classData)
    return render_template('form.html')


#                                 [{'start': '2018-12-12',
#                                 'end': '2018-12-13',
#                                 'length': '6 weeks',
#                                 'course': 'Beg. Obedience',
#                                 'price': '$140',
#                                 'city': 'Glendora',
#                                 'preregister': 'Pre-Registration Required! Call (999) 222-3333',
#                                 'time': '6PM - 7PM',
#                                 'address': '555 A St, 98821',
#                                 'note': 'No dogs at first meeting!'},
#                                 {'start': '2019-01-16',
#                                 'end': '2019-02-13',
#                                 'length': '4 weeks',
#                                 'course': 'Beg. Obedience',
#                                 'price': '$180',
#                                 'city': 'Upland',
#                                 'preregister': 'Pre-Registration Required! Call (999) 555-3333',
#                                 'time': '6PM - 7PM',
#                                 'address': '555 A St, 98821',
#                                 'note': 'No dogs at first meeting!'},
#                                 {'start': '2019-01-16',
#                                 'end': '2018-12-13',
#                                 'length': '6 weeks',
#                                 'course': 'Beg. Obedience',
#                                 'price': '$140',
#                                 'city': 'Glendora',
#                                 'preregister': 'Pre-Registration Required! Call (999) 222-3333',
#                                 'time': '6PM - 7PM',
#                                 'address': '555 A St, 98821',
#                                 'note': 'No dogs at first meeting!'},
#                                 {'start': '2019-01-18',
#                                 'end': '2018-12-13',
#                                 'length': '6 weeks',
#                                 'course': 'Beg. Obedience',
#                                 'price': '$140',
#                                 'city': 'Glendora',
#                                 'preregister': 'Pre-Registration Required! Call (999) 222-3333',
#                                 'time': '6PM - 7PM',
#                                 'address': '555 A St, 98821',
#                                 'note': 'No dogs at first meeting!'},
#                                 {'start': '2019-02-16',
#                                 'end': '2018-12-13',
#                                 'length': '6 weeks',
#                                 'course': 'Beg. Obedience',
#                                 'price': '$140',
#                                 'city': 'Glendora',
#                                 'preregister': 'Pre-Registration Required! Call (999) 222-3333',
#                                 'time': '6PM - 7PM',
#                                 'address': '555 A St, 98821',
#                                 'note': 'No dogs at first meeting!'}]
コード例 #22
0
    def product_movement(self, *args, **kwargs):

        self.parent._print("*" * 10, " product_movement ", "*" * 10)
        self.parent._print(args)
        self.parent._print(kwargs)
        self.parent._print("*" * 10, " product_movement ", "*" * 10)

        doc_type = 'products_movements'

        date1 = kwargs.get('date1')
        date2 = kwargs.get('date2')
        arr_fg = kwargs.get('arr_fg')
        dep_fg = kwargs.get('dep_fg')
        item_id = kwargs.get('item_id')

        answer = {
            "params": args,
            "kwargs": kwargs,
        }

        d_data = []
        a_data = []

        sql_move = f"""select
jmh.n_number as doc_number,
jmh.n_dt_invoice as doc_date,
'' as suppl,
rp.n_name as point,
0,
(jmb.n_product->'n_amount')::text::numeric as amount,
(select c_name from ref_products where c_id = {item_id})
from journals_movements_bodies jmb
join journals_movements_headers jmh on jmb.n_doc_id = jmh.n_id
join ref_partners rp ON rp.n_id = jmh.n_recipient
where (jmb.n_product->'n_balance_id')::text in (select jpb.n_id::text
	from journals_products_balance jpb
	where jpb.n_product_id = {item_id})
and jmb.n_deleted=false
and jmh.n_dt_invoice >= '{date1}'::date
and jmh.n_dt_invoice <= '{date2}'::date
"""

        sql_arr = f"""select
jah.n_number as doc_number,
jah.n_dt_invoice as doc_date,
rp.n_name as suppl,
'' as point,
(jab.n_product->'n_amount')::text::numeric as amount,
0,
(select c_name from ref_products where c_id = {item_id})
from journals_arrivals_bodies jab
join journals_arrivals_headers jah on jab.n_doc_id = jah.n_id
join ref_partners rp ON rp.n_id = jah.n_supplier
where (jab.n_product->'n_product')::text = '{item_id}'
and jab.n_deleted=false
and jah.n_dt_invoice >= '{date1}'::date
and jah.n_dt_invoice <= '{date2}'::date
"""

        sqls = []

        if not arr_fg and not dep_fg:
            return answer

        if arr_fg:
            sqls.append(sql_arr)
        if dep_fg:
            sqls.append(sql_move)
        sqls = '\nunion all\n'.join(sqls)
        sql = f"""select * from (
{sqls}
) as aa
order by doc_date asc, doc_number
        """
        # print(sql)
        a_data = self.parent._request(sql)
        if a_data:
            data = {
                'lines': [],
                'tovar':
                a_data[0][6],
                'date1':
                datetime.datetime.strptime(
                    date1, '%Y-%m-%d %H:%M:%S').strftime('%d-%m-%y'),
                'date2':
                datetime.datetime.strptime(
                    date2, '%Y-%m-%d %H:%M:%S').strftime('%d-%m-%y'),
                'arr_total':
                0,
                'dep_total':
                0,
            }
            for i, row in enumerate(a_data, 1):

                d = datetime.datetime.strptime(row[1], '%Y-%m-%d')
                r = {
                    'item': {
                        'doc': row[0],
                        'date': d.strftime('%d-%m-%y'),
                        'suppl': row[2],
                        'recip': row[3],
                        'arriv': row[4] or '',
                        'depart': row[5] or ''
                    }
                }
                data['lines'].append(r)
            ta = sum([
                int(i['item']['arriv']) if i['item']['arriv'] != '' else 0
                for i in data['lines']
            ])
            td = sum([
                int(i['item']['depart']) if i['item']['depart'] != '' else 0
                for i in data['lines']
            ])
            data['arr_total'] = ta
            data['dep_total'] = td

            inv = Prod_movements(**data)
            zip_path = os.path.dirname(
                os.path.dirname(os.path.abspath(__file__)))
            with zipfile.ZipFile(zip_path, mode='r') as _zf:
                _zf.extract(f'doc_tmpl/{inv.doc_template}', path=self.temp_dir)
            t_path = os.path.join(self.temp_dir, 'doc_tmpl', inv.doc_template)

            basic = Template(source='', filepath=t_path)
            basic_generated = basic.generate(o=inv).render()
            fn = os.path.join(self.temp_dir, self.gen_file_name(doc_type))
            file_data = basic_generated.getvalue()
            with open(fn, 'wb') as _f:
                _f.write(file_data)

            md5 = self.parent.filesave(fn)

            l_file_name = os.path.basename(fn).replace('.ods', '')

            link_name = f"""https://sklad71.org/filehash/{l_file_name}.pdf?{md5}"""
            print(link_name)
            bi = base64.b64encode(file_data)
            bi = bi.decode()
            # print(bi)
            # print(len(bi))
            answer = {
                "params": args,
                "kwargs": kwargs,
                "timing": {
                    "sql": 0,
                    "process": 0
                },
                "data": {
                    "link": link_name,
                    "file_name": os.path.basename(fn),
                    "binary": bi
                }
            }

        return answer
コード例 #23
0
ファイル: test_odt.py プロジェクト: kakamble-aiims/work
class TestOOTemplating(unittest.TestCase):
    def setUp(self):
        thisdir = os.path.dirname(__file__)
        filepath = os.path.join(thisdir, 'test.odt')
        self._source = open(filepath, mode='rb')
        self.oot = Template(self._source)
        self.data = {
            'first_name':
            u'Trente',
            'last_name':
            u'Møller',
            'ville':
            u'Liège',
            'friends': [{
                'first_name': u'Camille',
                'last_name': u'Salauhpe'
            }, {
                'first_name': u'Mathias',
                'last_name': u'Lechat'
            }],
            'hobbies': [u'Music', u'Dancing', u'DJing'],
            'animals': [u'Felix da housecat', u'Dog eat Dog'],
            'images': [(open(os.path.join(thisdir, 'one.jpg'),
                             'rb'), 'image/jpeg', None, None, 'One'),
                       (open(os.path.join(thisdir, 'two.png'),
                             'rb'), 'image/png', '2cm', '2.2cm', 'Two')],
            'oeuf':
            open(os.path.join(thisdir, 'egg.jpg'), 'rb'),
            'footer':
            u'We sell stuff'
        }

    def tearDown(self):
        self._source.close()
        for image in self.data['images']:
            image[0].close()
        self.data['oeuf'].close()

    def test_init(self):
        "Testing the correct handling of the styles.xml and content.xml files"
        self.assertTrue(isinstance(self.oot.stream, list))
        self.assertEqual(self.oot.stream[0],
                         (PI, ('relatorio', 'content.xml'), None))
        self.assertTrue((PI, ('relatorio', 'content.xml'),
                         None) in self.oot.stream)

    def test_directives(self):
        "Testing the directives interpolation"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://foo">foo</text:a>
                 </xml>'''
        interpolated = self.oot.insert_directives(xml)
        root_interpolated = lxml.etree.parse(interpolated).getroot()
        child = root_interpolated[0]
        self.assertEqual(child.get('{http://genshi.edgewall.org/}replace'),
                         '__relatorio_escape_invalid_chars(foo)')

    def test_column_looping(self):
        xml = b'''
<table:table
    xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    table:name="Tableau1"
    table:style-name="Tableau1">
    <table:table-column table:style-name="Tableau1.A"
                        table:number-columns-repeated="2"/>
    <table:table-column table:style-name="Tableau1.C"/>
    <table:table-column table:style-name="Tableau1.A"/>
    <table:table-column table:style-name="Tableau1.E"/>
    <table:table-header-rows>
        <table:table-row table:style-name="Tableau1.1">
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">Brol</text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">
                    <text:a xlink:type="simple"
                            xlink:href="relatorio://for each=&quot;title in titles&quot;">for each=&quot;title in titles&quot;</text:a>
                </text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">${title}</text:p>
                <text:p text:style-name="Table_20_Heading"/>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">
                    <text:a xlink:type="simple"
                            xlink:href="relatorio:///for">/for</text:a>
                </text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.E1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">Truc</text:p>
            </table:table-cell>
        </table:table-row>
    </table:table-header-rows>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A2"
                          table:number-columns-spanned="5"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio://for%20each=%22items%20in%20lst%22">for each=&quot;items in lst&quot;</text:a>
            </text:p>
        </table:table-cell>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
    </table:table-row>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">Brol</text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio://for%20each=%22item%20in%20items%22">for each=&quot;item in items&quot;</text:a>
            </text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">${item}</text:p>
            <text:p text:style-name="Table_20_Contents"/>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio:///for">/for</text:a>
            </text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A2"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">Truc</text:p>
        </table:table-cell>
    </table:table-row>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A2"
                          table:number-columns-spanned="5"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio:///for">/for</text:a>
            </text:p>
        </table:table-cell>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
    </table:table-row>
</table:table>'''
        interpolated = self.oot.insert_directives(xml)
        root = lxml.etree.parse(interpolated).getroot()
        child2 = root[1]
        self.assertEqual(child2.tag, "{%s}repeat" % RELATORIO_URI)
        self.assertEqual(child2.get("closing"), "3")
        self.assertEqual(child2.get("opening"), "1")
        self.assertEqual(len(child2), 1)
        child4 = root[3]
        self.assertEqual(child4.tag, "{%s}table-header-rows" % OO_TABLE_NS)
        row1 = child4[0]
        self.assertTrue(
            row1.get("{%s}attrs" %
                     GENSHI_URI).startswith('__relatorio_reset_col_count'))
        self.assertEqual(len(row1), 4)
        loop = row1[1]
        self.assertEqual(loop.tag, "{%s}for" % GENSHI_URI)
        cell = loop[0]
        self.assertTrue(
            cell.get("{%s}attrs" %
                     GENSHI_URI).startswith('__relatorio_inc_col_count'))
        last_row_node = row1[3]
        self.assertEqual(last_row_node.tag, "{%s}replace" % GENSHI_URI)
        self.assertTrue(
            last_row_node.get("value").startswith(
                '__relatorio_store_col_count'))

    @unittest.skipIf(not getattr(unittest.TestCase, 'assertWarnsRegex', None),
                     "assertWarns not supported")
    def test_statement_no_text_warning(self):
        "Test warning for missing statement text"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://*****:*****@unittest.skipIf(not getattr(unittest.TestCase, 'assertWarnsRegex', None),
                     "assertWarns not supported")
    def test_statement_missmatch_text_warning(self):
        "Test warning for missing statement text"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://*****:*****@unittest.skipIf(not getattr(unittest.TestCase, 'assertWarnsRegex', None),
                     "assertWarns not supported")
    def test_statement_text_warning_closing(self):
        "Test warning for statement text in closing"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://with foo='test'">with foo='test'</text:a>
                    <text:a xlink:href="relatorio:///with"></text:a>
                  </xml>'''

        with self.assertWarnsRegex(
                UserWarning,
                r".* corresponding to opening tag 'with foo='test'"):
            self.oot.insert_directives(xml)

    def test_text_outside_p(self):
        "Testing that the tail text of a directive node is handled properly"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://if%20test=%22True%22">if test=&quot;True&quot;</text:a>
                    xxx
                    <text:p text:style-name="other">yyy</text:p>
                    zzz
                    <text:a xlink:href="relatorio:///if">/if</text:a>
                    aaa
                 </xml>'''
        interpolated = self.oot.insert_directives(xml)
        root_interpolated = lxml.etree.parse(interpolated).getroot()
        child = root_interpolated[0]
        self.assertEqual(child.tag, '{http://genshi.edgewall.org/}if')
        self.assertEqual(child.text.strip(), 'xxx')
        self.assertEqual(child.tail.strip(), 'aaa')

    def test_styles(self):
        "Testing that styles get rendered"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        self.assertTrue('We sell stuff' in rendered)

        dico = self.data.copy()
        del dico['footer']
        stream = self.oot.generate(**dico)
        self.assertRaises(UndefinedError,
                          lambda: stream.events.render(encoding='utf-8'))

    def test_generate(self):
        "Testing that content get rendered"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        self.assertTrue('Bonjour,' in rendered)
        self.assertTrue('Trente' in rendered)
        self.assertTrue(u'Møller' in rendered)
        self.assertTrue('Dog eat Dog' in rendered)
        self.assertTrue('Felix da housecat' in rendered)

    def test_filters(self):
        "Testing the filters with the Translator filter"
        stream = self.oot.generate(**self.data)
        translated = stream.filter(Translator(pseudo_gettext))
        translated_xml = stream_to_string(
            translated.events.render(encoding='utf-8'))
        self.assertTrue("Hello," in translated_xml)
        self.assertTrue("I am an odt templating test" in translated_xml)
        self.assertTrue('Felix da housecat' not in translated_xml)
        self.assertTrue(u'Félix le chat de la maison' in translated_xml)
        self.assertTrue('We sell stuff' not in translated_xml)
        self.assertTrue('On vend des choses' in translated_xml)

    def test_images(self):
        "Testing the image replacement directive"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        styles_idx = rendered.find('<?relatorio styles.xml?>')
        tree = lxml.etree.parse(StringIO(rendered[25:styles_idx]))
        root = tree.getroot()
        images = root.xpath('//draw:frame', namespaces=self.oot.namespaces)
        self.assertEqual(len(images), 3)
        self.assertFalse(images[0].get('{%s}name' %
                                       self.oot.namespaces['draw']))
        self.assertEqual(
            images[1].get('{%s}name' % self.oot.namespaces['draw']), 'One')
        self.assertEqual(
            images[2].get('{%s}name' % self.oot.namespaces['draw']), 'Two')
        self.assertEqual(
            images[1].get('{%s}width' % self.oot.namespaces['svg']), '1.732cm')
        self.assertEqual(
            images[1].get('{%s}height' % self.oot.namespaces['svg']),
            '1.513cm')
        self.assertEqual(
            images[2].get('{%s}width' % self.oot.namespaces['svg']), '2cm')
        self.assertEqual(
            images[2].get('{%s}height' % self.oot.namespaces['svg']), '2.2cm')

    def test_regexp(self):
        "Testing the regexp used to find relatorio tags"
        # a valid expression
        group = GENSHI_EXPR.match('for each="foo in bar"').groups()
        self.assertEqual(group, (None, 'for', 'each', 'foo in bar'))

        # invalid expr
        group = GENSHI_EXPR.match('foreach="foo in bar"').groups()
        self.assertEqual(group, (None, None, None, None))

        # valid closing tags
        group = GENSHI_EXPR.match('/for').groups()
        self.assertEqual(group, ('/', 'for', None, None))
        group = GENSHI_EXPR.match('/for ').groups()
        self.assertEqual(group, ('/', 'for', None, None))

        # another non matching expr
        group = GENSHI_EXPR.match('formatLang("en")').groups()
        self.assertEqual(group, (None, None, None, None))

    def test_fodt2odt(self):
        "Testing converter fodt to odt"
        thisdir = os.path.dirname(__file__)
        filepath = os.path.join(thisdir, 'test.fodt')
        fod2od(filepath)

    def test_generate_fod(self):
        "Testing generate fod"
        thisdir = os.path.dirname(__file__)
        filepath = os.path.join(thisdir, 'test.fodt')
        with open(filepath, mode='rb') as source:
            oot = Template(source)
            oot.generate(**self.data)
コード例 #24
0
    def generate(self, *args, **kwargs):

        self.parent._print("*" * 10, " generate ", "*" * 10)
        self.parent._print(args)
        self.parent._print(kwargs)
        self.parent._print("*" * 10, " generate ", "*" * 10)

        doc_type = kwargs.get('doc_type')
        doc_number = kwargs.get('doc_number')
        data = kwargs.get('data')
        answer = {
            "params": args,
            "kwargs": kwargs,
        }

        if doc_type and doc_number and not data:
            #пришел документ и его номер, достаем данные из базы, делаем обработку
            if doc_type == 'shipment':
                doc_gen = Shipment
                data = self._generate_short_shipment(doc_number)
            elif doc_type == 'arrival':
                doc_gen = Arrival
                data = self._generate_short_arrival(doc_number)
            elif doc_type == 'rest':
                doc_gen = Rest
                data = self._generate_short_rest(doc_number)
            elif doc_type == 'movement':
                doc_gen = Movement
                data = self._generate_short_movement(doc_number)
            elif doc_type == 'balance':
                doc_gen = Balance
                data = self._generate_balance()

        if data:
            #есть данные
            inv = doc_gen(**data)
            zip_path = os.path.dirname(
                os.path.dirname(os.path.abspath(__file__)))
            with zipfile.ZipFile(zip_path, mode='r') as _zf:
                _zf.extract(f'doc_tmpl/{inv.doc_template}', path=self.temp_dir)
            t_path = os.path.join(self.temp_dir, 'doc_tmpl', inv.doc_template)

            basic = Template(source='', filepath=t_path)
            basic_generated = basic.generate(o=inv).render()
            fn = os.path.join(self.temp_dir, self.gen_file_name(doc_type))
            file_data = basic_generated.getvalue()
            with open(fn, 'wb') as _f:
                _f.write(file_data)

            md5 = self.parent.filesave(fn)

            l_file_name = os.path.basename(fn).replace('.ods', '')

            link_name = f"""https://sklad71.org/filehash/{l_file_name}.pdf?{md5}"""
            print(link_name)
            bi = base64.b64encode(file_data)
            bi = bi.decode()
            # print(bi)
            # print(len(bi))
            answer = {
                "params": args,
                "kwargs": kwargs,
                "timing": {
                    "sql": 0,
                    "process": 0
                },
                "data": {
                    "link": link_name,
                    "file_name": os.path.basename(fn),
                    "binary": bi
                }
            }
        return answer
コード例 #25
0
# from relatorio.templates.opendocument import Template
# from data import sched

# basic = Template(source='', filepath='schedules-template.odt')
# basic_generated = basic.generate(o=sched).render()
# file('generated-schedules.odt', 'wb').write(basic_generated.getvalue())

# basic = Template(source='', filepath='schedules-template.odt')
# file('generated-schedules.odt', 'wb').write(basic.generate(o=sched).render().getvalue())

from common import inv
from relatorio.templates.opendocument import Template
basic = Template(source='', filepath='basic.odt')
open('bonham_basic.odt', 'wb').write(basic.generate(o=inv).render().getvalue())
コード例 #26
0
from relatorio.templates.opendocument import Template
from exdata import inv

# basic = Template(source='', filepath='schedules-template.odt')
# basic_generated = basic.generate(o=sched).render()
# file('generated-schedules.odt', 'wb').write(basic_generated.getvalue())

basic = Template(source='', filepath='from-basic-nfor.odt')
open('generated-ex-nfor.odt',
     'wb').write(basic.generate(o=inv).render().getvalue())

# from common import inv
# from relatorio.templates.opendocument import Template
# basic = Template(source='', filepath='basic.odt')
# open('bonham_basic.odt', 'wb').write(basic.generate(o=inv).render().getvalue())
コード例 #27
0
ファイル: test_odt.py プロジェクト: CARocha/python-relatorio
class TestOOTemplating(unittest.TestCase):

    def setUp(self):
        thisdir = os.path.dirname(__file__)
        filepath = os.path.join(thisdir, 'test.odt')
        self.oot = Template(open(filepath, mode='rb'))
        self.data = {'first_name': u'Trente',
                     'last_name': u'Møller',
                     'ville': u'Liège',
                     'friends': [{'first_name': u'Camille',
                                  'last_name': u'Salauhpe'},
                                 {'first_name': u'Mathias',
                                  'last_name': u'Lechat'}],
                     'hobbies': [u'Music', u'Dancing', u'DJing'],
                     'animals': [u'Felix da housecat', u'Dog eat Dog'],
                     'images': [(open(os.path.join(thisdir, 'one.jpg'), 'rb'),
                                 'image/jpeg'),
                                (open(os.path.join(thisdir, 'two.png'), 'rb'),
                                 'image/png')],
                     'oeuf': open(os.path.join(thisdir, 'egg.jpg'), 'rb'),
                     'footer': u'We sell stuff'}

    def test_init(self):
        "Testing the correct handling of the styles.xml and content.xml files"
        self.assertTrue(isinstance(self.oot.stream, list))
        self.assertEqual(
            self.oot.stream[0], (PI, ('relatorio', 'content.xml'), None))
        self.assertTrue(
            (PI, ('relatorio', 'content.xml'), None) in self.oot.stream)

    def test_directives(self):
        "Testing the directives interpolation"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://foo">foo</text:a>
                 </xml>'''
        interpolated = self.oot.insert_directives(xml)
        root_interpolated = lxml.etree.parse(interpolated).getroot()
        child = root_interpolated[0]
        self.assertEqual(
            child.get('{http://genshi.edgewall.org/}replace'), 'foo')

    def test_column_looping(self):
        xml = b'''
<table:table
    xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    table:name="Tableau1"
    table:style-name="Tableau1">
    <table:table-column table:style-name="Tableau1.A"
                        table:number-columns-repeated="2"/>
    <table:table-column table:style-name="Tableau1.C"/>
    <table:table-column table:style-name="Tableau1.A"/>
    <table:table-column table:style-name="Tableau1.E"/>
    <table:table-header-rows>
        <table:table-row table:style-name="Tableau1.1">
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">Brol</text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">
                    <text:a xlink:type="simple"
                            xlink:href="relatorio://for each=&quot;title in titles&quot;">for each=&quot;title in titles&quot;</text:a>
                </text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">${title}</text:p>
                <text:p text:style-name="Table_20_Heading"/>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.A1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">
                    <text:a xlink:type="simple"
                            xlink:href="relatorio:///for">/for</text:a>
                </text:p>
            </table:table-cell>
            <table:table-cell table:style-name="Tableau1.E1"
                              office:value-type="string">
                <text:p text:style-name="Table_20_Heading">Truc</text:p>
            </table:table-cell>
        </table:table-row>
    </table:table-header-rows>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A2"
                          table:number-columns-spanned="5"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio://for%20each=%22items%20in%20lst%22">for each=&quot;items in lst&quot;</text:a>
            </text:p>
        </table:table-cell>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
    </table:table-row>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">Brol</text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio://for%20each=%22item%20in%20items%22">for each=&quot;item in items&quot;</text:a>
            </text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">${item}</text:p>
            <text:p text:style-name="Table_20_Contents"/>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A3"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio:///for">/for</text:a>
            </text:p>
        </table:table-cell>
        <table:table-cell table:style-name="Tableau1.A2"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">Truc</text:p>
        </table:table-cell>
    </table:table-row>
    <table:table-row>
        <table:table-cell table:style-name="Tableau1.A2"
                          table:number-columns-spanned="5"
                          office:value-type="string">
            <text:p text:style-name="Table_20_Contents">
                <text:a xlink:type="simple"
                        xlink:href="relatorio:///for">/for</text:a>
            </text:p>
        </table:table-cell>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
        <table:covered-table-cell/>
    </table:table-row>
</table:table>'''
        interpolated = self.oot.insert_directives(xml)
        root = lxml.etree.parse(interpolated).getroot()
        child2 = root[1]
        self.assertEqual(child2.tag, "{%s}repeat" % RELATORIO_URI)
        self.assertEqual(child2.get("closing"), "3")
        self.assertEqual(child2.get("opening"), "1")
        self.assertEqual(len(child2), 1)
        child4 = root[3]
        self.assertEqual(child4.tag, "{%s}table-header-rows" % OO_TABLE_NS)
        row1 = child4[0]
        self.assertTrue(row1.get("{%s}attrs" % GENSHI_URI)
                .startswith('__relatorio_reset_col_count'))
        self.assertEqual(len(row1), 4)
        loop = row1[1]
        self.assertEqual(loop.tag, "{%s}for" % GENSHI_URI)
        cell = loop[0]
        self.assertTrue(cell.get("{%s}attrs" % GENSHI_URI)
                .startswith('__relatorio_inc_col_count'))
        last_row_node = row1[3]
        self.assertEqual(last_row_node.tag, "{%s}replace" % GENSHI_URI)
        self.assertTrue(last_row_node.get("value")
                        .startswith('__relatorio_store_col_count'))

    def test_text_outside_p(self):
        "Testing that the tail text of a directive node is handled properly"
        xml = b'''<xml xmlns:text="urn:text" xmlns:xlink="urn:xlink">
                    <text:a xlink:href="relatorio://if%20test=%22True%22">if test=&quot;True&quot;</text:a>
                    xxx
                    <text:p text:style-name="other">yyy</text:p>
                    zzz
                    <text:a xlink:href="relatorio:///if">/if</text:a>
                    aaa
                 </xml>'''
        interpolated = self.oot.insert_directives(xml)
        root_interpolated = lxml.etree.parse(interpolated).getroot()
        child = root_interpolated[0]
        self.assertEqual(child.tag, '{http://genshi.edgewall.org/}if')
        self.assertEqual(child.text.strip(), 'xxx')
        self.assertEqual(child.tail.strip(), 'aaa')

    def test_styles(self):
        "Testing that styles get rendered"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        self.assertTrue('We sell stuff' in rendered)

        dico = self.data.copy()
        del dico['footer']
        stream = self.oot.generate(**dico)
        self.assertRaises(UndefinedError,
            lambda: stream.events.render(encoding='utf-8'))

    def test_generate(self):
        "Testing that content get rendered"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        self.assertTrue('Bonjour,' in rendered)
        self.assertTrue('Trente' in rendered)
        self.assertTrue(u'Møller' in rendered)
        self.assertTrue('Dog eat Dog' in rendered)
        self.assertTrue('Felix da housecat' in rendered)

    def test_filters(self):
        "Testing the filters with the Translator filter"
        stream = self.oot.generate(**self.data)
        translated = stream.filter(Translator(pseudo_gettext))
        translated_xml = stream_to_string(
            translated.events.render(encoding='utf-8'))
        self.assertTrue("Hello," in translated_xml)
        self.assertTrue("I am an odt templating test" in translated_xml)
        self.assertTrue('Felix da housecat' not in translated_xml)
        self.assertTrue(u'Félix le chat de la maison' in translated_xml)
        self.assertTrue('We sell stuff' not in translated_xml)
        self.assertTrue('On vend des choses' in translated_xml)

    def test_images(self):
        "Testing the image replacement directive"
        stream = self.oot.generate(**self.data)
        rendered = stream_to_string(stream.events.render(encoding='utf-8'))
        styles_idx = rendered.find('<?relatorio styles.xml?>')
        tree = lxml.etree.parse(StringIO(rendered[25:styles_idx]))
        root = tree.getroot()
        images = root.xpath('//draw:frame', namespaces=self.oot.namespaces)
        self.assertEqual(len(images), 3)
        self.assertEqual(
            images[0].get('{%s}name' % self.oot.namespaces['draw']), "")
        self.assertEqual(
            images[1].get('{%s}name' % self.oot.namespaces['draw']), '')
        self.assertEqual(
            images[1].get('{%s}width' % self.oot.namespaces['svg']), '1.732cm')
        self.assertEqual(
            images[1].get('{%s}height' % self.oot.namespaces['svg']),
            '1.513cm')
        self.assertEqual(
            images[2].get('{%s}width' % self.oot.namespaces['svg']), '1.732cm')
        self.assertEqual(
            images[2].get('{%s}height' % self.oot.namespaces['svg']),
            '1.513cm')

    def test_regexp(self):
        "Testing the regexp used to find relatorio tags"
        # a valid expression
        group = GENSHI_EXPR.match('for each="foo in bar"').groups()
        self.assertEqual(group, (None, 'for', 'each', 'foo in bar'))

        # invalid expr
        group = GENSHI_EXPR.match('foreach="foo in bar"').groups()
        self.assertEqual(group, (None, None, None, None))

        # valid closing tags
        group = GENSHI_EXPR.match('/for').groups()
        self.assertEqual(group, ('/', 'for', None, None))
        group = GENSHI_EXPR.match('/for ').groups()
        self.assertEqual(group, ('/', 'for', None, None))

        # another non matching expr
        group = GENSHI_EXPR.match('formatLang("en")').groups()
        self.assertEqual(group, (None, None, None, None))
コード例 #28
0
ファイル: views.py プロジェクト: emilioramirez/eff
def eff_report(request, user_name):

    context = __process_dates(request)
    context['export_allowed'] = True
    if not (request.user.has_perm('eff.view_billable') and request.user.has_perm('eff.view_wage')):
        if request.user.username != user_name:
            return HttpResponseRedirect('/accounts/login/?next=%s' % quote(request.get_full_path()))
        else:
            if 'export' in request.GET:
                return HttpResponseRedirect('/accounts/login/?next=%s' % quote(request.get_full_path()))
            else:
                del context['export_allowed']

    from_date = context['from_date']
    to_date = context['to_date']
    user = User.objects.get(username=user_name)

    project = None
    if 'project' in request.GET:
        project = request.GET['project']
        context['project'] = project

    # detailed log report
    context['report'] = user.get_profile().report(from_date, to_date, project)

    if 'export' in request.GET:
        if request.GET['export'] == 'odt':
            if 'detailed' in request.GET:
                basic = Template(source=None, filepath=os.path.join(cur_dir, '../templates/reporte_usuario_detallado.odt'))
                report_data = format_report_data_user(context['report'], user, from_date, to_date, True)
                basic_generated = basic.generate(o=report_data).render()
                resp = HttpResponse(basic_generated.getvalue(), mimetype='application/vnd.oasis.opendocument.text')
                cd = 'filename=reverse_billing-%s-%s-logs.odt' % (from_date.year, from_date.strftime("%m"), )
                resp['Content-Disposition'] = cd
                return resp
            else:
                basic = Template(source=None, filepath=os.path.join(cur_dir, '../templates/reporte_usuario.odt'))
                report_by_project = list(TimeLog.get_summary_per_project(user.get_profile(), from_date, to_date, True))
                report_by_project.sort(cmp=lambda (x0,x1,x2,x3,x4), (y0,y1,y2,y3,y4) : cmp(x1,y1))
                rep_by_proj = []
                for p in set(map(lambda ph: ph[1], report_by_project)):
                    r4proj = filter(lambda ph: ph[1]==p, report_by_project)
                    rates = sorted(map(lambda ph: (ph[3], ph[4]), r4proj), reverse=True)
                    rep_by_proj.append((r4proj[0][0], r4proj[0][1], r4proj[0][2], rates))

                report_data = format_report_data_user(rep_by_proj, user, from_date, to_date)
                basic_generated = basic.generate(o=report_data).render()
                resp = HttpResponse(basic_generated.getvalue(), mimetype='application/vnd.oasis.opendocument.text')
                cd = 'filename=reverse_billing-%s-%s.odt' % (from_date.year, from_date.strftime("%m"), )
                resp['Content-Disposition'] = cd
                return resp
        elif request.GET['export'] == 'csv':
            response = HttpResponse(mimetype='text/csv')
            if 'detailed' in request.GET:
                cd = 'attachment; filename=reverse_billing_%s_%s_%s_logs.csv' % (user_name, from_date, to_date, )
                response['Content-Disposition'] = cd
                report_data = format_report_data_user(context['report'], user, from_date, to_date, True)
                t = loader.get_template('csv/reporte_usuario_detallado.txt')
                c = Context({'data': report_data['user_data']['hs_detail'],})
            else:
                cd = 'attachment; filename=reverse_billing_%s_%s_%s.csv' % (user_name, from_date, to_date, )
                response['Content-Disposition'] = cd
                report_by_project = list(TimeLog.get_summary_per_project(user.get_profile(), from_date, to_date))
                report_by_project.sort(cmp=lambda (x0,x1,x2,x3), (y0,y1,y2,y3) : cmp(x3,y3))
                report_data = format_report_data_user(report_by_project, user, from_date, to_date)
                t = loader.get_template('csv/reporte_usuario.txt')
                c = Context({'data': report_data['user_hours'],})

            response.write(t.render(c))
            return response

    # report grouped by project
    report_by_project = list(TimeLog.get_summary_per_project(user.get_profile(), from_date, to_date))
    report_by_project.sort(cmp=lambda (x0,x1,x2,x3), (y0,y1,y2,y3) : cmp(x3,y3))

    context['username'] = user_name
    context['target_user'] = user

    # per-project report
    context['report_by_project'] = report_by_project
    context['projects'] = sorted(map(lambda p: p[1], report_by_project))

    # detailed total of hours between [from_date, to_date]
    totalHrs = 0
    for r in context['report']:
        totalHrs += r[3]
    context['TotalHrsDetailed'] = totalHrs
    # total of hours between [from_date, to_date]
    totalHrs = 0
    for r in context['report_by_project']:
        totalHrs += r[3]
    context['TotalHrs'] = totalHrs

    for flag in (OVERTIME_FLAG, MONTHLY_FLAG):
        if flag in request.GET:
            context[flag] = request.GET[flag]

    context['navs'] = [('prev', 'previo', '«'), ('next', 'siguiente', '»')]

    return render_to_response('reporte.html', context)
コード例 #29
0
    def download_stock_picking(stock_picking, model, type_document_partner_it, stock_picking_id, filename=None, **kw):
        cr, uid, context = request.cr, request.uid, request.context
        stock_picking = request.registry[model]
        stock_picking = stock_picking.browse(cr, uid, int(stock_picking_id), context)
        lines = []
        i = 0
        for item in stock_picking.move_lines:
            codigo = ""
            description = ""
            unidad_de_medida = ""
            i = i + 1 

            if item.product_id.default_code:
                codigo =  item.product_id.default_code
            if item.name:
                description = str(item.name).upper()
            if item.product_uom.name:
                unidad_de_medida = item.product_uom.name

            lines.append({
                "item": i,
                "codigo": codigo,
                "description": description,
                "qty": int(item.product_qty),
                "unit_uom": unidad_de_medida,
                "peso": "",
            })

        #verificar si existen datos y poner "- -" para que no salga False
        date = ""
        min_date = ""
        origin_address = ""
        delivery_address_id = ""
        name = ""
        nro_documento = ""
        vehicle_transport = ""
        name_transport = ""
        addres_transport = ""
        ruc_transport = ""
        type_document_partner_it = ""
        delivery_address = ""

        if stock_picking.date:
            date = str(stock_picking.date)[0:11]
        if stock_picking.min_date:
            min_date = str(stock_picking.min_date)[0:11]
        if stock_picking.origin_address_id.street:
            origin_address =  str(stock_picking.origin_address_id.street)[0:92]
        if stock_picking.delivery_address_id.street:
            delivery_address =  str(stock_picking.delivery_address_id.street)[0:92]
        if stock_picking.partner_id.name:
            name = str(stock_picking.partner_id.name)
        if stock_picking.partner_id.nro_documento:
            nro_documento = stock_picking.partner_id.nro_documento
        if stock_picking.driver_id.vehicle_id.model_id.brand_id.name != False and stock_picking.driver_id.vehicle_id.license_plate != False:
            vehicle_transport = str(stock_picking.driver_id.vehicle_id.model_id.brand_id.name) + " - " + str(stock_picking.driver_id.vehicle_id.license_plate)
        if stock_picking.carrier_id.partner_id.name:
            name_transport = stock_picking.carrier_id.partner_id.name
        if stock_picking.carrier_id.partner_id.street:
            addres_transport = str(stock_picking.carrier_id.partner_id.street)
        if stock_picking.carrier_id.partner_id.nro_documento:
            ruc_transport = stock_picking.carrier_id.partner_id.nro_documento
        if stock_picking.picking_type_id.name:
            type_document_partner_it = stock_picking.picking_type_id.name
        datas = {
            "date": date,
            "min_date": min_date,
            "origin_address": origin_address,
            "delivery_address": delivery_address,
            "name": name,
            "nro_documento": nro_documento,
            "vehicle_transport": vehicle_transport,
            "name_transport": name_transport,
            "addres_transport": addres_transport,
            "constancia": "",
            "ruc_transport": ruc_transport, 
            "nro_licencia": "",
            "nro_constancia": "",
            "lines": lines,
            #"type_document_partner_it": type_document_partner_it,
            "null": ""
        }

        stock_picking_path = openerp.modules.get_module_resource('fxo_mv_print_documents','templates', "stock_picking.odt")

        if not stock_picking_path:
            error = {
                'code': 200,  
                'message': "Odoo Server Error",
                'data': "Not found file template in module!."
            }
            return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))

        try:
            basic = Template(source="", filepath=stock_picking_path)
        except:
            error = {
                'code': 200,  
                'message': "Odoo Server Error",
                'data': "You do not have permission to read\nfile template!."
            }
            return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))

        basic_generated = basic.generate(o=datas).render()
        filecontent = basic_generated.getvalue()

        if not filecontent:
            return request.not_found()
        else:
            if not filename:
                filename = '%s_%s' % (model.replace('.', '_'), wid)
            return request.make_response(filecontent,
                                         [('Content-Type', 'application/octet-stream'),
                                          ('Content-Disposition', content_disposition(filename))])
コード例 #30
0
from relatorio.templates.opendocument import Template
from data import sched

# basic = Template(source='', filepath='schedules-template.odt')
# basic_generated = basic.generate(o=sched).render()
# file('generated-schedules.odt', 'wb').write(basic_generated.getvalue())

basic = Template(source='', filepath='schedules-template-p-l.odt')
open('generated-iftest.odt', 'wb').write(basic.generate(o=sched).render().getvalue())

# from common import inv
# from relatorio.templates.opendocument import Template
# basic = Template(source='', filepath='basic.odt')
# open('bonham_basic.odt', 'wb').write(basic.generate(o=inv).render().getvalue())
コード例 #31
0
#!/usr/bin/python

from relatorio.templates.opendocument import Template
import sys
import fileinput

transaction_separator = "\n\n"
description_separators = ['|', ':']

invoice_template = Template(source=None, filepath='invoice.odt')

infile = file(sys.argv[1]).read()
transactions = infile.split(transaction_separator)

for transaction in transactions:
    transaction_dict = dict()
    transaction_dict['invoiced'] = False
    transaction_dict['total'] = False
    transaction_dict['description'] = 'Miscellaneous Hardware'
    transaction_lines = transaction.splitlines()
    #The first line of each transaction is its overall description
    desc_line = transaction_lines[0].split(' ', 1)
    transaction_dict['date'] = desc_line[0]
    transaction_dict['customer'] = desc_line[1]
    
    for sep in description_separators:
        if sep in desc_line[1]:
            desc_split = desc_line[1].split(sep)
            transaction_dict['customer'] = desc_split[0].strip('* ')
            transaction_dict['description'] = desc_split[1].strip()