From a15c9f88239064261a4fb2e3e15e69e944c9d9ef Mon Sep 17 00:00:00 2001 From: "@kracekumar" Date: Mon, 23 Dec 2013 17:05:22 +0530 Subject: [PATCH 01/11] Added migration file --- .../11fb55be6e62_added_campaign_model.py | 55 +++++++++++++++++++ hacknight/models/__init__.py | 1 + hacknight/models/user.py | 1 + 3 files changed, 57 insertions(+) create mode 100644 alembic/versions/11fb55be6e62_added_campaign_model.py diff --git a/alembic/versions/11fb55be6e62_added_campaign_model.py b/alembic/versions/11fb55be6e62_added_campaign_model.py new file mode 100644 index 0000000..defe722 --- /dev/null +++ b/alembic/versions/11fb55be6e62_added_campaign_model.py @@ -0,0 +1,55 @@ +"""Added campaign model + +Revision ID: 11fb55be6e62 +Revises: 155bdd6d893d +Create Date: 2013-12-23 15:37:54.560976 + +""" + +# revision identifiers, used by Alembic. +revision = '11fb55be6e62' +down_revision = '155bdd6d893d' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('user', sa.Column('send_newsletter', sa.Boolean(), nullable=False, server_default=sa.text(u"'t'"))) + + op.alter_column('user', 'send_newsletter', server_default=None) + + # Create a new table email_campaign + op.create_table('email_campaign', + sa.Column('id', sa.Integer, nullable=False, primary_key=True), + sa.Column('event_id', sa.Integer, nullable=False), + sa.Column('start_datetime', sa.DateTime, nullable=False), + sa.Column('end_datetime', sa.DateTime, nullable=True), + sa.Column('name', sa.Unicode(250), nullable=False, unique=True), + sa.Column('title', sa.Unicode(250), nullable=False), + sa.Column('created_at', sa.DateTime, nullable=False), + sa.Column('updated_at', sa.DateTime, nullable=False), + ) + op.create_foreign_key("fk_email_campaign_event_id", "email_campaign", "event", ["event_id"], ["id"], ondelete="CASCADE") + + # Create a new table email_campaign_user + op.create_table('email_campaign_user', + sa.Column('id', sa.Integer, nullable=False, primary_key=True), + sa.Column('user_id', sa.Integer, nullable=False), + sa.Column('email_campaign_id', sa.Integer, nullable=False), + sa.Column('created_at', sa.DateTime, nullable=False), + sa.Column('updated_at', sa.DateTime, nullable=False), + ) + op.create_foreign_key("fk_email_campaign_user_user_id", "email_campaign_user", "user", ["user_id"], ["id"], ondelete="CASCADE") + op.create_foreign_key("fk_email_campaign_user_email_campaign_id", "email_campaign_user", "email_campaign", ["email_campaign_id"], ["id"], ondelete="CASCADE") + + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user', 'send_newsletter') + op.drop_table('email_campaign_user') + op.drop_table('email_campaign') + ### end Alembic commands ### diff --git a/hacknight/models/__init__.py b/hacknight/models/__init__.py index daebcb6..76f7aeb 100644 --- a/hacknight/models/__init__.py +++ b/hacknight/models/__init__.py @@ -12,3 +12,4 @@ from hacknight.models.project import * from hacknight.models.participant import * from hacknight.models.sponsor import * +from hacknight.models.campaign import * diff --git a/hacknight/models/user.py b/hacknight/models/user.py index b757a22..ddfd857 100644 --- a/hacknight/models/user.py +++ b/hacknight/models/user.py @@ -14,6 +14,7 @@ class User(UserBase, db.Model): phone_no = db.Column(db.Unicode(15), default=u'', nullable=True) job_title = db.Column(db.Unicode(120), default=u'', nullable=True) company = db.Column(db.Unicode(1200), default=u'', nullable=True) + #send_newsletter = db.Column(db.Boolean, default=True, nullable=False) @property def profile_url(self): From 6b3bc864975cf0272e8236a35e0f2279619c4851 Mon Sep 17 00:00:00 2001 From: "@kracekumar" Date: Mon, 23 Dec 2013 18:10:30 +0530 Subject: [PATCH 02/11] Added News letter form --- alembic/versions/11fb55be6e62_added_campaign_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/alembic/versions/11fb55be6e62_added_campaign_model.py b/alembic/versions/11fb55be6e62_added_campaign_model.py index defe722..57c7ed9 100644 --- a/alembic/versions/11fb55be6e62_added_campaign_model.py +++ b/alembic/versions/11fb55be6e62_added_campaign_model.py @@ -20,7 +20,7 @@ def upgrade(): op.alter_column('user', 'send_newsletter', server_default=None) - # Create a new table email_campaign + # Create a new table for email_campaign op.create_table('email_campaign', sa.Column('id', sa.Integer, nullable=False, primary_key=True), sa.Column('event_id', sa.Integer, nullable=False), @@ -33,7 +33,7 @@ def upgrade(): ) op.create_foreign_key("fk_email_campaign_event_id", "email_campaign", "event", ["event_id"], ["id"], ondelete="CASCADE") - # Create a new table email_campaign_user + # Create a new table for email_campaign_user op.create_table('email_campaign_user', sa.Column('id', sa.Integer, nullable=False, primary_key=True), sa.Column('user_id', sa.Integer, nullable=False), From 0f388502b2d32a81227ea44fdfed0dcf37856518 Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Sat, 28 Dec 2013 19:44:03 +0530 Subject: [PATCH 03/11] v1 cron job (changed git author) --- hacknight/forms/profile.py | 6 +- hacknight/models/campaign.py | 28 ++++++++ hacknight/models/event.py | 2 + hacknight/models/user.py | 6 +- hacknight/templates/send_newsletter.html | 7 ++ hacknight/views/profile.py | 26 ++++++- send_newsletter.py | 87 ++++++++++++++++++++++++ 7 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 hacknight/models/campaign.py create mode 100644 hacknight/templates/send_newsletter.html create mode 100644 send_newsletter.py diff --git a/hacknight/forms/profile.py b/hacknight/forms/profile.py index 7217874..76755c3 100644 --- a/hacknight/forms/profile.py +++ b/hacknight/forms/profile.py @@ -3,10 +3,14 @@ import wtforms from baseframe.forms import Form, RichTextField -__all__ = ['ProfileForm'] +__all__ = ['ProfileForm', 'NewsLetterForm'] class ProfileForm(Form): type = wtforms.SelectField(u"Profile type", coerce=int, validators=[wtforms.validators.Required()]) description = RichTextField(u"Description/Bio", content_css="/static/css/editor.css") + + +class NewsLetterForm(Form): + send_newsletter = wtforms.BooleanField("Send NewsLetter", description="Do you want to receive notification about new hacknight?") diff --git a/hacknight/models/campaign.py b/hacknight/models/campaign.py new file mode 100644 index 0000000..975d1e0 --- /dev/null +++ b/hacknight/models/campaign.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +import datetime +from hacknight.models import db, BaseNameMixin, BaseMixin, Event, User + + +class EmailCampaign(BaseNameMixin, db.Model): + __tablename__ = "email_campaign" + + event_id = db.Column(None, db.ForeignKey('event.id'), nullable=False) + event = db.relationship(Event) + start_datetime = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) + end_datetime = db.Column(db.DateTime, nullable=True) + + @classmethod + def sent_for(cls, event): + if cls.query.filter_by(event=event).first(): + return True + return False + + +class EmailCampaignUser(BaseMixin, db.Model): + __tablename__ = "email_campaign_user" + + user_id = db.Column(None, db.ForeignKey('user.id'), nullable=False) + user = db.relationship(User) + email_campaign_id = db.Column(None, db.ForeignKey('email_campaign.id'), nullable=False) + email_campaign = db.relationship(EmailCampaign, backref=db.backref('users', cascade='all, delete-orphan')) diff --git a/hacknight/models/event.py b/hacknight/models/event.py index 37093ff..8aa19d3 100644 --- a/hacknight/models/event.py +++ b/hacknight/models/event.py @@ -64,6 +64,8 @@ def url_for(self, action='view', _external=True): return url_for('profile_view', profile=self.name, _external=_external) elif action == 'new-event': return url_for('event_new', profile=self.name, _external=_external) + elif action == 'unsubscribe': + return url_for('profile_settings', action='unsubscribe', profile=self.name, _external=_external) class Event(BaseScopedNameMixin, db.Model): diff --git a/hacknight/models/user.py b/hacknight/models/user.py index ddfd857..d8a6be5 100644 --- a/hacknight/models/user.py +++ b/hacknight/models/user.py @@ -14,7 +14,7 @@ class User(UserBase, db.Model): phone_no = db.Column(db.Unicode(15), default=u'', nullable=True) job_title = db.Column(db.Unicode(120), default=u'', nullable=True) company = db.Column(db.Unicode(1200), default=u'', nullable=True) - #send_newsletter = db.Column(db.Boolean, default=True, nullable=False) + send_newsletter = db.Column(db.Boolean, default=True, nullable=False) @property def profile_url(self): @@ -29,6 +29,10 @@ def profiles(self): return [self.profile] + Profile.query.filter( Profile.userid.in_(self.organizations_owned_ids())).order_by('title').all() + @classmethod + def subscribed_to_newsletter(cls): + return cls.query.filter_by(send_newsletter=True).all() + def projects_in(self, event): return [member.project for member in self.project_memberships if member.project.event == event] diff --git a/hacknight/templates/send_newsletter.html b/hacknight/templates/send_newsletter.html new file mode 100644 index 0000000..544f4a8 --- /dev/null +++ b/hacknight/templates/send_newsletter.html @@ -0,0 +1,7 @@ +

+ You are receiving this mail because you registered for Hacknight newsletter. + Unsubscribe
+

{{ event.title }}

+ {{ event.description|safe }}
+ Join Hacknight +

diff --git a/hacknight/views/profile.py b/hacknight/views/profile.py index fbf821a..c300cdb 100644 --- a/hacknight/views/profile.py +++ b/hacknight/views/profile.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- -from flask import render_template, g, abort, flash +from flask import render_template, g, abort, flash, request from coaster.views import load_model from baseframe.forms import render_redirect, render_form from hacknight import app -from hacknight.models import db, Profile, User, Event +from hacknight.models import db, Profile, User, Event, PROFILE_TYPE from hacknight.models.event import profile_types -from hacknight.forms.profile import ProfileForm +from hacknight.forms.profile import ProfileForm, NewsLetterForm from hacknight.views.login import lastuser from hacknight.models.participant import Participant @@ -46,3 +46,23 @@ def profile_edit(profile): return render_redirect(profile.url_for(), code=303) return render_form(form=form, title=u"Edit profile", submit=u"Save", cancel_url=profile.url_for(), ajax=True) + + +@app.route('//settings', methods=['POST', 'GET']) +@lastuser.requires_login +@load_model(Profile, {'name': 'profile'}, 'profile') +def profile_settings(profile): + user = g.user + if not user.profile == profile: + return render_redirect(user.profile.url_for('unsubscribe')) + form = NewsLetterForm(obj=user) + action = request.args.get('action') + if action == "unsubscribe": + form.send_newsletter.data = False + if form.validate_on_submit(): + form.populate_obj(user) + db.session.commit() + flash(u"Newsletter preference for '{fullname}' is saved".format(fullname=user.fullname), 'success') + return render_redirect(profile.url_for(), code=303) + return render_form(form=form, title=u"Settings", submit=u"Save", + cancel_url=profile.url_for(), ajax=False) diff --git a/send_newsletter.py b/send_newsletter.py new file mode 100644 index 0000000..63ae3d7 --- /dev/null +++ b/send_newsletter.py @@ -0,0 +1,87 @@ +#! /usr/bin/env python + +import datetime +import sys +import logging + +from jinja2 import Environment, PackageLoader, TemplateNotFound +from html2text import html2text + +from hacknight import app, init_for +from hacknight.models import EmailCampaign, EmailCampaignUser, Event, User, db +from hacknight.views.event import send_email + + +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + +logger = logging.getLogger('send_newsletter') +logger.setLevel(logging.INFO) + +fh = logging.FileHandler('send_newsletter.log') +fh.setLevel(logging.INFO) +fh.setFormatter(formatter) +logger.addHandler(fh) + +# Jinja2 template for newsletter + +env = Environment(loader=PackageLoader('hacknight', 'templates')) + + +def get_template(name='send_newsletter.html'): + try: + template = env.get_template(name) + return template + except TemplateNotFound, e: + logger.error(e) + return u'' + + +def send_emails(event, email_campaign): + sender = User.query.filter_by(userid=event.profile.userid).first() + # We need request context to generate event url. + ctx = app.test_request_context('/') + ctx.push() + count = 0 + for user in User.subscribed_to_newsletter(): + if user.send_newsletter and user.email and user.email != sender.email: + subject = u"New Hacknight {0}".format(event.title) + template = get_template() + html = template.render(user=user, event=event) + if html: + text = html2text(html) + send_email(sender=(sender.fullname, sender.email), to=user.email, + subject=subject, body=text, html=html) + email_campaign_user = EmailCampaignUser(user=user, email_campaign=email_campaign) + db.session.add(email_campaign_user) + db.session.commit() + count += 1 + else: + logger.info(u"Unable to load template.") + break + logger.info(u"Email campaign completed for {0} users.".format(count)) + + +def main(): + try: + future_events = Event.upcoming_events() + for event in future_events: + if not EmailCampaign.sent_for(event): + start_datetime = datetime.datetime.now() + name = u'-'.join(["Newsletter campaign", event.title]) + email_campaign = EmailCampaign(name=name, title=name, start_datetime=start_datetime, event=event) + db.session.add(email_campaign) + db.session.commit() + send_emails(event, email_campaign) + email_campaign.end_datetime = datetime.datetime.now() + db.session.commit() + except Exception, e: + logger.exception(e) + + +if __name__ == "__main__": + if len(sys.argv) >= 2: + init_for(sys.argv[1]) + main() + else: + print("Missing parameter") + print("python send_newsletter.py [development|production]") From f6125952f06ece7f06c5c2eed5441c4207d3d351 Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 15:33:29 +0530 Subject: [PATCH 04/11] Add status to campaign (changed git author) --- .../11fb55be6e62_added_campaign_model.py | 1 + hacknight/models/campaign.py | 23 ++++++++++++++++--- send_newsletter.py | 13 +++++++---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/alembic/versions/11fb55be6e62_added_campaign_model.py b/alembic/versions/11fb55be6e62_added_campaign_model.py index 57c7ed9..fbdd7fa 100644 --- a/alembic/versions/11fb55be6e62_added_campaign_model.py +++ b/alembic/versions/11fb55be6e62_added_campaign_model.py @@ -24,6 +24,7 @@ def upgrade(): op.create_table('email_campaign', sa.Column('id', sa.Integer, nullable=False, primary_key=True), sa.Column('event_id', sa.Integer, nullable=False), + sa.Column('status', sa.Integer, nullable=False), sa.Column('start_datetime', sa.DateTime, nullable=False), sa.Column('end_datetime', sa.DateTime, nullable=True), sa.Column('name', sa.Unicode(250), nullable=False, unique=True), diff --git a/hacknight/models/campaign.py b/hacknight/models/campaign.py index 975d1e0..088eb01 100644 --- a/hacknight/models/campaign.py +++ b/hacknight/models/campaign.py @@ -4,6 +4,11 @@ from hacknight.models import db, BaseNameMixin, BaseMixin, Event, User +class EMAIL_CAMPAIGN_STATUS: + COMPLETED = 1 + PROGRESS = 2 + + class EmailCampaign(BaseNameMixin, db.Model): __tablename__ = "email_campaign" @@ -11,12 +16,24 @@ class EmailCampaign(BaseNameMixin, db.Model): event = db.relationship(Event) start_datetime = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) end_datetime = db.Column(db.DateTime, nullable=True) + status = db.Column(db.Integer, default=EMAIL_CAMPAIGN_STATUS.PROGRESS, nullable=False) + + @classmethod + def get(cls, event): + return cls.query.filter_by(event=event).first() @classmethod def sent_for(cls, event): - if cls.query.filter_by(event=event).first(): - return True - return False + email_campaign = cls.get(event=event) + if email_campaign: + if email_campaign.status == EMAIL_CAMPAIGN_STATUS.COMPLETED: + return True + return False + else: + return False + + def yet_to_send(self): + return set(User.subscribed_to_newsletter()) - set(self.users) class EmailCampaignUser(BaseMixin, db.Model): diff --git a/send_newsletter.py b/send_newsletter.py index 63ae3d7..97c59bc 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -8,7 +8,7 @@ from html2text import html2text from hacknight import app, init_for -from hacknight.models import EmailCampaign, EmailCampaignUser, Event, User, db +from hacknight.models import EmailCampaign, EmailCampaignUser, EMAIL_CAMPAIGN_STATUS, Event, User, db from hacknight.views.event import send_email @@ -42,7 +42,7 @@ def send_emails(event, email_campaign): ctx = app.test_request_context('/') ctx.push() count = 0 - for user in User.subscribed_to_newsletter(): + for user in email_campaign.yet_to_send(): if user.send_newsletter and user.email and user.email != sender.email: subject = u"New Hacknight {0}".format(event.title) template = get_template() @@ -68,11 +68,14 @@ def main(): if not EmailCampaign.sent_for(event): start_datetime = datetime.datetime.now() name = u'-'.join(["Newsletter campaign", event.title]) - email_campaign = EmailCampaign(name=name, title=name, start_datetime=start_datetime, event=event) - db.session.add(email_campaign) - db.session.commit() + email_campaign = EmailCampaign.get(event) + if not email_campaign: + email_campaign = EmailCampaign(name=name, title=name, start_datetime=start_datetime, event=event) + db.session.add(email_campaign) + db.session.commit() send_emails(event, email_campaign) email_campaign.end_datetime = datetime.datetime.now() + email_campaign.status = EMAIL_CAMPAIGN_STATUS.COMPLETED db.session.commit() except Exception, e: logger.exception(e) From 34ff11ddd05c41678981884e1f77ad437d3e1c8e Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 15:45:39 +0530 Subject: [PATCH 05/11] Return None --- send_newsletter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/send_newsletter.py b/send_newsletter.py index 97c59bc..eb25851 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -33,7 +33,7 @@ def get_template(name='send_newsletter.html'): return template except TemplateNotFound, e: logger.error(e) - return u'' + return None def send_emails(event, email_campaign): From 20f53398d587fcd51abee40b1ef65b37fd08e61a Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 15:57:57 +0530 Subject: [PATCH 06/11] Deleted extra comment --- send_newsletter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/send_newsletter.py b/send_newsletter.py index eb25851..0c90cfb 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -23,7 +23,6 @@ logger.addHandler(fh) # Jinja2 template for newsletter - env = Environment(loader=PackageLoader('hacknight', 'templates')) From e5ef08dc8c73e09ea681d726d20eaeecafc1aeb1 Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 16:10:40 +0530 Subject: [PATCH 07/11] Extra line --- send_newsletter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/send_newsletter.py b/send_newsletter.py index 0c90cfb..5f3ee06 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -22,6 +22,7 @@ fh.setFormatter(formatter) logger.addHandler(fh) + # Jinja2 template for newsletter env = Environment(loader=PackageLoader('hacknight', 'templates')) From fd946e4f2004eb3bf84f29001348751073fbfcbf Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 18:36:01 +0530 Subject: [PATCH 08/11] Refactor --- hacknight/forms/profile.py | 2 +- hacknight/models/campaign.py | 5 ++--- hacknight/models/event.py | 2 ++ hacknight/views/profile.py | 2 +- send_newsletter.py | 7 ++++--- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/hacknight/forms/profile.py b/hacknight/forms/profile.py index 76755c3..05847c6 100644 --- a/hacknight/forms/profile.py +++ b/hacknight/forms/profile.py @@ -13,4 +13,4 @@ class ProfileForm(Form): class NewsLetterForm(Form): - send_newsletter = wtforms.BooleanField("Send NewsLetter", description="Do you want to receive notification about new hacknight?") + send_newsletter = wtforms.BooleanField("Receive NewsLetter", description="Do you want to receive notification about new hacknight?") diff --git a/hacknight/models/campaign.py b/hacknight/models/campaign.py index 088eb01..c5ece2f 100644 --- a/hacknight/models/campaign.py +++ b/hacknight/models/campaign.py @@ -29,11 +29,10 @@ def sent_for(cls, event): if email_campaign.status == EMAIL_CAMPAIGN_STATUS.COMPLETED: return True return False - else: - return False + return False def yet_to_send(self): - return set(User.subscribed_to_newsletter()) - set(self.users) + return set(User.subscribed_to_newsletter()) - set([user.user for user in self.users]) class EmailCampaignUser(BaseMixin, db.Model): diff --git a/hacknight/models/event.py b/hacknight/models/event.py index 8aa19d3..0b6182c 100644 --- a/hacknight/models/event.py +++ b/hacknight/models/event.py @@ -64,6 +64,8 @@ def url_for(self, action='view', _external=True): return url_for('profile_view', profile=self.name, _external=_external) elif action == 'new-event': return url_for('event_new', profile=self.name, _external=_external) + elif action == 'settings': + return url_for('profile_settings', profile=self.name, _external=_external) elif action == 'unsubscribe': return url_for('profile_settings', action='unsubscribe', profile=self.name, _external=_external) diff --git a/hacknight/views/profile.py b/hacknight/views/profile.py index c300cdb..d19e92d 100644 --- a/hacknight/views/profile.py +++ b/hacknight/views/profile.py @@ -54,7 +54,7 @@ def profile_edit(profile): def profile_settings(profile): user = g.user if not user.profile == profile: - return render_redirect(user.profile.url_for('unsubscribe')) + return render_redirect(user.profile.url_for('settings')) form = NewsLetterForm(obj=user) action = request.args.get('action') if action == "unsubscribe": diff --git a/send_newsletter.py b/send_newsletter.py index 5f3ee06..20e7b6a 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -56,7 +56,7 @@ def send_emails(event, email_campaign): db.session.commit() count += 1 else: - logger.info(u"Unable to load template.") + logger.error(u"No HMTL found for {title}.".format(event.title)) break logger.info(u"Email campaign completed for {0} users.".format(count)) @@ -65,11 +65,12 @@ def main(): try: future_events = Event.upcoming_events() for event in future_events: + email_campaign = EmailCampaign.get(event) if not EmailCampaign.sent_for(event): - start_datetime = datetime.datetime.now() - name = u'-'.join(["Newsletter campaign", event.title]) email_campaign = EmailCampaign.get(event) if not email_campaign: + name = u'-'.join(["Newsletter campaign", event.title]) + start_datetime = datetime.datetime.now() email_campaign = EmailCampaign(name=name, title=name, start_datetime=start_datetime, event=event) db.session.add(email_campaign) db.session.commit() From 4d2903c4f8ee08739fef3610aef357865fbc83fc Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 18:51:39 +0530 Subject: [PATCH 09/11] Better check conditions --- hacknight/forms/profile.py | 2 +- hacknight/models/campaign.py | 1 - send_newsletter.py | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hacknight/forms/profile.py b/hacknight/forms/profile.py index 05847c6..10169aa 100644 --- a/hacknight/forms/profile.py +++ b/hacknight/forms/profile.py @@ -13,4 +13,4 @@ class ProfileForm(Form): class NewsLetterForm(Form): - send_newsletter = wtforms.BooleanField("Receive NewsLetter", description="Do you want to receive notification about new hacknight?") + send_newsletter = wtforms.BooleanField("Receive NewsLetter", description="Do you like to receive notification about new hacknight?") diff --git a/hacknight/models/campaign.py b/hacknight/models/campaign.py index c5ece2f..dc12095 100644 --- a/hacknight/models/campaign.py +++ b/hacknight/models/campaign.py @@ -28,7 +28,6 @@ def sent_for(cls, event): if email_campaign: if email_campaign.status == EMAIL_CAMPAIGN_STATUS.COMPLETED: return True - return False return False def yet_to_send(self): diff --git a/send_newsletter.py b/send_newsletter.py index 20e7b6a..5b11160 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -43,7 +43,7 @@ def send_emails(event, email_campaign): ctx.push() count = 0 for user in email_campaign.yet_to_send(): - if user.send_newsletter and user.email and user.email != sender.email: + if user.email: subject = u"New Hacknight {0}".format(event.title) template = get_template() html = template.render(user=user, event=event) @@ -88,4 +88,4 @@ def main(): main() else: print("Missing parameter") - print("python send_newsletter.py [development|production]") + print("Syntax: python send_newsletter.py [development|production]") From f20640a6d2190567bc01fe602df47c25cc440e36 Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 19:03:05 +0530 Subject: [PATCH 10/11] Unicode formatter --- send_newsletter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/send_newsletter.py b/send_newsletter.py index 5b11160..ddde2c3 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -12,7 +12,7 @@ from hacknight.views.event import send_email -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +formatter = logging.Formatter(u'%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger('send_newsletter') logger.setLevel(logging.INFO) From 427405d7e46ae7fd98c4876e1313c2368e80bd76 Mon Sep 17 00:00:00 2001 From: Kracekumar Ramaraju Date: Mon, 30 Dec 2013 19:06:59 +0530 Subject: [PATCH 11/11] Pop item in request context --- send_newsletter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/send_newsletter.py b/send_newsletter.py index ddde2c3..9c0d7c3 100644 --- a/send_newsletter.py +++ b/send_newsletter.py @@ -59,6 +59,7 @@ def send_emails(event, email_campaign): logger.error(u"No HMTL found for {title}.".format(event.title)) break logger.info(u"Email campaign completed for {0} users.".format(count)) + ctx.pop() def main():