From d295c421226c01eadb38100eb0b4cf4b40f9a338 Mon Sep 17 00:00:00 2001 From: b3yond Date: Sat, 8 Sep 2018 11:14:00 +0200 Subject: [PATCH] finished #23 code. rw city page info display. Unsubscribe = Delete --- active_bots/mailbot.py | 2 -- db.py | 7 ++++--- frontend.py | 29 +++++++++++++++++++---------- template/city.tpl | 8 ++++++++ template/mail.tpl | 9 +++++---- template/propaganda.tpl | 26 +++++++++++++++++--------- template/settings.tpl | 40 ++++++++++++++++++++++++++++++---------- user.py | 37 +++++++++++++++++++++++++++++++------ 8 files changed, 114 insertions(+), 44 deletions(-) diff --git a/active_bots/mailbot.py b/active_bots/mailbot.py index 40285ed..f51fb26 100644 --- a/active_bots/mailbot.py +++ b/active_bots/mailbot.py @@ -27,13 +27,11 @@ class Mailbot(Bot): # post/boost Report object def post(self, user, report): recipients = user.get_mailinglist() - print(recipients) # debug for rec in recipients: rec = rec[0] unsubscribe_text = "\n_______\nYou don't want to receive those messages? Unsubscribe with this link: " body = report.text + unsubscribe_text + config['web']['host'] + "/city/mail/unsubscribe/" \ + db.mail_subscription_token(rec, user.get_city()) - print(body) # debug if report.author != rec: try: sendmail.sendmail(rec, "Ticketfrei " + user.get_city() + diff --git a/db.py b/db.py index d8f1e53..c379a0f 100644 --- a/db.py +++ b/db.py @@ -119,7 +119,6 @@ class DB(object): id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, user_id INTEGER, email TEXT, - active INTEGER, FOREIGN KEY(user_id) REFERENCES user(id) ); CREATE TABLE IF NOT EXISTS seen_mail ( @@ -133,6 +132,7 @@ class DB(object): user_id INTEGER, city TEXT, markdown TEXT, + mail_md TEXT, masto_link TEXT, twit_link TEXT, FOREIGN KEY(user_id) REFERENCES user(id), @@ -264,13 +264,14 @@ u\d\d? return User(uid) def user_facing_properties(self, city): - self.execute("""SELECT city, markdown, masto_link, twit_link + self.execute("""SELECT city, markdown, mail_md, masto_link, twit_link FROM cities WHERE city=?;""", (city, )) try: - city, markdown, masto_link, twit_link = self.cur.fetchone() + city, markdown, mail_md, masto_link, twit_link = self.cur.fetchone() return dict(city=city, markdown=markdown, + mail_md=mail_md, masto_link=masto_link, twit_link=twit_link, mailinglist=city + "@" + config["web"]["host"]) diff --git a/frontend.py b/frontend.py index 79a0a4b..d3bf26f 100755 --- a/frontend.py +++ b/frontend.py @@ -9,6 +9,7 @@ from sendmail import sendmail from session import SessionPlugin from mastodon import Mastodon + def url(route): return '%s://%s/%s' % ( request.urlparts.scheme, @@ -78,13 +79,14 @@ def login_post(): @get('/city/') -@view('template/city.tpl') -def city_page(city): +def city_page(city, info=None): citydict = db.user_facing_properties(city) if citydict is not None: - return citydict - redirect('/') - return dict(info='There is no Ticketfrei bot in your city yet. Create one yourself!') + citydict['info'] = info + return bottle.template('template/city.tpl', **citydict) + return bottle.template('template/propaganda.tpl', + **dict(info='There is no Ticketfrei bot in your city' + ' yet. Create one yourself!')) @get('/city/mail/') @@ -102,25 +104,26 @@ def subscribe_mail(city): print(confirm_link) # only for local testing # send mail with code to email sendmail(email, "Subscribe to Ticketfrei " + city + " Mail Notifications", - body="To subscribe to the mail notifications for Ticketfrei " + city + ", click on this link: " + token) + body="To subscribe to the mail notifications for Ticketfrei " + + city + ", click on this link: " + token) + return city_page(city, info="Thanks! You will receive a confirmation mail.") @get('/city/mail/confirm/') -@view('template/city.tpl') def confirm_subscribe(token): email, city = db.confirm_subscription(token) user = db.by_city(city) user.add_subscriber(email) - redirect('/city/' + city) + return city_page(city, info="Thanks for subscribing to mail notifications!") @get('/city/mail/unsubscribe/') -@view('template/mail.tpl') def unsubscribe(token): email, city = db.confirm_subscription(token) user = db.by_city(city) user.remove_subscriber(email) - redirect('/city/' + city) + return city_page(city, info="You successfully unsubscribed " + email + + " from the mail notifications.") @get('/settings') @@ -136,6 +139,12 @@ def update_markdown(user): return user.state() +@post('/settings/mail_md') +@view('template/settings.tpl') +def update_mail_md(user): + user.set_mail_md(request.forms['mail_md']) + return user.state() + @post('/settings/goodlist') @view('template/settings.tpl') def update_trigger_patterns(user): diff --git a/template/city.tpl b/template/city.tpl index 7953c52..5613168 100644 --- a/template/city.tpl +++ b/template/city.tpl @@ -6,4 +6,12 @@ import markdown as md html = md.markdown(markdown) %> +% if info is not None: +
+
+

{{!info}}

+
+
+% end + {{!html}} diff --git a/template/mail.tpl b/template/mail.tpl index 66c0e86..58b58e9 100644 --- a/template/mail.tpl +++ b/template/mail.tpl @@ -3,13 +3,14 @@ <% import markdown as md -html = md.markdown(markdown) +html = md.markdown(mail_md) %> +{{!html}} +
- - -{{!html}} +
+

Back to Ticketfrei {{!city}} overview

diff --git a/template/propaganda.tpl b/template/propaganda.tpl index 4a3b034..0aafcbf 100644 --- a/template/propaganda.tpl +++ b/template/propaganda.tpl @@ -1,4 +1,12 @@ % rebase('template/wrapper.tpl') +% if defined('info'): +
+
+

{{!info}}

+
+
+
+% end % include('template/login-plain.tpl')

Features

@@ -42,17 +50,17 @@ reclaim public transportation.

- On short term we want to do this by helping users to avoid - controllers and fines - on long term by pressuring public - transportation companies to offer their services free of - charge, financed by the public. + On short term we want to do this by helping users to avoid + controllers and fines - on long term by pressuring public + transportation companies to offer their services free of + charge, financed by the public.

- Because with Ticketfrei you're able to use trains and - subways for free anyway. Take part and create a new + Because with Ticketfrei you're able to use trains and + subways for free anyway. Take part and create a new understanding of what public transportation should look like!

- - - + + + diff --git a/template/settings.tpl b/template/settings.tpl index 56a4c5d..acc2b5e 100644 --- a/template/settings.tpl +++ b/template/settings.tpl @@ -87,14 +87,16 @@

Edit your city page

- With your bot, we generated you a page, which you can use for promotion: Ticketfrei {{city}} You can change what your users will read there, and adjust it to your + With your bot, we generated you a page, which you can use for promotion: + Ticketfrei {{city}} You + can change what your users will read there, and adjust it to your needs.

You should definitely adjust the Social Media profile links. - Also consider adding this link to the text: Link to the mail subscription page. - Your readers can use this to subscribe to mail notifications. + Also consider adding this link to the text: Link to the mail subscription page. Your readers + can use this to subscribe to mail notifications.

So this is the default text we suggest: @@ -105,12 +107,30 @@

+
+

Edit your mail subscription page

+

+ There is also a page where users can subscribe to mail notifications: + Ticketfrei {{city}}. + You can change what your users will read there, and adjust it to your + needs. +

+

+ So this is the default text we suggest: +

+
+ + +
+
+

Edit your trigger patterns

- These words have to be contained in a report. - If none of these expressions is in the report, it will be ignored by the bot. - You can use the defaults, or enter some expressions specific to your city and language. + These words have to be contained in a report. If none of these + expressions is in the report, it will be ignored by the bot. You can + use the defaults, or enter some expressions specific to your city and + language.

@@ -122,9 +142,9 @@

Edit the blacklist

- These words are not allowed in reports. - If you encounter spam, you can add more here - the bot will ignore reports which use such words. - + These words are not allowed in reports. If you encounter spam, you can + add more here - the bot will ignore reports which use such words. + diff --git a/user.py b/user.py index 0d6ab0b..c5be91c 100644 --- a/user.py +++ b/user.py @@ -140,7 +140,7 @@ schlitz db.commit() def get_mailinglist(self): - db.execute("SELECT email FROM mailinglist WHERE user_id = ? AND active = 1;", (self.uid, )) + db.execute("SELECT email FROM mailinglist WHERE user_id = ?;", (self.uid, )) return db.cur.fetchall() def get_seen_mail(self): @@ -163,11 +163,11 @@ schlitz return db.cur.fetchone()[0] def add_subscriber(self, email): - db.execute("INSERT INTO mailinglist(user_id, email, active) VALUES(?, ?, ?);", (self.uid, email, 1)) + db.execute("INSERT INTO mailinglist(user_id, email) VALUES(?, ?);", (self.uid, email)) db.commit() def remove_subscriber(self, email): - db.execute("UPDATE mailinglist SET active = 0 WHERE email = ? AND user_id = ?;", (email, self.uid)) + db.execute("DELETE FROM mailinglist WHERE email = ? AND user_id = ?;", (email, self.uid)) db.commit() def set_badwords(self, words): @@ -184,6 +184,7 @@ schlitz # necessary: # - city # - markdown + # - mail_md # - goodlist # - blacklist # - logged in with twitter? @@ -192,6 +193,7 @@ schlitz citydict = db.user_facing_properties(self.get_city()) return dict(city=citydict['city'], markdown=citydict['markdown'], + mail_md=citydict['mail_md'], triggerwords=self.get_trigger_words(), badwords=self.get_badwords(), enabled=self.enabled) @@ -251,6 +253,11 @@ schlitz (markdown, self.uid)) db.commit() + def set_mail_md(self, mail_md): + db.execute("UPDATE cities SET mail_md = ? WHERE user_id = ?;", + (mail_md, self.uid)) + db.commit() + def get_city(self): db.execute("SELECT city FROM cities WHERE user_id == ?;", (self.uid, )) return db.cur.fetchone()[0] @@ -351,7 +358,25 @@ sicher vor Zensur. Um Mastodon zu benutzen, besucht diese Seite: [https://joinmastodon.org/](https://joinmastodon.org/) """ - db.execute("""INSERT INTO cities(user_id, city, markdown, masto_link, - twit_link) VALUES(?,?,?,?,?)""", - (self.uid, city, markdown, masto_link, twit_link)) + mail_md = """# Immer up-to-date + +Du bist viel unterwegs und hast keine Lust, jedes Mal auf das Profil des Bots +zu schauen? Kein Problem. Unsere Mail Notifications benachrichtigen dich, wenn +irgendwo Kontis gesehen werden. + +Wenn du uns deine E-Mail-Adresse gibst, kriegst du bei jedem Konti-Report eine +Mail. Wenn du eine Mail-App auf dem Handy hast, so wie +[K9Mail](https://k9mail.github.io/), kriegst du sogar eine Push Notification. So +bist du immer Up-to-date über alles, was im Verkehrsnetz passiert. + +## Keine Sorge + +Wir benutzen deine E-Mail-Adresse selbstverständlich für nichts anderes. Du +kannst die Benachrichtigungen jederzeit deaktivieren, mit jeder Mail wird ein +unsubscribe-link mitgeschickt. + """ + db.execute("""INSERT INTO cities(user_id, city, markdown, mail_md, + masto_link, twit_link) VALUES(?,?,?,?,?,?)""", + (self.uid, city, markdown, mail_md, masto_link, twit_link)) db.commit() +