示例#1
0
    def __init__(self, invoice):
        self.invoice = invoice
        self.invoice_datetime = ConfigStore.parse_date(
            self.invoice.invoice_date)
        self.config = ConfigStore.get_configuration(when=self.invoice_datetime)

        self.translation = Translations.load('locale',
                                             locales=[self.invoice.language],
                                             domain='pyinvoice')
        self.ugettext = self.translation.ugettext
        self.format = Format(locale=self.invoice.language)
示例#2
0
    def test_renders_prices_with_correct_currency(self):
        assert_equals(u'1.024,00 €', self.generator.format_price(1024))

        self.generator.invoice.currency = 'USD'
        self.generator.format = Format(locale='en')
        assert_equals('en', str(self.generator.format.locale))
        assert_equals(u'$1,024.00', self.generator.format_price(1024))
示例#3
0
文件: __init__.py 项目: vlaght/ikcms
 def __new__(cls, component, name, env=None):
     self = str.__new__(cls, name)
     self.component = component
     self.translations = component.translations[name]
     self.format = Format(name)
     self.locale = Locale(name)
     self._env = env
     return self
示例#4
0
def _get_format():
    lang = translation.get_language()
    try:
        locale = Locale(translation.to_locale(lang))
    except UnknownLocaleError:
        locale = Locale(
            translation.to_locale(settings.BABEL_FALLBACK.get(lang, 'en-US')))
    return Format(locale)
示例#5
0
 def __new__(cls, name, root, translations_dir, categories=[]):
     self = str.__new__(cls, name)
     self.format = Format(name)
     self.timezone = timezone('Europe/Moscow')
     self.root = getattr(root, name)
     self._translations = get_translations(translations_dir, self,
                                           categories)
     return self
示例#6
0
def _format_decimal(num, format=None):
    """Returns the string of a number formatted for the current language.

    Uses django's translation.get_language() to find the current language from
    the request.
    Falls back to the default language if babel does not support the current.

    """
    lang = translation.get_language()
    if not localedata.exists(lang):
        lang = settings.LANGUAGE_CODE
    locale = Locale(translation.to_locale(lang))
    return Format(locale).decimal(num, format)
示例#7
0
def _get_format():
    lang = get_language()
    return Format(utils.get_locale_from_lang(lang))
示例#8
0
def _get_format():
    lang = translation.get_language()
    locale = Locale(translation.to_locale(lang))
    return Format(locale)
示例#9
0
def _get_format():
    lang = translation.get_language()
    return Format(get_locale_from_lang(lang))
示例#10
0
 def __new__(cls, env, name):
     self = str.__new__(cls, name)
     self._env = weakproxy(env)
     self.format = Format(name)
     return self
示例#11
0
class Lang(str):

    def __new__(cls, env, name):
        self = str.__new__(cls, name)
        self._env = weakproxy(env)
        self.format = Format(name)
        return self

    @cached_property
    def root(self):
        return getattr(self._env.root, self)

    @cached_property
    def url_for(self):
        return self.root.build_url

    @cached_property
    def others(self):
        return tuple(lang for lang in self._env.langs if lang!=self)

    @cached_property
    def _translations(self):
        return self._env.get_translations(self)

    def gettext(self, msgid):
        message = self._translations.gettext(unicode(msgid))
        if isinstance(msgid, Markup):
            message = Markup(message)
        return message

    def ngettext(self, msgid1, msgid2, n):
        message = self._translations.ngettext(unicode(msgid1),
                                              unicode(msgid2), n)
        if isinstance(msgid1, Markup):
            message = Markup(message)
        return message

    def date(self, date, format=None):
        return format_date(date, format, locale=self)

    def datetime(self, datetime, format=None):
        return format_datetime(datetime, format, locale=self)

    def daterange(self, start, end):
        return format_daterange(start, end, locale=self)

    @cached_property
    def date_formats(self):
        return {'DATE': dates.DATE_FORMATS[self],
                'DATETIME': dates.DATETIME_FORMATS[self],
                'MONTH': dates.MONTH_FORMATS[self]}

    def timedelta2(self, seconds, **kwargs):
        for (i, (nm, tm)) in enumerate(TIMEDELTA_UNITS):
            if tm < seconds:
                result = format_timedelta(seconds, threshold=1, locale=self, **kwargs)
                smaller_tm = seconds % tm
                not_last = i < len(TIMEDELTA_UNITS) - 1
                if not_last and smaller_tm > TIMEDELTA_UNITS[i+1][1]:
                    result += ' ' + self.format.timedelta(smaller_tm, threshold=1, **kwargs)
                return result
        return format_timedelta(seconds, locale=self, **kwargs)
示例#12
0
class RMLGenerator(object):
    def __init__(self, invoice):
        self.invoice = invoice
        self.invoice_datetime = ConfigStore.parse_date(
            self.invoice.invoice_date)
        self.config = ConfigStore.get_configuration(when=self.invoice_datetime)

        self.translation = Translations.load('locale',
                                             locales=[self.invoice.language],
                                             domain='pyinvoice')
        self.ugettext = self.translation.ugettext
        self.format = Format(locale=self.invoice.language)

    def build(self, output_dir, basename, should_embed_logo=False):
        rml_string = self.render_template()
        #self.save_rml_file(rml_string, output_dir, basename)
        self.build_pdf(rml_string, output_dir, basename, should_embed_logo)

    def render_template(self):
        user_template = self.config['rml_template']
        if os.path.isfile(user_template):
            user_template = os.path.dirname(user_template)

        def template_loaded(template):
            Translator(self.translation).setup(template)

        loader = TemplateLoader([user_template, this_dir],
                                callback=template_loaded)

        template = loader.load('rg.rml')
        stream = template.generate(**self.template_variables())
        return stream.render('xhtml')

    def build_pdf(self, rml_string, output_dir, basename, should_embed_logo):
        filename = self.get_pdf_filename(output_dir, basename)
        cur_dirname = os.path.dirname(__file__)
        fontdir = os.path.abspath(os.path.join(cur_dirname, "fonts"))
        register_fonts_for_language(self.invoice.language, fontdir)
        pdf_logo_fp = rml_to_pdf(rml_string, embed_logo=should_embed_logo)
        file_handle = file(filename, "wb")
        file_handle.write(pdf_logo_fp.getvalue())
        file_handle.close()

    def save_rml_file(self, rml_string, output_dir, basename):
        filename = self.get_rml_filename(output_dir, basename)
        if isinstance(rml_string, unicode):
            rml_string = rml_string.encode("UTF-8")
        file_handle = file(filename, "w")
        file_handle.write(rml_string)
        file_handle.close()

    def get_rml_filename(self, output_dir, basename):
        filename = os.path.join(
            output_dir, "%s.%s.rml" % (basename, self.invoice.language))
        return filename

    def get_pdf_filename(self, output_dir, basename):
        filename = os.path.join(
            output_dir, "%s.%s.pdf" % (basename, self.invoice.language))
        return filename

    def invoicing_party_variables(self):
        return dict(
            name=self.config["name"],
            email=self.config["email"],
            phone=self.config["tel"],
            url=u"http://" + self.config["url"],
            domain=self.config["url"],
            bank=dict(
                account_nr=self.config["bank_account_nr"],
                code_nr=self.config["bank_code_nr"],
                name=self.config["bank_name"],
                iban=self.config["bank_iban"],
                bic=self.config["bank_bic"],
            ),
            paypal=self.config["paypal"],
            ustidnr=self.config["ustidnr"],
            taxnr=self.config['taxnr'],
            address=dict(
                street=self.config["street"],
                zip=self.config["zip"],
                city=self.config["city"],
            ),
        )

    def pdf_title(self):
        title_template = self.ugettext(
            "Rechnung Nr. %(number)s vom %(date)s: %(subject)s")
        title_parameters = dict(number=self.invoice.invoice_number,
                                date=self.format.date(self.invoice_datetime),
                                subject=self.invoice.invoice_subject)
        return title_template % title_parameters

    def remove_latex_codes(self, text):
        output = re.sub('\\\-', "", text)
        return output

    def text_transform(self, text):
        output = text
        output = re.sub('"(,|\.|\s+)', u"“\\1", output)
        output = re.sub(u'(\s+)"', u'\\1„', output)
        return output

    def invoice_item_variables(self):
        items = []
        for i, item in enumerate(self.invoice.get_invoice_items()):
            items.append(
                dict(
                    position=i + 1,
                    description=self.text_transform(
                        self.remove_latex_codes(item.name)),
                    price=self.format_price(item.get_price(netto=True)),
                ))
        return items

    def template_variables(self):
        vat_percentage = [0][0]
        return dict(
            title=self.pdf_title(),
            author=self.config["name"],
            invoicing_party=self.invoicing_party_variables(),
            invoice=self.invoice,
            invoice_date=self.format.date(self.invoice_datetime),
            vat_percentage=self.format.percent(vat_percentage),
            invoice_items=self.invoice_item_variables(),
            vat_items=self.invoice.get_vat_sums(),
            format=self.format,
            format_price=self.format_price,
        )

    def format_price(self, price):
        return self.format.currency(price, currency=self.invoice.currency)