Skip to content

Commit c5cdf5c

Browse files
author
Martin Gropp
committed
foodcoop: attachment
1 parent 3ecbab3 commit c5cdf5c

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

foodcoop.py

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
# URL für Tabelle als CSV
1616
url = 'https://docs.google.com/spreadsheet/ccc?key=0ApNp0aXSrxXPdHlZYk1GTUtuVTVKVWd4RHpYY1ZPS2c&output=csv&gid=2'
1717

18+
# URL für Tabelle als ODS
19+
url_ods = 'https://docs.google.com/spreadsheet/ccc?key=0ApNp0aXSrxXPdHlZYk1GTUtuVTVKVWd4RHpYY1ZPS2c&output=ods'
20+
1821
# Zelle mit dem Lieferdatum
1922
pos_date = (1,0)
2023

@@ -148,6 +151,25 @@ def decode_tuple(t):
148151
orders.append(encode_tuple(supplier, product, customer, price_per_unit, quantity, unit))
149152

150153

154+
########################################################################
155+
def attach_spreadsheet(message, url=url_ods, mime_type=('application', 'vnd.oasis.opendocument.spreadsheet'), filename='foodcoop.ods'):
156+
from email.MIMEBase import MIMEBase
157+
from email import Encoders
158+
159+
part = MIMEBase(mime_type[0], mime_type[1])
160+
opener = build_opener(HTTPCookieProcessor(CookieJar()))
161+
f = opener.open(url)
162+
try:
163+
part.set_payload(f.read())
164+
finally:
165+
f.close()
166+
167+
Encoders.encode_base64(part)
168+
part.add_header('Content-Disposition', 'attachment; filename="%s"' % filename)
169+
170+
message.attach(part)
171+
172+
151173
########################################################################
152174
class FormatHtml(object):
153175
def __init__(self):
@@ -397,12 +419,13 @@ def format_output(fmt):
397419
parser.add_argument('--to', type=str, dest='recipient', action='store', metavar='RECIPIENT', help='email recipient')
398420
parser.add_argument('--from', type=str, dest='sender', action='store', metavar='SENDER', help='email sender')
399421
parser.add_argument('--subject', type=str, default='Foodcoop-Bestellung KW %s' % datetime.now().isocalendar()[1], metavar='SUBJECT', action='store', help='email subject')
422+
parser.add_argument('--attach', action='store_true', help='attach original spreadsheet to email')
400423

401424
args = parser.parse_args()
402425

403426
if args.mail:
404-
if args.recipient is None or args.sender is None or args.subject is None:
405-
parser.error('Missing required --to/--from/--subject.')
427+
if args.recipient is None or args.sender is None:
428+
parser.error('Missing required --to/--from.')
406429

407430
if args.html:
408431
if args.mail:
@@ -430,32 +453,39 @@ def format_output(fmt):
430453
#email.Charset.add_charset('utf-8', email.Charset.QP, email.Charset.QP, 'utf-8')
431454
email.Charset.add_charset('utf-8', 'utf-8', 'utf-8', 'utf-8')
432455

433-
multipart = MIMEMultipart('alternative')
456+
multipart_root = MIMEMultipart('mixed')
457+
multipart_alternative = MIMEMultipart('alternative')
434458

435459
if all(ord(c) < 128 for c in args.sender):
436-
multipart['From'] = Header(args.sender)
460+
multipart_root['From'] = Header(args.sender)
437461
else:
438-
multipart['From'] = Header(args.sender, 'UTF-8').encode()
462+
multipart_root['From'] = Header(args.sender, 'UTF-8').encode()
439463

440464
if all(ord(c) < 128 for c in args.recipient):
441-
multipart['To'] = Header(args.recipient)
465+
multipart_root['To'] = Header(args.recipient)
442466
else:
443-
multipart['To'] = Header(args.recipient, 'UTF-8').encode()
467+
multipart_root['To'] = Header(args.recipient, 'UTF-8').encode()
444468

445469
if all(ord(c) < 128 for c in args.subject):
446-
multipart['Subject'] = Header(args.subject)
470+
multipart_root['Subject'] = Header(args.subject)
447471
else:
448-
multipart['Subject'] = Header(args.subject, 'UTF-8').encode()
472+
multipart_root['Subject'] = Header(args.subject, 'UTF-8').encode()
449473

450474
if args.html:
451-
multipart.attach(MIMEText(out_plain.out, 'plain', 'UTF-8'))
452-
multipart.attach(MIMEText(out_html.out, 'html', 'UTF-8'))
475+
multipart_alternative.attach(MIMEText(out_plain.out, 'plain', 'UTF-8'))
476+
multipart_alternative.attach(MIMEText(out_html.out, 'html', 'UTF-8'))
453477
else:
454-
multipart.attach(MIMEText(out.out, 'plain', 'UTF-8'))
478+
multipart_alternative.attach(MIMEText(out.out, 'plain', 'UTF-8'))
455479

480+
481+
multipart_root.attach(multipart_alternative)
482+
483+
if args.attach:
484+
attach_spreadsheet(multipart_root, filename='foodcoop-kw%d.ods' % datetime.now().isocalendar()[1])
485+
456486
io = StringIO.StringIO()
457487
g = Generator(io, False)
458-
g.flatten(multipart)
488+
g.flatten(multipart_root)
459489

460490
print(io.getvalue())
461491

0 commit comments

Comments
 (0)