Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
from django import template
|
|
|
|
from django.utils.safestring import mark_safe
|
|
|
|
from urllib.request import quote as urlencode
|
|
|
|
register = template.Library()
|
|
|
|
|
|
|
|
@register.simple_tag
|
|
|
|
def mailurl(*, subject=None, body=None, to=[], cc=[], bcc=[]):
|
|
|
|
"""Tag na vytváření správně zakódované mailto: adresy
|
|
|
|
|
|
|
|
Ref: RFC 6068, <https://en.wikipedia.org/wiki/Mailto>"""
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
if isinstance(to, str):
|
|
|
|
to = [to]
|
|
|
|
if isinstance(cc, str):
|
|
|
|
cc = [cc]
|
|
|
|
if isinstance(bcc, str):
|
|
|
|
bcc = [bcc]
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
assert isinstance(to, list)
|
|
|
|
assert isinstance(cc, list)
|
|
|
|
assert isinstance(bcc, list)
|
|
|
|
# FIXME: adresa není správně zakódovaná, rozbije se to na adresách s divnými znaky
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
parts = [
|
|
|
|
f'mailto:{str.join(",", to)}',
|
|
|
|
]
|
|
|
|
if len(to) + len(cc) + len(bcc) < 1:
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
raise ValueError('Cannot mail to empty set of people')
|
|
|
|
|
|
|
|
if subject:
|
|
|
|
parts.append(f'subject={urlencode(subject)}')
|
|
|
|
if body:
|
|
|
|
parts.append(f'body={urlencode(body)}')
|
|
|
|
if len(cc) > 0:
|
|
|
|
parts.append(f'cc={str.join(",", cc)}')
|
|
|
|
if len(bcc) > 0:
|
|
|
|
parts.append(f'bcc={str.join(",", bcc)}')
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
|
|
|
|
if len(parts) > 1:
|
|
|
|
url = parts[0] + '?' + str.join('&', parts[1:])
|
|
|
|
else:
|
|
|
|
url = parts[0]
|
|
|
|
return url
|
|
|
|
|
|
|
|
@register.simple_tag
|
|
|
|
def maillink(text, subject=None, body=None, to=[], cc=[], bcc=[], attrs=None):
|
|
|
|
url = mailurl(subject=subject, body=body, to=to, cc=cc, bcc=bcc)
|
Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.
Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.
Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.
V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.
Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2 years ago
|
|
|
if not attrs: attrs = ''
|
|
|
|
mezera = ' '*bool(attrs)
|
|
|
|
full_link = f'<a href="{url}"{mezera}{attrs}>{text}</a>'
|
|
|
|
return mark_safe(full_link)
|