예제 #1
0
    def _format_subj(self, event):
        is_newticket = event.category == 'created'
        ticket = event.target

        summary = ticket['summary']
        if event.changes and 'summary' in event.changes['fields']:
            change = event.changes['fields']['summary']
            summary = "%s (was: %s)" % (change['new'], change['old'])

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.env.project_name

        data = {
            'prefix': prefix,
            'summary': summary,
            'ticket': ticket,
            'changes': event.changes,
            'env': self.env,
        }

        template = self.config.get('notification', 'ticket_subject_template')
        template = NewTextTemplate(template.encode('utf8'))
        subj = template.generate(**data).render('text', encoding=None).strip()
        if not is_newticket:
            subj = "Re: " + subj
        return subj
예제 #2
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_exec_import(self):
     tmpl = NewTextTemplate(u"""{% python from datetime import timedelta %}
     ${timedelta(days=2)}
     """)
     self.assertEqual("""
     2 days, 0:00:00
     """, str(tmpl.generate()))
예제 #3
0
파일: text.py 프로젝트: alon/polinax
 def test_exec_import(self):
     tmpl = NewTextTemplate(u"""{% python from datetime import timedelta %}
     ${timedelta(days=2)}
     """)
     self.assertEqual("""
     2 days, 0:00:00
     """, str(tmpl.generate()))
예제 #4
0
 def test_exec_import(self):
     tmpl = NewTextTemplate("""{% python from datetime import timedelta %}
     ${timedelta(days=2)}
     """)
     self.assertEqual("""
     2 days, 0:00:00
     """, tmpl.generate().render(encoding=None))
예제 #5
0
 def test_exec_import(self):
     tmpl = NewTextTemplate("""{% python from datetime import timedelta %}
     ${timedelta(days=2)}
     """)
     self.assertEqual("""
     2 days, 0:00:00
     """,
                      tmpl.generate().render(encoding=None))
예제 #6
0
    def test_end_with_args(self):
        tmpl = NewTextTemplate(
            """
{% if foo %}
  bar
{% end 'if foo' %}"""
        )
        self.assertEqual("\n", tmpl.generate(foo=False).render(encoding=None))
예제 #7
0
 def test_exec_def(self):
     tmpl = NewTextTemplate("""{% python
     def foo():
         return 42
     %}
     ${foo()}
     """)
     self.assertEqual("""
     42
     """, tmpl.generate().render(encoding=None))
예제 #8
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_exec_def(self):
     tmpl = NewTextTemplate(u"""{% python
     def foo():
         return 42
     %}
     ${foo()}
     """)
     self.assertEqual(u"""
     42
     """, str(tmpl.generate()))
예제 #9
0
파일: text.py 프로젝트: alon/polinax
 def test_exec_def(self):
     tmpl = NewTextTemplate(u"""{% python
     def foo():
         return 42
     %}
     ${foo()}
     """)
     self.assertEqual(u"""
     42
     """, str(tmpl.generate()))
예제 #10
0
 def test_exec_def(self):
     tmpl = NewTextTemplate("""{% python
     def foo():
         return 42
     %}
     ${foo()}
     """)
     self.assertEqual("""
     42
     """,
                      tmpl.generate().render(encoding=None))
예제 #11
0
    def _notify_admins(self, permission, email_path, debug='false'):
        is_debug = debug.lower() in ('true', 'yes')

        if permission != 'TRAC_ADMIN':
            raise AdminCommandError('Only TRAC_ADMIN permission is supported')

        # A standard thing to do in IAdminCommandProviders (otherwise,
        # accessing project_identifier would give errors)
        if not hasattr(self.env, 'project_identifier'):
            MultiProjectEnvironmentInit(self.env).environment_needs_upgrade(None)

        env_name = self.env.project_identifier
        if env_name == self.env.config.get('multiproject', 'sys_home_project_name'):
            raise AdminCommandError('Command does not support home project')

        if not os.path.exists(email_path):
            raise AdminCommandError(_("Email template was not found!"))

        project = Project.get(self.env)
        email_template = ''
        try:
            with open(email_path) as fd:
                email_template = fd.read()
        except OSError as e:
            raise AdminCommandError(_("Error with opening file %(path)s: %(error_msg)s",
                path=email_path, error_msg=e))
        except Exception as e:
            raise AdminCommandError(_("Unknown error when parsing file %(path)s: %(error_msg)s",
                path=email_path, error_msg=e))
        email_template = [i.strip() for i in email_template.split('\n', 1) if i]
        if not len(email_template) > 1 or not all(email_template):
            raise AdminCommandError(_("Email template %(path)s was invalid.", path=email_path))

        subject, body = email_template
        text_template = NewTextTemplate(body)
        admins = project.get_admin_email_addresses()

        data = {'env_name': env_name}

        if is_debug:
            printout('## DEBUG MODE - NOT SENDING EMAILS ##')

        printout("project: {0}".format(env_name))
        printout("to: {0}".format(','.join(admins)))
        printout("subject: {0}".format(subject))
        printout("----------------------------")
        printout(text_template.generate(**data))
        printout("----------------------------")

        if not is_debug:
            notifier = EmailNotifier(self.env, subject=subject, data=data)
            notifier.template = text_template
            notifier.notify(admins)
            printout('Emails sent')
예제 #12
0
    def _notify_admins(self, permission, email_path, debug="false"):
        is_debug = debug.lower() in ("true", "yes")

        if permission != "TRAC_ADMIN":
            raise AdminCommandError("Only TRAC_ADMIN permission is supported")

        # A standard thing to do in IAdminCommandProviders (otherwise,
        # accessing project_identifier would give errors)
        if not hasattr(self.env, "project_identifier"):
            MultiProjectEnvironmentInit(self.env).environment_needs_upgrade(None)

        env_name = self.env.project_identifier
        if env_name == self.env.config.get("multiproject", "sys_home_project_name"):
            raise AdminCommandError("Command does not support home project")

        if not os.path.exists(email_path):
            raise AdminCommandError(_("Email template was not found!"))

        project = Project.get(self.env)
        email_template = ""
        try:
            with open(email_path) as fd:
                email_template = fd.read()
        except OSError as e:
            raise AdminCommandError(_("Error with opening file %(path)s: %(error_msg)s", path=email_path, error_msg=e))
        except Exception as e:
            raise AdminCommandError(
                _("Unknown error when parsing file %(path)s: %(error_msg)s", path=email_path, error_msg=e)
            )
        email_template = [i.strip() for i in email_template.split("\n", 1) if i]
        if not len(email_template) > 1 or not all(email_template):
            raise AdminCommandError(_("Email template %(path)s was invalid.", path=email_path))

        subject, body = email_template
        text_template = NewTextTemplate(body)
        admins = project.get_admin_email_addresses()

        data = {"env_name": env_name}

        if is_debug:
            printout("## DEBUG MODE - NOT SENDING EMAILS ##")

        printout("project: {0}".format(env_name))
        printout("to: {0}".format(",".join(admins)))
        printout("subject: {0}".format(subject))
        printout("----------------------------")
        printout(text_template.generate(**data))
        printout("----------------------------")

        if not is_debug:
            notifier = EmailNotifier(self.env, subject=subject, data=data)
            notifier.template = text_template
            notifier.notify(admins)
            printout("Emails sent")
예제 #13
0
    def format_subj(self, summary):
        template = self.config.get("notification", "ticket_subject_template")
        template = NewTextTemplate(template.encode("utf8"))

        prefix = self.config.get("notification", "smtp_subject_prefix")
        if prefix == "__default__":
            prefix = "[%s]" % self.env.project_name

        data = {"prefix": prefix, "summary": summary, "ticket": self.ticket, "env": self.env}

        return template.generate(**data).render("text", encoding=None).strip()
예제 #14
0
    def format_subject(self):
        template = self.config.get('fullblog-notification', 'subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.config.get('project', 'name')

        action = self.action.strip('post_').replace('_', ' ')

        data = {'blog': self.blog, 'prefix': prefix, 'action': action}
        return template.generate(**data).render('text', encoding=None).strip()
예제 #15
0
파일: text.py 프로젝트: alon/polinax
    def test_empty_lines1(self):
        tmpl = NewTextTemplate("""Your items:

{% for item in items %}\
  * ${item}
{% end %}""")
        self.assertEqual("""Your items:

  * 0
  * 1
  * 2
""", tmpl.generate(items=range(3)).render())
예제 #16
0
class TextTemplate(object):
    """A specific template that can be used to output textual content.

    It works as the ODT or ODS templates, minus the fact that is does not
    support images.
    """
    def __init__(self,
                 template,
                 outfile,
                 encoding='utf-8',
                 ignore_undefined_variables=False):
        """
        :param template: a genshi text template. For more information you can
        refer to the Genshi documentation:
          http://genshi.edgewall.org/wiki/ApiDocs/genshi.template.text

        :type template: a string representing the full path name to a
        template file.

        :param outfile: the desired file name for the resulting text document
        :type outfile: a string representing the full filename for output

        :param encoding: By default the text encoding of the output will be
        UTF8. If you want another encoding you must specify it.
        :type encoding: a string representin the desired output encoding

        :param ignore_undefined_variables: Not defined variables are replaced
        with an empty string during template rendering if True
        :type ignore_undefined_variables: boolean. Default is False
        """

        self.outputfilename = outfile
        self.encoding = encoding

        content = codecs.open(template, 'rb', encoding='utf-8').read()

        if ignore_undefined_variables:
            self.template = GenshiTextTemplate(content, lookup='lenient')
        else:
            self.template = GenshiTextTemplate(content)

    def render(self, data):
        """Render the template with the provided data.

        :param data: a dictionnary containing your data (preferably
        a iterators)
        :return: Nothing
        """
        with codecs.open(self.outputfilename, 'wb+',
                         encoding=self.encoding) as outfile:

            for kind, data, pos in self.template.generate(**data):
                outfile.write(data)
예제 #17
0
파일: text.py 프로젝트: NixePix/genshi
    def test_empty_lines1_with_crlf(self):
        tmpl = NewTextTemplate('Your items:\r\n'
'\r\n'
'{% for item in items %}\\\r\n'
'  * ${item}\r\n'
'{% end %}')

        self.assertEqual('Your items:\r\n'
'\r\n'
'  * 0\r\n'
'  * 1\r\n'
'  * 2\r\n', tmpl.generate(items=range(3)).render(encoding=None))
예제 #18
0
파일: text.py 프로젝트: e2pluginss/plexnet
    def test_empty_lines1(self):
        tmpl = NewTextTemplate("""Your items:

{% for item in items %}\
  * ${item}
{% end %}""")
        self.assertEqual("""Your items:

  * 0
  * 1
  * 2
""",
                         tmpl.generate(items=range(3)).render())
예제 #19
0
    def test_empty_lines1_with_crlf(self):
        tmpl = NewTextTemplate('Your items:\r\n'
                               '\r\n'
                               '{% for item in items %}\\\r\n'
                               '  * ${item}\r\n'
                               '{% end %}')

        self.assertEqual(
            'Your items:\r\n'
            '\r\n'
            '  * 0\r\n'
            '  * 1\r\n'
            '  * 2\r\n',
            tmpl.generate(items=range(3)).render(encoding=None))
예제 #20
0
 def format_subj(self, tickets_descr):
     template = self.config.get('notification','batch_subject_template')
     template = NewTextTemplate(template.encode('utf8'))
                                             
     prefix = self.config.get('notification', 'smtp_subject_prefix')
     if prefix == '__default__': 
         prefix = '[%s]' % self.env.project_name
     
     data = {
         'prefix': prefix,
         'tickets_descr': tickets_descr,
         'env': self.env,
     }
     
     return template.generate(**data).render('text', encoding=None).strip()
예제 #21
0
    def format_subj(self, tickets_descr):
        template = self.config.get('notification', 'batch_subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.env.project_name

        data = {
            'prefix': prefix,
            'tickets_descr': tickets_descr,
            'env': self.env,
        }
        subj = template.generate(**data).render('text', encoding=None).strip()
        return shorten_line(subj)
    def format_subject(self, action):
        template = self.config.get('wiki-notification', 'subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.config.get('project', 'name')

        data = {
            'pagename': self.old_name or self.page.name,
            'prefix': prefix,
            'action': action,
            'env': self.env,
        }
        return template.generate(**data).render('text', encoding=None).strip()
예제 #23
0
    def format_subject(self, action):
        template = self.config.get('wiki-notification', 'subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.config.get('project', 'name')

        data = {
            'pagename': self.old_name or self.page.name,
            'prefix': prefix,
            'action': action,
            'env': self.env,
        }
        return template.generate(**data).render('text', encoding=None).strip()
    def build_clone_form(self, req, ticket, data):
        fields = {}
        for derivation in self.derived_fields:
            template, new_field = derivation.split('->')
            if new_field in self.excluded_fields:
                continue
            template = NewTextTemplate(template.replace("\\n", "\n").encode('utf8'))
            fields[new_field] = template.generate(ticket=ticket).render('text', encoding=None).strip()

        for f in data.get('fields', []):
            name = f['name']
            if name in fields:
                continue
            if name not in self.excluded_fields:
                fields[name] = ticket[name]
        return fields
예제 #25
0
    def format_subj(self, summary):
        template = self.config.get('notification', 'ticket_subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.env.project_name

        data = {
            'prefix': prefix,
            'summary': summary,
            'ticket': self.ticket,
            'env': self.env,
        }

        return template.generate(**data).render('text', encoding=None).strip()
예제 #26
0
    def build_clone_form(self, req, ticket, data):
        fields = {}
        for derivation in self.derived_fields:
            template, new_field = derivation.split('->')
            if new_field in self.excluded_fields:
                continue
            template = NewTextTemplate(
                template.replace("\\n", "\n").encode('utf8'))
            fields[new_field] = template.generate(ticket=ticket).render(
                'text', encoding=None).strip()

        for f in data.get('fields', []):
            name = f['name']
            if name in fields:
                continue
            if name not in self.excluded_fields:
                fields[name] = ticket[name]
        return fields
예제 #27
0
    def format_subj(self, summary, newticket=True):
        template = self.config.get('notification', 'ticket_subject_template')
        template = NewTextTemplate(template.encode('utf8'))

        prefix = self.config.get('notification', 'smtp_subject_prefix')
        if prefix == '__default__':
            prefix = '[%s]' % self.env.project_name

        data = {
            'prefix': prefix,
            'summary': summary,
            'ticket': self.ticket,
            'env': self.env,
        }

        subj = template.generate(**data).render('text', encoding=None).strip()
        if not newticket:
            subj = "Re: " + subj
        return subj
예제 #28
0
    def test_empty_lines2(self):
        tmpl = NewTextTemplate(
            """Your items:

{% for item in items %}\
  * ${item}

{% end %}"""
        )
        self.assertEqual(
            """Your items:

  * 0

  * 1

  * 2

""",
            tmpl.generate(items=list(range(3))).render(encoding=None),
        )
예제 #29
0
파일: text.py 프로젝트: alon/polinax
 def test_unicode_input(self):
     text = u'$foo\xf6$bar'
     tmpl = NewTextTemplate(text)
     self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
예제 #30
0
파일: text.py 프로젝트: alon/polinax
    def test_end_with_args(self):
        tmpl = NewTextTemplate("""
{% if foo %}
  bar
{% end 'if foo' %}""")
        self.assertEqual('\n', str(tmpl.generate(foo=False)))
예제 #31
0
파일: text.py 프로젝트: alon/polinax
 def test_comment(self):
     tmpl = NewTextTemplate('{# a comment #}')
     self.assertEqual('', str(tmpl.generate()))
		("factoryMate.py", "%s-factoryMate.py" % name),
		("panel-applet.template", "org.gnome.applets.%s.panel-applet" % name),
		]

for root,dirs,files in walk("templates/debian"):
	for f in files:
		fullpath = join(root,f)[len("templates/"):]
		templates.append((fullpath, fullpath))

for (src, dest) in templates:
	src = join("templates", src)
	dest = join(opts.folder, dest)
	destdir = dirname(dest)
	if destdir != "" and not exists(destdir):
		makedirs(destdir)
	tmpl = NewTextTemplate(open(src).read())
	stream = tmpl.generate(
			name = opts.name,
			scriptRoot = scriptRoot,
			description = opts.description,
			icon = opts.icon,
			category = opts.category,
			lowerName = opts.name.lower(),
			maintainer = opts.maintainer,
			email = opts.email,
			now = now)
	open(dest, "wb").write(stream.render())

	bits = stat(src).st_mode
	chmod(dest, bits)
예제 #33
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_unicode_input(self):
     text = u'$foo\xf6$bar'
     tmpl = NewTextTemplate(text)
     self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
예제 #34
0
 def test_unicode_input(self):
     text = u'$foo\xf6$bar'
     tmpl = NewTextTemplate(text)
     self.assertEqual(u'x\xf6y',
                      tmpl.generate(foo='x', bar='y').render(encoding=None))
예제 #35
0
    def test_end_with_args(self):
        tmpl = NewTextTemplate("""
{% if foo %}
  bar
{% end 'if foo' %}""")
        self.assertEqual('\n', tmpl.generate(foo=False).render(encoding=None))
예제 #36
0
 def test_comment(self):
     tmpl = NewTextTemplate('{# a comment #}')
     self.assertEqual('', tmpl.generate().render(encoding=None))
예제 #37
0
 def genshiText(indented_string):
     t = NewTextTemplate(trim(indented_string))
     return lambda **kw: t.generate(**kw).render()
예제 #38
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_latin1_encoded(self):
     text = u'$foo\xf6$bar'.encode('iso-8859-1')
     tmpl = NewTextTemplate(text, encoding='iso-8859-1')
     self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
예제 #39
0
 def test_unicode_input(self):
     text = u'$foo\xf6$bar'
     tmpl = NewTextTemplate(text)
     self.assertEqual(u'x\xf6y',
                      tmpl.generate(foo='x', bar='y').render(encoding=None))
예제 #40
0
 def test_comment_escaping(self):
     tmpl = NewTextTemplate('\\{# escaped comment #}')
     self.assertEqual('{# escaped comment #}',
                      tmpl.generate().render(encoding=None))
예제 #41
0
 def test_latin1_encoded(self):
     text = "$foo\xf6$bar".encode("iso-8859-1")
     tmpl = NewTextTemplate(text, encoding="iso-8859-1")
     self.assertEqual("x\xf6y", tmpl.generate(foo="x", bar="y").render(encoding=None))
예제 #42
0
 def test_escaping(self):
     tmpl = NewTextTemplate("\\{% escaped %}")
     self.assertEqual("{% escaped %}", tmpl.generate().render(encoding=None))
예제 #43
0
def genshiText(indented_string):
    t = NewTextTemplate(trim(indented_string))
    return lambda **kw: t.generate(**kw).render()
예제 #44
0
파일: text.py 프로젝트: alon/polinax
 def test_escaping(self):
     tmpl = NewTextTemplate('\\{% escaped %}')
     self.assertEqual('{% escaped %}', str(tmpl.generate()))
예제 #45
0
 def test_latin1_encoded(self):
     text = '$foo\xf6$bar'.encode('iso-8859-1')
     tmpl = NewTextTemplate(text, encoding='iso-8859-1')
     self.assertEqual('x\xf6y',
                      tmpl.generate(foo='x', bar='y').render(encoding=None))
예제 #46
0
파일: text.py 프로젝트: alon/polinax
 def test_comment_escaping(self):
     tmpl = NewTextTemplate('\\{# escaped comment #}')
     self.assertEqual('{# escaped comment #}', str(tmpl.generate()))
예제 #47
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_comment(self):
     tmpl = NewTextTemplate('{# a comment #}')
     self.assertEqual('', str(tmpl.generate()))
예제 #48
0
파일: text.py 프로젝트: alon/polinax
 def test_latin1_encoded(self):
     text = u'$foo\xf6$bar'.encode('iso-8859-1')
     tmpl = NewTextTemplate(text, encoding='iso-8859-1')
     self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
예제 #49
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_comment_escaping(self):
     tmpl = NewTextTemplate('\\{# escaped comment #}')
     self.assertEqual('{# escaped comment #}', str(tmpl.generate()))
예제 #50
0
 def test_comment(self):
     tmpl = NewTextTemplate('{# a comment #}')
     self.assertEqual('', tmpl.generate().render(encoding=None))
예제 #51
0
파일: text.py 프로젝트: e2pluginss/plexnet
    def test_end_with_args(self):
        tmpl = NewTextTemplate("""
{% if foo %}
  bar
{% end 'if foo' %}""")
        self.assertEqual('\n', str(tmpl.generate(foo=False)))
예제 #52
0
파일: text.py 프로젝트: e2pluginss/plexnet
 def test_escaping(self):
     tmpl = NewTextTemplate('\\{% escaped %}')
     self.assertEqual('{% escaped %}', str(tmpl.generate()))
예제 #53
0
 def test_unicode_input(self):
     text = "$foo\xf6$bar"
     tmpl = NewTextTemplate(text)
     self.assertEqual("x\xf6y", tmpl.generate(foo="x", bar="y").render(encoding=None))
예제 #54
0
 def test_comment_escaping(self):
     tmpl = NewTextTemplate('\\{# escaped comment #}')
     self.assertEqual('{# escaped comment #}',
                      tmpl.generate().render(encoding=None))
예제 #55
0
    ("factory3.py", "%s-factory3.py" % name),
    ("factoryMate.py", "%s-factoryMate.py" % name),
    ("panel-applet.template", "org.gnome.applets.%s.panel-applet" % name),
]

for root, dirs, files in walk("templates/debian"):
    for f in files:
        fullpath = join(root, f)[len("templates/"):]
        templates.append((fullpath, fullpath))

for (src, dest) in templates:
    src = join("templates", src)
    dest = join(opts.folder, dest)
    destdir = dirname(dest)
    if destdir != "" and not exists(destdir):
        makedirs(destdir)
    tmpl = NewTextTemplate(open(src).read())
    stream = tmpl.generate(name=opts.name,
                           scriptRoot=scriptRoot,
                           description=opts.description,
                           icon=opts.icon,
                           category=opts.category,
                           lowerName=opts.name.lower(),
                           maintainer=opts.maintainer,
                           email=opts.email,
                           now=now)
    open(dest, "wb").write(stream.render())

    bits = stat(src).st_mode
    chmod(dest, bits)