Beispiel #1
0
def send_email(to, subject, template, **kwargs):
    mail = Mail(app)
    msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
                  sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    mail.send(msg)
Beispiel #2
0
def send_message(subject, body, html=False, caps_gs_sem=False):
    from sync import app

    mail = Mail(app)

    if caps_gs_sem:
        recipients = CAPS_GS_SEM_RECIPIENTS
    else:
        recipients = ADMIN_RECIPIENTS
    msg = Message(subject=subject,
                  sender="*****@*****.**",
                  recipients=recipients)

    if html:
        msg.html = body
    else:
        msg.body = body

    try:
        mail.send(msg)
    except socket.error:
        print "failed to send message %s" % body
        return False

    return True
def adoptPuppyPage(puppy_id):
    """ Provides a page where adopters can adopt a puppy. """
    puppy = session.query(Puppy).filter_by(id=puppy_id).one()
    if request.method == 'POST':
        try:
            # Change the adopter_puppy field of adopter to reflect the puppy.
            adopter_id = int(request.form['adopterIDField'])
            adopter = session.query(Adopter).filter_by(id=adopter_id).one()
            adopter.adopted_puppy = puppy.id
            session.add(adopter)
            # Change the shelter id of the puppy to None since it has a home.
            puppy.shelter_id = None
            session.add(puppy)
            session.commit()
            # Create a mail instance for use with sending messages.
            mail = Mail(app)
            msg = Message("Hello Em, thanks for adopting %s" % puppy.name,
                    sender="*****@*****.**",
                    recipients=["*****@*****.**"])
            mail.send(msg)
            return redirect(url_for('puppyList'))
        except:
            print "The adoption process was unsuccessful."
            return redirect(url_for('puppyList'))
    else:
        return render_template('adopt_puppy.html', puppy=puppy)
Beispiel #4
0
def send_pdf_by_email(invoice_id):
    form = InvoiceEmail(request.form)

    if not form.validate():
        return form.errors_as_json()

    invoice = Invoice.find_by_id(invoice_id)
    if not invoice:
        return abort(404)

    message = Message(form.subject.data.encode('utf-8'), sender=(g.member.display, g.member.get_email().encode('utf-8')))
    message.add_recipient(sanitize_address((form.name.data, form.email.data)))
    message.body = form.message.data.encode('utf-8')

    invoice_key = amazons3.get_invoice(invoice)
    message.attach("Invoice_{0}.pdf".format(invoice.reference), "application/pdf", invoice_key.get_contents_as_string())

    mail = Mail()
    mail.init_app(current_app)
    mail.send(message)

    history = InvoiceHistory()
    history.description = 'Sent email to {0}'.format(message.recipients[0])
    history.pdf = invoice_key.key
    history.status = 'SENT'
    history.misc = "{0}\n\n{1}".format(message.subject, message.body)
    history.member_id = g.member.id
    history.invoice_id = invoice.id
    history.save()

    return 'sent', 200
Beispiel #5
0
def add_post_post():
    members = session.query(User).all()
    post = Post(
        title=request.form["title"],
        content=mistune.markdown(request.form["content"]),
        description = request.form["description"],
        author=current_user
    )
    session.add(post)
    session.commit()
    all_members = []
    for member in members:
        all_members.append(member.email)
    all_members = [str(i) for i in all_members]
    describe = request.form["description"] +".... View full message on TeamForum!"
    mail=Mail(app)
    with mail.connect() as conn:
      for email in all_members:
        message = Message(subject="A new forum has been created by "+ current_user.name,
                  body= describe,
                  sender=("TeamForum", "*****@*****.**"),
                  recipients=[email]
                 )

        conn.send(message)

    flash("You have created a new forum. Team members have been notified.", "info")
    return redirect(url_for("posts"))
def UserMail(user, passwd, smtp, smtp_port, smtp_tsl, smtp_auth, data):
    mail_user = user
    mail_passwd = passwd
    print "--- DEBUG ---"
    print "--- DEBUG ---"
    print data
    print "--- DEBUG ---"
    print "--- DEBUG ---"
    from_addr = user
    to_addr = ';'.join(data.get("from_mail"))
    print to_addr
    mail = Mail(current_app)
    current_app.config.update(
        MAIL_SERVER=smtp,
        MAIL_PORT=smtp_port,
        MAIL_USE_SSL=smtp_auth,
        MAIL_USE_TLS=smtp_tsl,
        MAIL_USERNAME=mail_user,
        MAIL_PASSWORD=mail_passwd
    )
    mail.init_app(current_app)
    msg = Message('Reztoran', sender=from_addr, recipients=to_addr.split(";"))
    msg.html = data.get("text")
    msg.subject = data.get('title')
    mail.send(msg)
    return "ok"
Beispiel #7
0
def test_send_email():
    mailForm= MailForm()
    if mailForm.validate_on_submit():#表单提交成功的判断
        try:
            app = Flask(__name__)
            app.config['SECRET_KEY'] = 'qiyeboy'
            #下面是SMTP服务器配置
            app.config['MAIL_SERVER'] = 'smtp.163.com' #电子邮件服务器的主机名或IP地址
            app.config['MAIL_PORT'] = '25' #电子邮件服务器的端口
            app.config['MAIL_USE_TLS'] = True #启用传输层安全
            app.config['MAIL_USERNAME'] ='******' #os.environ.get('MAIL_USERNAME') #邮件账户用户名
            app.config['MAIL_PASSWORD'] = '******'#os.environ.get('MAIL_PASSWORD') #邮件账户的密码

            mail = Mail(app)
            receiverName = mailForm.receiver.data #收件人文本框的内容
            styledata = mailForm.style.data#主题文本框的内容
            bodydata  = mailForm.body.data#正文文本框的内容
            msg = Message(styledata,sender='*****@*****.**',recipients=[receiverName])#发件人,收件人
            msg.body = bodydata
            # send_email('*****@*****.**','Test email-function',)
            mail.send(msg)
            flash('邮件发送成功!')#提示信息
            return redirect(url_for('.index'))
        except:
            flash('邮件发送失败!')
            return redirect(url_for('.index'))
    return render_template('testemail.html',form=mailForm,name ='*****@*****.**' )#渲染网页



# @main.route('/secret')
# @login_required
# def secret():
#     return 'Only authenticated users are allowed!'
def send_email(msg):
    from routes import app
    with app.app_context():
        mail = Mail()
        mail.init_app(current_app)
        print("hallo world")
        mail.send(msg)
Beispiel #9
0
def register():
    owner = "*****@*****.**"
    sysadmin = "*****@*****.**"

    name = request.form.get('name', None)
    email = request.form.get('email', None)
    institute = request.form.get('institute', None)
    message = request.form.get('message', None)
    
    app =Flask(__name__)
    mail=Mail(app)

    _subject = "[Multinet] Request Access Form: %s, %s" % ( name, email )
    
    #1.check if user exists, generate access url for user and save user to db
    _token = generate_id()
    udata = { "email" : email,"name" : name,"institute" : institute,"message" : message, "token": _token }
    
    ret = insert_user(udata)
    
    if not ret:
        return render_template('start.html',errors="This email address is already registered.")

    #2.send new user to admin
    try:
        msg = Message( subject=_subject , recipients=[ owner ], body=message, sender=sysadmin )
        mail.send(msg)
    except Exception,e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_tb(exc_traceback, limit=5, file=sys.stdout)
Beispiel #10
0
def sendConfirmation(app, teamEmail, html = None):
    if not configSet :
        setConfigOptions(app)
    mail = Mail(app)
    msg = Message(subject=_subject, sender=_mailDefaultSender, recipients=[teamEmail], bcc=[_mailDefaultSender])
    msg.body = getEmailTemplate()
    msg.html = html
    mail.send(msg)
Beispiel #11
0
def send_email(to,subject,template):
    mail = Mail(application)
    mail.init_app(application)
    msg = Message(
        subject,recipients = [to],
        html = template,
        sender = application.config['MAIL_USERNAME'])
    mail.send(msg)
Beispiel #12
0
def send_email(email, pdf):

    mail_ext = Mail(app)
    subject = "Phone Notes"
    receiver = "*****@*****.**"
    mail_to_be_sent = Message(subject=subject, recipients=[receiver])
    mail_to_be_sent.body = "This email contains PDF."
    mail_to_be_sent.attach("file.pdf", "application/pdf", pdf)
    mail_ext.send(mail_to_be_sent)
Beispiel #13
0
def count_words_at_url(url, mailAddress):
    resp = requests.get(url)
    result = len(resp.text.split())
    mail = Mail(current_app)
    msg = Message("test", recipients=["*****@*****.**"])
    msg.body = str(result)
    msg.add_recipient(str(mailAddress))
    mail.send(msg)
    return result
Beispiel #14
0
def send_email(subject, text):
    """ Send email """

    msg = Message(subject, sender='*****@*****.**',
                  recipients=['*****@*****.**'])
    msg.body = text

    mail = Mail(current_app)
    mail.send(msg)
Beispiel #15
0
def send(MessageClass, **kwargs):
    with app.test_request_context():
        mailer = Mail(app)
        mailer.send(MessageClass(**kwargs))

    if 'to' in kwargs:
        return "Mail type: %s, recipient: %s" % (MessageClass.desc(), kwargs['to'])

    return True
Beispiel #16
0
def mail():
    mail = Mail(app)
    dishes = reduce(
        operator.add,
        [d.dishes for d in db.session.query(Meal).all()])

    dishes_today = filter(
        lambda x: x.meal.date == datetime.date.today(),
        dishes)

    users = db.session.query(User).all()
    recipients_info = {}

    for user in users:
        if user.preference in dishes_today and user.email is not None:
            info = {
                "name": user.username,
                "dish": user.preference.dish_description,
                "date": user.preference.meal.date,
                "meal_type": user.preference.meal.mealtime.meal_type,
                "servery": user.preference.meal.mealtime.servery.name
            }

            recipients_info[user.email] = info

    with mail.connect() as conn:
        for email in recipients_info.keys():
            message = (
                "Hi, %s! \n Your favorite dish %s is available",
                "during %s at %s servery today.") % (
                recipients_info[email]["name"],
                recipients_info[email]["dish"],
                recipients_info[email]["meal_type"],
                recipients_info[email]["servery"])

            message_html = (
                "Hi, %s! <br> <br> Your favorite dish <b>%s</b> is ",
                "available during <b>%s</b> at <b>%s</b> servery today.") % (
                recipients_info[email]["name"],
                recipients_info[email]["dish"],
                recipients_info[email]["meal_type"],
                recipients_info[email]["servery"])

            subject = "Hi %s, your favorite food is available today!" % (
                recipients_info[email]["name"])

            msg = Message(
                sender=("Rice Servery App", "*****@*****.**"),
                recipients=[email],
                subject=subject)

            msg.body = message
            msg.html = message_html
            conn.send(msg)

    return "Mails sent!"
Beispiel #17
0
def send_async_email(app, msg, list_id, manager_id, uu):
    with app.app_context():
        try:
            OA_Email_Url(list_id, manager_id, uu, 0).add()
            db.session.commit()
            mail = Mail(app)
            mail.send(msg)
        except:
            # 回滚
            db.session.rollback()
            logger.exception("exception")
Beispiel #18
0
    def sender_email(traceback):
        from flask.ext.mail import Mail, Message

        mail = Mail(app)
        senders = app.config.get("SENDERS", [])
        if not senders:
            return
        msg = Message(subject=u"%s %s时遇到异常" % (request.method, request.url),
                      html=traceback.render_summary(),
                      sender="*****@*****.**",
                      recipients=senders)
        mail.send(msg)
Beispiel #19
0
def send_mail(subject, html, recipients):
    sender = app.config.get('MAILS_SENDER_NAME', 'BDR Help Desk')
    message = Message(subject=subject, recipients=recipients, html=html,
                      sender=sender)
    mail = Mail(app)
    try:
        mail.send(message)
        return True
    except smtplib.SMTPAuthenticationError:
        print('Wrong username/password. ' \
              'Please review their values in settings.py')
        return False
Beispiel #20
0
def email_scheduler(email_html):
    app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
    app.config['MAIL_PORT'] = 587
    app.config['MAIL_USE_TLS'] = True
    app.config['MAIL_USERNAME'] = '******'
    app.config['MAIL_PASSWORD'] = '******'

    mail = Mail(app)
    msg = Message(subject='Test Email Job Task Breakdown',
                  sender=app.config['FLASKY_MAIL_SENDER'],
                  recipients=recipent_list)
    msg.body = email_html
    mail.send(msg)
Beispiel #21
0
def mail_test():
    from flask.ext.mail import Mail, Message as Msg
    mail = Mail(app)
    msg = Msg('A test message', sender=app.config['MAIL_SENDER  '], recipients=['*****@*****.**'])
    msg.body = 'Hello and welcome!'
    msg.html = 'No html available'

    print 'Sending an email from '+app.config['MAIL_USERNAME']+ \
          ' on the server '+app.config['MAIL_SERVER']+':'+str(app.config['MAIL_PORT']) + \
          ' using: SSL - '+str(app.config['MAIL_USE_SSL'])+', TLS - '+str(app.config['MAIL_USE_TLS'])

    with(app.app_context()):
        mail.send(msg)
Beispiel #22
0
def send_mail(subject, recipients, html, attachment=False, **kwargs):
    sender = 'Eau de Web <%s>' % app.config.get('MAIL_USERNAME')
    message = Message(subject=subject, recipients=recipients, html=html,
                      sender=sender)
    if attachment:
        attach(message, **kwargs)
    mail = Mail(app)
    try:
        mail.send(message)
        return True
    except smtplib.SMTPAuthenticationError:
        print 'Wrong username/password. ' + \
              'Please review their values in settings.py'
        return False
def get_mail(app):
    mail = Mail()

    #app.secret_key = 'development key'

    app.config["MAIL_SERVER"] = "smtp.gmail.com"
    app.config['MAIL_USE_TLS'] = False
    app.config['MAIL_USE_SSL'] = True
    app.config['MAIL_PORT'] = 465
    app.config["MAIL_USERNAME"] = '******'
    app.config["MAIL_PASSWORD"] = '******'

    mail.init_app(app)

    return mail
Beispiel #24
0
def email_appkey(prj_id, member_email):
    memkey = ProjectMemberKey.find_one(prj_id=prj_id, member_email=member_email)
    if settings.MAIL_SERVER:
        mail = Mail(current_app._get_current_object())
        message = Message("Your new appkey for 4k mobile app",
            sender='*****@*****.**',
            recipients=[member_email])
        message.body = ( 'Project ID: %s \nAppkey: %s' % 
            (prj_id, memkey.appkey) )
        mail.send(message)
        flash("New appkey has been send to your email.", category='info')
    else:
        flash("Can not email because email server is not availalbe. " +  
            "Contact administrator", category='error')
            
    return redirect(url_for('.view_project', prj_id=prj_id))  
Beispiel #25
0
def send_email(user):
    from flask.ext.mail import Mail, Message
    mail = Mail(app)
    msg = Message("Gamma Computations Complete",
                  recipients=[user.email])
    msg.body = """A simulation has been completed by the Flask Gamma app. Please log in at

http://localhost:5000/login

to see the results.

---
This email has been automatically generated by the Gamma app created by
Parampool. If you don't want email notifications when a result is found, please
register a new user and leave the 'notify' field unchecked."""
    mail.send(msg)
 def post(self,evento_id): 
     invitado_id = request.form['invitado']
     adapter.crear_invitacion(evento_id,invitado_id)
     current_app.logger.info('El usuario '+ invitado_id + ' fue invitado con exito al evento ' + evento_id)
     user = adapter.get_user_by_id(invitado_id)
     #
     mail = Mail()
     mail.init_app(current_app)
     email.send_email(mail, current_app, "Arreglamos Eh", "*****@*****.**", [user.email], "Te han invitado a un evento", "<b>Mira!!, el usuario: " + current_user.username +  " Te han invitado a un evento</b></br><a href='http:\\glacial-scrubland-6807.herokuapp.com'>Ir a Arreglamos Eh</a>")
     #mail = Mail()
     #mail.init_app(current_app)
     #msg = Message("Arreglamos Eh", sender="*****@*****.**", recipients=[user.email])
     #msg.html = "<b>Mira!!, el usuario: " + current_user.username +  " Te han invitado a un evento</b>"
     #mail.send(msg)
     #
     return {'invitado': invitado_id}
Beispiel #27
0
def email_appkey(prj_id, member_email):
    debug_set = current_app.config["DEBUG"]
    if debug_set == True:
        print "\n\n\n==========> account->views.py -> email_appkey() "
    memkey = ProjectMemberKey.find_one(prj_id=prj_id, member_email=member_email)
    if settings.MAIL_SERVER:
        mail = Mail(current_app._get_current_object())
        message = Message(
            "Your new appkey for 4k mobile app", sender="*****@*****.**", recipients=[member_email]
        )
        message.body = "Project ID: %s \nAppkey: %s" % (prj_id, memkey.appkey)
        mail.send(message)
        flash("New appkey has been send to your email.", category="info")
    else:
        flash("Can not email because email server is not availalbe. " + "Contact administrator", category="error")

    return redirect(url_for(".view_project", prj_id=prj_id))
def mandaemail2((email, assunto, content)):
	app.config.update(dict(
	    DEBUG = True,
	    MAIL_SERVER = 'smtp.gmail.com',
	    MAIL_PORT = 587,
	    MAIL_USE_TLS = True,
	    MAIL_USE_SSL = False,
	    MAIL_USERNAME = '******',
	    MAIL_PASSWORD = '******',
	))
	mail = Mail(app)
	msg = Message(
	          assunto,
	       sender = '*****@*****.**',
	       recipients = [email])
	msg.body = content
	mail.send(msg)
Beispiel #29
0
def send_email(title, content, to_list, cc_list=None, bcc_list=None, sender=None):
    """
    发送邮件
    """
    mail = Mail(current_app)
    extra = {
        "Accept-Charset": "ISO-8859-1,utf-8"
    }
    try:
        msg = Message(subject=title, html=content, recipients=to_list, sender=sender, cc=cc_list, bcc=bcc_list, extra_headers=extra)
        mail.send(msg)
        return True
    except SMTPRecipientsRefused as e:
        raise e
    except Exception as e:
        current_app.logger.exception(e)
        return False
Beispiel #30
0
def send_email_invites(event):
    if event.is_email_involved():
        contacts_to_invite = list(event.contacts_email_to_invite)
        mail = Mail(app)

        if contacts_to_invite:
            with db.transaction:
                for contact in contacts_to_invite:
                    hash = contact.invitation_hash(event)

                    msg = Message('Inviation to %s' % event.name)
                    msg.sender = '%s <%s>' % (current_user.name, current_user.email)
                    msg.add_recipient('%s <%s>' % (contact.name, contact.email))
                    msg.html = render_template('_invitation.html', event=event, hash=hash)
                    mail.send(msg)

                    event.set_invitation_sent(contact)
Beispiel #31
0
#!/usr/bin/env python

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.mail import Mail

Mdb = Flask(__name__,template_folder="../../templates")
Mdb.config.from_envvar('MDB_CONFIG')
Mdb.secret_key = Mdb.config['SECRET_KEY']
db = SQLAlchemy(Mdb)

mail = Mail(Mdb)

from Mdb import models,views

Beispiel #32
0
import os
##########################################################################

# Initialize the Flask application
app = Flask(__name__)

# Configuring Flask Mail with gmail
app.config['MAIL_SERVER']= 'smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = '******'
app.config['MAIL_PASSWORD'] = '******'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_DEBUG'] = True

mailbox = Mail(app) # Initialize mail

# Defining a route for the default URL, which loads the form
@app.route('/')
def form():
	return render_template('layout.html')

 
# accepting: POST requests 
@app.route('/confirmation/', methods=['POST'])
def entry():
	# assigning form input to variables
	name = request.form['Name']
	email = request.form['Email']
	btc = request.form['BTC']
	operator = None
Beispiel #33
0
def create_app():
    # Create app
    app = Flask(__name__)
    mail = Mail(app)
    app.config.from_object('config')

    mail = Mail(app)
    mail.init_app(app)

    # db instance is created in models.py (for factory pattern)
    from models import db
    db.init_app(app)

    # Setup Flask-Security
    from models import roles_users, Role, User
    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    security = Security(app, user_datastore)

    # importmore Moules here
    from models import InvoiceDocument

    # Import modules here
    from app.mod_api.api import api_mod as api_module
    from app.mod_crew.controllers import crew_mod as crew_module
    app.register_blueprint(api_module)
    app.register_blueprint(crew_module)

    # Views

    # # Create a user to test with
    @app.before_first_request
    def create_user():
        db.create_all()
        #user_datastore.create_user(email='*****@*****.**', password='******')
        #user_datastore.create_user(email='test', password='******')
        db.session.commit()

    @app.route('/')
    @login_required
    def index():
        return render_template('pickoption.html')

    @app.route('/hourly_rate', methods=['GET', 'POST'])
    @login_required
    def hourly_rate():
        form = HourlyRateForm(request.form)
        entry = None
        if request.method == 'POST':

            if form.validate_on_submit():
                entry = FreelanceEntry(
                    hourly_rate=form.hours_worked.data,
                    hours=form.hours_worked.data,
                )
                if "submit" in request.form:
                    flash("button 1 was pressed")
                    return render_template('hourly_rate.html',
                                           form=form,
                                           entry=entry)

                if "save_invoice" in request.form:
                    flash("Data Saved ")
                    invoice_saved = InvoiceDocument(
                        option_selected="hourly_rate",
                        hours=form.hours_worked.data,
                        hourly_rate=form.hourly_rate.data,
                        creation_date=timenow)
                    db.session.add(invoice_saved)
                    db.session.commit()
                    return render_template('hourly_rate.html',
                                           form=form,
                                           entry=entry)

            else:
                flash("Fill Out both fields")
                return render_template('hourly_rate.html',
                                       form=form,
                                       entry=entry)

        elif request.method == 'GET':
            return render_template('hourly_rate.html', form=form, entry=entry)

    @app.route('/guaranteedhours', methods=['GET', 'POST'])
    @login_required
    def guaranteed_hours():
        form = GuaranteedHoursForm(request.form)
        entry = None
        if form.validate_on_submit():
            entry = FreelanceEntry(
                guaranteed_rate=form.guaranteed_rate.data,
                guaranteed_hours=form.guaranteed_hours.data,
                hours_worked=form.actual_hours_worked.data,
            )
        return render_template('guaranteedhours.html', form=form, entry=entry)

    @app.route('/about')
    def about():
        return render_template('about.html')

    @app.route('/blog')
    def blog():
        return render_template('blog.html')

    @app.route('/contact')
    def contact():
        return render_template('contact.html')

    @app.route('/accountsettings')
    @login_required
    def accountsettings():
        return render_template('accountsettings.html')

    return app
Beispiel #34
0
def init_app(init=None,
             config=None,
             pyfile=None,
             template_folder='templates',
             index=False,
             error=True,
             is_web=False,
             is_api=False,
             manager=False):
    """ 创建应用 """
    app = Flask(__name__, template_folder=template_folder)
    if os.environ.get('LOGGER_DEBUG'):
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(logging.Formatter(DEBUG_LOG_FORMAT))
        app.logger.addHandler(handler)
        app.logger.setLevel(logging.DEBUG)

    init_db(db)

    if config:
        app.config.from_object(config)
    if pyfile:
        app.config.from_pyfile(pyfile)

    ENVVAR = app.config.get('ENVVAR')
    if ENVVAR and os.environ.get(ENVVAR):
        env = os.environ.get(ENVVAR)
        for pyfile in env.split('|'):
            if pyfile.startswith('./'):
                pyfile = os.path.join(os.getcwd(), pyfile)
            app.logger.info('load config pyfile: %s' % pyfile)
            app.config.from_pyfile(pyfile)

    if app.debug:
        app.config.setdefault('DEBUG_TB_ENABLED', True)
        app.config.setdefault('DEBUG_TB_PANELS', DEBUG_TB_PANELS)
        app.config.setdefault('DEBUG_TB_INTERCEPT_REDIRECTS', False)

    DebugToolbarExtension(app)

    app.config.setdefault('SESSION_REFRESH_EACH_REQUEST', False)
    app.is_web = is_web
    app.is_api = is_api
    app.is_admin = not is_web and not is_api
    app.is_back = os.environ.get('CHIKI_BACK') == 'true'
    app.static_folder = app.config.get('STATIC_FOLDER')
    app.mail = Mail(app)

    def get_data_path(name):
        return os.path.abspath(
            os.path.join(app.config.get('DATA_FOLDER'), name))

    if app.config.get('USER_AGENT_LIMIT', False):

        @app.before_request
        def before_request():
            if request.path == current_app.config.get('WEROBOT_ROLE'):
                return

            ua = request.headers['User-Agent'].lower()
            if not app.debug and 'micromessenger' not in ua:
                return error_msg('请用微信客户端扫一扫')

    app.get_data_path = get_data_path

    init_babel(app)
    init_redis(app)

    if not app.config.get('CACHE_TYPE'):
        app.config['CACHE_TYPE'] = 'simple'
    cache.init_app(app)

    if app.config.get('SESSION_TYPE'):
        Session(app)

    init_jinja(app)
    init_logger(app)
    init_oauth(app)
    init_third(app)
    init_page(app)

    db.init_app(app)
    media.init_app(app)

    if app.is_admin and not manager:
        with app.app_context():
            cm.init_app(app)
            Choices.init()

    global inits
    for i in inits:
        i(app)

    if callable(init):
        init(app)

    @app.context_processor
    def context_processor():
        return dict(Item=Item, Menu=Menu, url_for=url_for, ImageItem=ImageItem)

    if error:
        init_error_handler(app)

    if index:

        @app.route('/')
        def index():
            return redirect(app.config.get('INDEX_REDIRECT'))

    blueprint = Blueprint('chiki',
                          __name__,
                          template_folder=os.path.join(TEMPLATE_ROOT, 'chiki'))
    app.register_blueprint(blueprint)

    if app.is_back:

        @app.route('/chiki_back')
        def chiki_back():
            return 'true'

    if app.is_admin and not manager:
        with app.app_context():
            if hasattr(app, 'user_manager'):
                user = um.models.User.objects(id=100000).first()
                if not user:
                    user = um.models.User(id=100000,
                                          phone='13888888888',
                                          password='******',
                                          nickname=app.config.get('SITE_NAME'))
                    user.tid = user.create_tid()
                    user.save()
                if not user.avatar and os.path.exists(
                        app.get_data_path('imgs/logo.jpg')):
                    with open(app.get_data_path('imgs/logo.jpg')) as fd:
                        user.avatar = dict(stream=StringIO(fd.read()),
                                           format='jpg')
                    user.save()

    @app.route('/1.gif')
    def gif():
        return send_file(DATA_ROOT + '/1.gif',
                         cache_timeout=0,
                         add_etags=False,
                         mimetype='image/gif')

    @app.route('/test/error')
    def test_error():
        raise ValueError('testing!!!')

    @app.route('/trace/log', methods=['POST'])
    def trace_log():
        user = None
        if current_user.is_authenticated():
            user = current_user.id

        if current_app.config.get('FAST_MODE') is True:
            return json_success()

        TraceLog(
            user=user,
            key=request.form.get('key', ''),
            tid=request.form.get('tid', ''),
            label=request.form.get('label', ''),
            value=request.form.get('value', ''),
        ).save()
        return json_success()

    @app.route('/complaint/choose')
    @login_required
    def complaint_choose():
        complaint = sorted(Complaint.TYPE.DICT.iteritems(),
                           key=lambda x: x[1],
                           reverse=True)
        return render_template('complaint/choose.html', type=complaint)

    @app.route('/complaint/desc/')
    @login_required
    def complaint_desc():
        types = request.args.get('type', '')
        return render_template('complaint/desc.html', types=types)

    @app.route('/complaint/refer', methods=['POST'])
    @login_required
    def complaint_refer():
        types = request.form.get('type', '')
        content = request.form.get('content', '')
        complaints = Complaint(
            user=current_user.id,
            content=content,
            type=types,
            active=True,
        )
        complaints.create()
        complaints.save()
        return json_success(msg='success', num=complaints.id)

    @app.route('/complaint/save/')
    @login_required
    def complaint_save():
        num = request.args.get('num', '')
        return render_template('complaint/refer.html', num=num)

    @app.route('/complaint/active')
    @login_required
    def complaint_active():
        complaints = Complaint.objects(user=current_user.id,
                                       active=True).first()
        if complaints:
            complaints.user.complaint = True
            complaints.user.save()
        return ''

    init_db(db)

    return app
Beispiel #35
0
from flask_wtf.csrf import CsrfProtect
csrf = CsrfProtect()

db = SQLAlchemy()
# After defining `db`, import auth models due to
# circular dependency.
from mhn.auth.models import User, Role, ApiKey
user_datastore = SQLAlchemyUserDatastore(db, User, Role)


mhn = Flask(__name__)
mhn.config.from_object('config')
csrf.init_app(mhn)

# Email app setup.
mail = Mail()
mail.init_app(mhn)

# Registering app on db instance.
db.init_app(mhn)

# Setup flask-security for auth.
Security(mhn, user_datastore)

# Registering blueprints.
from mhn.api.views import api
mhn.register_blueprint(api)

from mhn.ui.views import ui
mhn.register_blueprint(ui)
Beispiel #36
0
# Create application
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456790'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///fground.sqlite'
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)

#secrets...
import creds
app.config.from_pyfile('creds.py')

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

from flask.ext.mail import Message, Mail
mail = Mail()
app.config["MAIL_SERVER"] = "smtp.live.com"
app.config["MAIL_PORT"] = 587
app.config["MAIL_USE_TLS"] = True
app.config["MAIL_USERNAME"] = creds.cred['mailu']
app.config["MAIL_PASSWORD"] = creds.cred['mailpass']
mail.init_app(app)
    
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Model
class List(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name_a = db.Column(db.Unicode(64))
    tag_f1 = db.Column(db.String(255))

    def __unicode__(self):
Beispiel #37
0
def create_app(testing=False, live=False):
    from bhs_api.models import User, Role
    from bhs_api.forms import LoginForm

    app = Flask(__name__)
    app.testing = testing

    # load the config file
    conf = get_conf()
    app.conf = conf
    # Our config - need to move everything here
    app.config['VIDEO_BUCKET_URL'] = "https://storage.googleapis.com/bhs-movies"
    app.config['IMAGE_BUCKET_URL'] = "https://storage.googleapis.com/bhs-flat-pics"

    # Set app config
    app.config['DEBUG'] = True
    app.config['FRONTEND_SERVER'] = conf.frontend_server
    app.config['DEFAULT_NEXT'] = '/mjs'
    # Security Config
    app.config['SECRET_KEY'] = conf.secret_key
    app.config['WTF_CSRF_ENABLED'] = False
    app.config['SECURITY_PASSWORDLESS'] = True
    app.config['SECURITY_EMAIL_SENDER'] = 'BH Databases<*****@*****.**>'
    app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'email'
    app.config['SECURITY_EMAIL_SUBJECT_PASSWORDLESS'] = 'Login link for Your Jewish Story'
    app.config['SECURITY_POST_LOGIN_VIEW'] = '/mjs'
    app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('email', 'username', 'hash')
    # Mail Config
    app.config['MAIL_SERVER'] = conf.mail_server
    app.config['MAIL_PORT'] = conf.mail_port
    # Mail optional username and password
    try:
        app.config['MAIL_USERNAME'] = conf.mail_username
        app.config['MAIL_PASSWORD'] = conf.mail_password
    except AttributeError:
        pass

    # DB Config
    app.config['MONGODB_DB'] = conf.user_db_name
    app.config['MONGODB_HOST'] = conf.user_db_host
    app.config['MONGODB_PORT'] = conf.user_db_port
    # Redis
    app.config['REDIS_HOST'] = conf.redis_host
    app.config['REDIS_PORT'] = conf.redis_port
    app.config['REDIS_PASSWORD'] = getattr(conf, 'redis_password', None)

    # CACHING
    app.config['CACHING_TTL'] = conf.caching_ttl

    app.mail = Mail(app)
    app.db = MongoEngine(app)
    app.user_datastore = MongoEngineUserDatastore(app.db, User, Role)
    app.security = Security(app, app.user_datastore,
                            passwordless_login_form=LoginForm)
    # Create database connection object
    app.client_data_db = pymongo.MongoClient(conf.data_db_host, conf.data_db_port,
                    read_preference=pymongo.ReadPreference.SECONDARY_PREFERRED)
    app.data_db = app.client_data_db[conf.data_db_name]

    # Create the elasticsearch connection
    app.es = elasticsearch.Elasticsearch(conf.elasticsearch_host)
    app.es_data_db_index_name = getattr(conf, "elasticsearch_data_index", app.data_db.name)

    # Add the user's endpoints
    from bhs_api.user import user_endpoints
    app.register_blueprint(user_endpoints)
    # Add the v1 endpoint
    from bhs_api.v1_endpoints import v1_endpoints
    app.register_blueprint(v1_endpoints, url_prefix='/v1')
    # Initialize autodoc - https://github.com/acoomans/flask-autodoc
    #allow CORS
    cors = CORS(app, origins=['*'], headers=['content-type', 'accept',
                                            'authentication-token', 'Authorization'])
    # logging
    if live:
        app.config['PROPAGATE_EXCEPTIONS'] = True
        try:
            fh = logging.FileHandler(conf.log_file)
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            fh.setFormatter(formatter)
            app.logger.addHandler(fh)
        except AttributeError:
            pass

    # redis
    try:
        app.redis = redis.StrictRedis(host=conf.redis_host,
                                      port=conf.redis_port,
                                      password = app.config['REDIS_PASSWORD'],
                                      db=0)
    except AttributeError:
        app.redis = None

    return app, conf
Beispiel #38
0
# Bootstrap
from flask_bootstrap import Bootstrap
Bootstrap(app)

# Assets
from flask.ext.assets import Environment
assets = Environment(app)
# Ensure output directory exists
assets_output_dir = os.path.join(FLASK_APP_DIR, '..', 'static', 'gen')
if not os.path.exists(assets_output_dir):
    os.mkdir(assets_output_dir)

# Email
from flask.ext.mail import Mail
app.mail = Mail(app)

# Memcache
from flask.ext.cache import Cache
app.cache = Cache(app)

# MongoEngine
from flask_application.models import db
app.db = db
app.db.init_app(app)

from flask.ext.security import Security, MongoEngineUserDatastore
from flask_application.users.models import User, Role

# Setup Flask-Security
app.user_datastore = MongoEngineUserDatastore(app.db, User, Role)
Beispiel #39
0
def get_app(config=None, media_storage=None, config_object=None):
    """App factory.

    :param config: configuration that can override config from `default_settings.py`
    :param media_storage: media storage class to use
    :param config_object: config object to load (can be module name, module or an object)
    :return: a new SuperdeskEve app instance
    """

    abs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    app_config = flask.Config(abs_path)
    app_config.from_object('superdesk.default_settings')
    app_config.setdefault('APP_ABSPATH', abs_path)
    app_config.setdefault('DOMAIN', {})
    app_config.setdefault('SOURCES', {})

    if config_object:
        app_config.from_object(config_object)

    try:
        app_config.update(config or {})
    except TypeError:
        app_config.from_object(config)

    if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'):
        media_storage = AmazonMediaStorage
    elif not media_storage:
        media_storage = SuperdeskGridFSMediaStorage

    app = eve.Eve(data=SuperdeskDataLayer,
                  auth=TokenAuth,
                  media=media_storage,
                  settings=app_config,
                  json_encoder=MongoJSONEncoder,
                  validator=SuperdeskValidator,
                  template_folder=os.path.join(abs_path, 'templates'))

    superdesk.app = app

    custom_loader = jinja2.ChoiceLoader([
        jinja2.FileSystemLoader('templates'),
        jinja2.FileSystemLoader(
            os.path.join(
                os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
                'templates'))
    ])

    app.jinja_loader = custom_loader
    app.mail = Mail(app)
    app.sentry = SuperdeskSentry(app)

    @app.errorhandler(SuperdeskError)
    def client_error_handler(error):
        """Return json error response.

        :param error: an instance of :attr:`superdesk.SuperdeskError` class
        """
        return send_response(None,
                             (error.to_dict(), None, None, error.status_code))

    @app.errorhandler(500)
    def server_error_handler(error):
        """Log server errors."""
        app.sentry.captureException()
        superdesk.logger.exception(error)
        return_error = SuperdeskApiError.internalError()
        return client_error_handler(return_error)

    init_celery(app)
    installed = set()

    def install_app(module_name):
        if module_name in installed:
            return
        installed.add(module_name)
        app_module = importlib.import_module(module_name)
        try:
            app_module.init_app(app)
        except AttributeError:
            pass

    for module_name in app.config.get('INSTALLED_APPS', []):
        install_app(module_name)

    for module_name in app.config.get('CORE_APPS', []):
        install_app(module_name)

    for resource in superdesk.DOMAIN:
        app.register_resource(resource, superdesk.DOMAIN[resource])

    for blueprint in superdesk.BLUEPRINTS:
        prefix = app.api_prefix or None
        app.register_blueprint(blueprint, url_prefix=prefix)

    for name, jinja_filter in superdesk.JINJA_FILTERS.items():
        app.jinja_env.filters[name] = jinja_filter

    if not app_config.get('TESTING', False):
        # we can only put mapping when all resources are registered
        app.data.init_elastic(app)

    # instantiate registered provider classes (leave non-classes intact)
    for key, provider in registered_feeding_services.items():
        registered_feeding_services[key] = provider() if isinstance(
            provider, type) else provider

    configure_logging(app.config['LOG_CONFIG_FILE'])

    return app
Beispiel #40
0
if settings.USE_SENTRY:
    sentry = Sentry(app)

sockets = Sockets(app)

redis = redis.from_url(settings.BROKER_URL)

manager = Manager(app)

server = Server(host="0.0.0.0", port=5000, use_debugger=True, use_reloader=True)
serverProd = Server(host="0.0.0.0", port=5000, use_debugger=False, use_reloader=False)

manager.add_command('runserver', server)
manager.add_command('runserverprod', serverProd)

mail = Mail(app)                                # Initialize Flask-Mail
babel = Babel(app)                              # Initialize Flask-Babel

vote_backend = VoteBackend()
vote_backend.start()

loginManager = LoginManager(app=app)


class AdminCommand(Command):

    option_list = (
            Option('--addadmin', '-a', dest='addname'),
    )
    def run(self, addname = None):
        if addname is not None:
Beispiel #41
0
def get_app(config=None, media_storage=None):
    """App factory.

    :param config: configuration that can override config from `settings.py`
    :return: a new SuperdeskEve app instance
    """
    if config is None:
        config = {}

    abs_path = os.path.abspath(os.path.dirname(__file__))
    config.setdefault('APP_ABSPATH', abs_path)

    for key in dir(superdesk.factory.settings):
        if key.isupper():
            config.setdefault(key, getattr(superdesk.factory.settings, key))

    if media_storage is None:
        media_storage = SuperdeskGridFSMediaStorage

    config.setdefault('DOMAIN', {})
    configure_logging(config)

    app = eve.Eve(data=SuperdeskDataLayer,
                  auth=TokenAuth,
                  media=media_storage,
                  settings=config,
                  json_encoder=MongoJSONEncoder,
                  validator=SuperdeskValidator)

    superdesk.app = app

    custom_loader = jinja2.ChoiceLoader([
        app.jinja_loader,
        jinja2.FileSystemLoader([abs_path + '/../templates'])
    ])
    app.jinja_loader = custom_loader

    app.mail = Mail(app)

    @app.errorhandler(SuperdeskError)
    def client_error_handler(error):
        """Return json error response.

        :param error: an instance of :attr:`superdesk.SuperdeskError` class
        """
        return send_response(None,
                             (error.to_dict(), None, None, error.status_code))

    @app.errorhandler(500)
    def server_error_handler(error):
        """Log server errors."""
        app.sentry.captureException()
        superdesk.logger.exception(error)
        return_error = SuperdeskApiError.internalError()
        return client_error_handler(return_error)

    init_celery(app)

    for module_name in app.config['INSTALLED_APPS']:
        app_module = importlib.import_module(module_name)
        try:
            app_module.init_app(app)
        except AttributeError:
            pass

    for resource in superdesk.DOMAIN:
        app.register_resource(resource, superdesk.DOMAIN[resource])

    for blueprint in superdesk.BLUEPRINTS:
        prefix = app.api_prefix or None
        app.register_blueprint(blueprint, url_prefix=prefix)

    # we can only put mapping when all resources are registered
    app.data.elastic.put_mapping(app)

    app.sentry = sentry
    sentry.init_app(app)

    # instantiate registered provider classes (leave non-classes intact)
    for key, provider in providers.items():
        providers[key] = provider() if isinstance(provider, type) else provider

    return app
Beispiel #42
0
__author__ = 'Xu Zhao'

from flask import Flask
from flask.ext.mail import Mail, Message

app = Flask(__name__)

app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = '******'
app.config['MAIL_PASSWORD'] = '******'

mail = Mail(app)
msg = Message('Notification',
              recipients=['*****@*****.**'],
              sender='*****@*****.**')
msg.body = 'Please notify your department to attend the conference.'
#msg.html = '<b>Please </b>'

with app.app_context():
    mail.send(msg)
    print 'send ok'
Beispiel #43
0
 def setUp(self):
     taikoa.app.config['TESTING'] = True
     taikoa.mail = Mail(taikoa.app)
     self.app = taikoa.app.test_client()
Beispiel #44
0
def create_app(config):
    app = Flask(__name__)
    app.debug = True
    app.config['SECRET_KEY'] = 'secret'
    app.config['TESTING'] = True

    for key, value in config.items():
        app.config[key] = value

    mail = Mail(app)
    app.extensions['mail'] = mail

    @app.route('/')
    def index():
        return render_template('index.html', content='Home Page')

    @app.route('/profile')
    @login_required
    def profile():
        return render_template('index.html', content='Profile Page')

    @app.route('/post_login')
    @login_required
    def post_login():
        return render_template('index.html', content='Post Login')

    @app.route('/http')
    @http_auth_required
    def http():
        return 'HTTP Authentication'

    @app.route('/http_custom_realm')
    @http_auth_required('My Realm')
    def http_custom_realm():
        return render_template('index.html', content='HTTP Authentication')

    @app.route('/token')
    @auth_token_required
    def token():
        return render_template('index.html', content='Token Authentication')

    @app.route('/multi_auth')
    @auth_required('session', 'token', 'basic')
    def multi_auth():
        return render_template('index.html',
                               content='Session, Token, Basic auth')

    @app.route('/post_logout')
    def post_logout():
        return render_template('index.html', content='Post Logout')

    @app.route('/post_register')
    def post_register():
        return render_template('index.html', content='Post Register')

    @app.route('/admin')
    @roles_required('admin')
    def admin():
        return render_template('index.html', content='Admin Page')

    @app.route('/admin_and_editor')
    @roles_required('admin', 'editor')
    def admin_and_editor():
        return render_template('index.html', content='Admin and Editor Page')

    @app.route('/admin_or_editor')
    @roles_accepted('admin', 'editor')
    def admin_or_editor():
        return render_template('index.html', content='Admin or Editor Page')

    @app.route('/unauthorized')
    def unauthorized():
        return render_template('unauthorized.html')

    @app.route('/coverage/add_role_to_user')
    def add_role_to_user():
        u = ds.find_user(email='*****@*****.**')
        r = ds.find_role('admin')
        ds.add_role_to_user(u, r)
        return 'success'

    @app.route('/coverage/remove_role_from_user')
    def remove_role_from_user():
        u = ds.find_user(email='*****@*****.**')
        ds.remove_role_from_user(u, 'admin')
        return 'success'

    @app.route('/coverage/deactivate_user')
    def deactivate_user():
        u = ds.find_user(email='*****@*****.**')
        ds.deactivate_user(u)
        return 'success'

    @app.route('/coverage/activate_user')
    def activate_user():
        u = ds.find_user(email='*****@*****.**')
        ds.activate_user(u)
        return 'success'

    @app.route('/coverage/invalid_role')
    def invalid_role():
        return 'success' if ds.find_role('bogus') is None else 'failure'

    return app
Beispiel #45
0
from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.mail import Mail
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
from flask_oauthlib.client import OAuth
from config import config, GITHUB_SETTINGS

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'
oauth = OAuth()
github = oauth.remote_app('github', **GITHUB_SETTINGS)


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    oauth.init_app(app)
Beispiel #46
0
def get_app(config=None):
    """App factory.

    :param config: configuration that can override config from `settings.py`
    :return: a new SuperdeskEve app instance
    """
    if config is None:
        config = {}

    for key in dir(settings):
        if key.isupper():
            config.setdefault(key, getattr(settings, key))

    media_storage = SuperdeskGridFSMediaStorage

    if config['AMAZON_CONTAINER_NAME']:
        from superdesk.storage.amazon.amazon_media_storage import AmazonMediaStorage
        from superdesk.storage.amazon.import_from_amazon import ImportFromAmazonCommand
        media_storage = AmazonMediaStorage
        superdesk.command('import:amazon', ImportFromAmazonCommand())

    config['DOMAIN'] = {}

    app = eve.Eve(data=superdesk.SuperdeskDataLayer,
                  auth=TokenAuth,
                  media=media_storage,
                  settings=config,
                  json_encoder=MongoJSONEncoder,
                  validator=SuperdeskValidator)

    custom_loader = jinja2.ChoiceLoader(
        [app.jinja_loader,
         jinja2.FileSystemLoader(['superdesk/templates'])])
    app.jinja_loader = custom_loader

    app.mail = Mail(app)

    app.on_fetched_resource += signals.proxy_resource_signal('read', app)
    app.on_fetched_item += signals.proxy_item_signal('read', app)
    app.on_inserted += signals.proxy_resource_signal('created', app)

    @app.errorhandler(superdesk.SuperdeskError)
    def client_error_handler(error):
        """Return json error response.

        :param error: an instance of :attr:`superdesk.SuperdeskError` class
        """
        return send_response(None,
                             (error.to_dict(), None, None, error.status_code))

    @app.errorhandler(500)
    def server_error_handler(error):
        """Log server errors."""
        app.sentry.captureException()
        logger.exception(error)
        return_error = superdesk.SuperdeskError(status_code=500)
        return client_error_handler(return_error)

    init_celery(app)
    for module_name in app.config['INSTALLED_APPS']:
        app_module = importlib.import_module(module_name)
        try:
            app_module.init_app(app)
        except AttributeError:
            pass

    for resource in superdesk.DOMAIN:
        app.register_resource(resource, superdesk.DOMAIN[resource])

    for blueprint in superdesk.BLUEPRINTS:
        prefix = app.api_prefix or None
        app.register_blueprint(blueprint, url_prefix=prefix)

    # we can only put mapping when all resources are registered
    app.data.elastic.put_mapping(app)

    app.sentry = sentry
    sentry.init_app(app)

    superdesk.app = app
    return app
Beispiel #47
0
from flask import Flask, g, session, url_for, send_from_directory
from flask.ext.mail import Mail, Message

from sphinx.websupport import WebSupport

app = Flask(__name__)
app.config.from_envvar('SPHINXWEB_SETTINGS')


@app.route('/static/_<section>/<path:name>')
def sphinx_statics(section, name):
    directory = path.join(app.config['BUILD_DIR'], 'static', '_' + section)
    return send_from_directory(directory, name)


mail = Mail(app)

from sphinxweb.models import db_session, User

NEW_COMMENT_MAIL = '''\
A new comment has been submitted for moderation:

Document: %(document)s
Author: %(username)s
Text:
%(text)s

Proposal:
%(proposal)s

Moderate: %(url)s
Beispiel #48
0
def init_app(init=None,
             config=None,
             pyfile=None,
             template_folder='templates',
             index=False,
             error=True,
             is_web=False,
             is_api=False):
    """ 创建应用 """

    app = Flask(__name__, template_folder=template_folder)
    if config:
        app.config.from_object(config)
    if pyfile:
        app.config.from_pyfile(pyfile)

    ENVVAR = app.config.get('ENVVAR')
    if ENVVAR and os.environ.get(ENVVAR):
        app.config.from_envvar(app.config['ENVVAR'])

    if app.debug:
        app.config.setdefault('DEBUG_TB_ENABLED', True)
        app.config.setdefault('DEBUG_TB_PANELS', DEBUG_TB_PANELS)
        app.config.setdefault('DEBUG_TB_INTERCEPT_REDIRECTS', False)

    DebugToolbarExtension(app)

    app.config.setdefault('SESSION_REFRESH_EACH_REQUEST', False)
    app.is_web = is_web
    app.is_api = is_api
    app.is_back = os.environ.get('CHIKI_BACK') == 'true'
    app.static_folder = app.config.get('STATIC_FOLDER')
    app.mail = Mail(app)

    def get_data_path(name):
        return os.path.abspath(
            os.path.join(app.config.get('DATA_FOLDER'), name))

    if app.config.get('USER_AGENT_LIMIT'):

        @app.before_request
        def before_request():
            if request.path == current_app.config.get('WEROBOT_ROLE'):
                return
            if not app.debug and 'micromessenger' not in request.headers[
                    'User-Agent'].lower():
                return error_msg('请用微信客户端扫一扫')

    app.get_data_path = get_data_path

    init_babel(app)
    init_redis(app)

    if app.config.get('SESSION_TYPE'):
        Session(app)

    init_jinja(app)
    init_logger(app)
    init_oauth(app)
    init_page(app)
    db.init_app(app)
    media.init_app(app)

    with app.app_context():
        cm.init_app(app)
        Choices.init()

    if callable(init):
        init(app)

    @app.context_processor
    def context_processor():
        return dict(Item=Item, Menu=Menu)

    if error:
        init_error_handler(app)

    if index:

        @app.route('/')
        def index():
            return redirect(app.config.get('INDEX_REDIRECT'))

    blueprint = Blueprint('chiki',
                          __name__,
                          template_folder=os.path.join(TEMPLATE_ROOT, 'chiki'))
    app.register_blueprint(blueprint)

    if app.is_back:

        @app.route('/chiki_back')
        def chiki_back():
            return 'true'

    with app.app_context():
        if hasattr(app, 'user_manager'):
            user = um.models.User.objects(id=100000).first()
            if not user:
                user = um.models.User(id=100000,
                                      phone='13888888888',
                                      password='******',
                                      nickname=app.config.get('SITE_NAME'))
                user.save()
            if not user.avatar and os.path.exists(
                    app.get_data_path('imgs/logo.jpg')):
                with open(app.get_data_path('imgs/logo.jpg')) as fd:
                    user.avatar = dict(stream=StringIO(fd.read()),
                                       format='jpg')
                user.save()

    return app
Beispiel #49
0
def create_app(**kwargs_config):
    """
    Create the flask app
    :param kwargs_config: overwrite any base level config
    :return: flask.Flask instance
    """

    app = factory.create_app(
        app_name=__name__.replace('.app', ''),
        **kwargs_config
    )

    api = Api(app)
    api.unauthorized = lambda noop: noop #Overwrite WWW-Authenticate challenge on 401

    csrf = CsrfProtect(app)

    mail = Mail(app)

    cors = CORS(app,
                origins=app.config.get('CORS_DOMAINS'),
                allow_headers=app.config.get('CORS_HEADERS'),
                methods=app.config.get('CORS_METHODS'),
                supports_credentials=True,
                )

    app.json_encoder = JSONEncoder
    api.add_resource(Bootstrap, '/bootstrap')
    api.add_resource(StatusView, '/status')
    api.add_resource(OAuthProtectedView, '/protected')
    api.add_resource(CSRFView, '/csrf')
    api.add_resource(UserAuthView, '/user')
    api.add_resource(DeleteAccountView, '/user/delete')
    api.add_resource(UserRegistrationView, '/register')
    api.add_resource(LogoutView, '/logout')
    api.add_resource(PersonalTokenView, '/token')
    api.add_resource(UserInfoView, '/info/<string:account_data>')
    api.add_resource(ChangePasswordView, '/change-password')
    api.add_resource(ChangeEmailView, '/change-email')
    api.add_resource(VerifyEmailView, '/verify/<string:token>')
    api.add_resource(ForgotPasswordView, '/reset-password/<string:token>')
    app.ts = URLSafeTimedSerializer(app.config["SECRET_KEY"])

    @app.login_manager.unauthorized_handler
    def unauthorized():
        """
        flask_login callback when @login_required is not met.
        This overrides the default behavior or re-directing to a login view
        """
        abort(401)

    # Register custom error handlers
    if not app.config.get('DEBUG'):
        app.errorhandler(AdsWSError)(on_adsws_error)
        app.errorhandler(AdsWSFormError)(on_adsws_form_error)

        @csrf.error_handler
        def csrf_error(reason):
            app.logger.warning("CSRF Blocked: {reason}".format(reason=reason))
            return jsonify(dict(error="Invalid CSRF token")), 400
    return app
Beispiel #50
0
import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
from flask.ext.principal import Principal, Permission, RoleNeed
from flask.ext.mail import Mail
from config import basedir
from sqlalchemy import *

####PDF library-> pip3 install --pre xhtml2pdf

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
lm = LoginManager()

principals = Principal(app)
# Create a permission with a single Need, in this case a RoleNeed.
admin_permission = Permission(RoleNeed('admin'))

lm.init_app(app)
lm.login_view = 'login'

mail_ext = Mail(app)

from app import login, prendas, pedido, accesorios, cliente, prospectos, buscar, municipio, excel, abonos
from app.model import user
from app.model import prenda
from app.model import color
Beispiel #51
0
def create_app(test_config=None):                   # For automated tests
    # Setup Flask and read config from ConfigClass defined above
    app = Flask(__name__)
    app.config.from_object(__name__+'.ConfigClass')

    # Load local_settings.py if file exists         # For automated tests
    try: app.config.from_object('local_settings')
    except: pass

    # Load optional test_config                     # For automated tests
    if test_config:
        app.config.update(test_config)

    # Initialize Flask extensions
    babel = Babel(app)                              # Initialize Flask-Babel
    db = SQLAlchemy(app)                            # Initialize Flask-SQLAlchemy
    mail = Mail(app)                                # Initialize Flask-Mail

    @babel.localeselector
    def get_locale():
        translations = [str(translation) for translation in babel.list_translations()]
        return request.accept_languages.best_match(translations)

    # Define User model. Make sure to add flask.ext.user UserMixin!!
    class User(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        active = db.Column(db.Boolean(), nullable=False, default=False)
        username = db.Column(db.String(50), nullable=False, unique=True)
        password = db.Column(db.String(255), nullable=False, default='')
        # Removed email field
        # Removed confirmed_at field
        reset_password_token = db.Column(db.String(100), nullable=False, default='')

    # Define UserEmail model.
    class UserEmail(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
        email = db.Column(db.String(255), nullable=False, unique=True)
        confirmed_at = db.Column(db.DateTime())
        is_primary = db.Column(db.Boolean(), nullable=False, default=False)
        user = db.relationship("User", uselist=False)

    # Create all database tables
    db.create_all()

    # Setup Flask-User
    db_adapter = SQLAlchemyAdapter(db,  User,       # Select database adapter
            UserEmailClass=UserEmail)               # Allow Multiple Emails per User
    user_manager = UserManager(db_adapter, app)     # Init Flask-User and bind to app

    # Display Login page or Profile page
    @app.route('/')
    def home_page():
        if current_user.is_authenticated():
            return redirect(url_for('profile_page'))
        else:
            return redirect(url_for('user.login'))

    # The '/profile' page requires a logged-in user
    @app.route('/profile')
    @login_required                                 # Use of @login_required decorator
    def profile_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
                <h2>{%trans%}Profile Page{%endtrans%}</h2>
                <p> {%trans%}Hello{%endtrans%}
                    {{ current_user.username or current_user.email }},</p>
                <p> <a href="{{ url_for('user.change_username') }}">
                    {%trans%}Change username{%endtrans%}</a></p>
                <p> <a href="{{ url_for('user.change_password') }}">
                    {%trans%}Change password{%endtrans%}</a></p>
                <p> <a href="{{ url_for('user.manage_emails') }}">
                    {%trans%}Manage emails{%endtrans%}</a></p>
                <p> <a href="{{ url_for('user.logout') }}?next={{ url_for('user.login') }}">
                    {%trans%}Sign out{%endtrans%}</a></p>
            {% endblock %}
            """)

    return app
Beispiel #52
0
# 命令行可执行启动参数
manager = Manager(app)
# 调试模式
# manager.add_command("runserver", Server(use_debugger=True))
# 用户界面插件
bootstrap = Bootstrap(app)
# 本地化时间
moment = Moment(app)
# 数据库实例
db = SQLAlchemy(app)
# 数据库迁移
migrate = Migrate(app=app, db=db, directory='migrations')
manager.add_command('db', MigrateCommand)
# 邮件
mail = Mail(app=app)


# 定义模型
class Role(db.Model):
    """docstring for Role"""
    # 定义数据库使用的表名, 若未定义, 会生成默认名称
    __tablename__ = 'roles'
    # 模型属性
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    # users属性代表此关系的面向对象视角
    # 返回与角色关联的用户组列表
    # 第一个参数, 另一端是哪个模型
    # backref, 向User添加role属性, 可替代role.id访问Role, 得到的是对象, 而非外键值
    users = db.relationship('User', backref='role', lazy='dynamic')
Beispiel #53
0
def create_app(config=None):
    if config is None:
        config = {}

    ROOT_DIR = os.path.abspath(os.path.dirname(__file__))

    app = flask.Flask(__name__,
                      static_folder=os.path.join(ROOT_DIR, "..", "static"))

    _CONF_D_PATH = os.environ.get('CONFIG_DIRECTORY',
                                  os.path.join(ROOT_DIR, "..", "..", "conf.d"))

    configs = [os.path.join(ROOT_DIR, "app.yml")]

    if os.path.isdir(_CONF_D_PATH):
        configs.extend(
            sorted(
                os.path.join(_CONF_D_PATH, x) for x in os.listdir(_CONF_D_PATH)
                if x.endswith(".yml")))

    for yaml_path in configs:
        if os.path.isfile(yaml_path):
            with open(yaml_path) as yaml_file:
                app.config.update(yaml.load(yaml_file))

    app.config.update(config)

    if 'SQLALCHEMY_DATABASE_URI' not in app.config:
        app.config['SQLALCHEMY_DATABASE_URI'] = os.path.expandvars(
            os.environ.get(
                'SQLALCHEMY_DATABASE_URI',
                'postgresql://localhost/{0}'.format(app.config['app_name'])))

    if os.path.exists("/dev/log"):
        syslog_handler = logbook.SyslogHandler(app.config['app_name'],
                                               "/dev/log")
        syslog_handler.push_application()

    del app.logger.handlers[:]
    redirect_logging()

    app.logger.info("Started")

    Mail(app)

    from . import models

    models.db.init_app(app)

    from . import auth
    Security(app, auth.user_datastore)

    from .views import views
    from .setup import setup
    blueprints = [views, setup]

    from .errors import errors

    for blueprint in blueprints:
        app.register_blueprint(blueprint)

    for code in errors:
        app.errorhandler(code)(errors[code])

    return app
Beispiel #54
0
def create_app():
    """ Flask application factory """

    # Setup Flask app and app.config
    app = Flask(__name__)
    app.config.from_object(__name__ + '.ConfigClass')

    # Initialize Flask extensions
    db = SQLAlchemy(app)  # Initialize Flask-SQLAlchemy
    mail = Mail(app)  # Initialize Flask-Mail

    # Define User model. Make sure to add flask.ext.user UserMixin !!!
    class User(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        active = db.Column(db.Boolean(), nullable=False, default=False)
        username = db.Column(db.String(50), nullable=False, unique=True)
        password = db.Column(db.String(255), nullable=False, default='')
        email = db.Column(db.String(255), nullable=False, unique=True)
        confirmed_at = db.Column(db.DateTime())
        reset_password_token = db.Column(db.String(100),
                                         nullable=False,
                                         default='')

    # Create all database tables
    db.create_all()

    # Setup Flask-User
    db_adapter = SQLAlchemyAdapter(db, User)  # Register the User model
    user_manager = UserManager(db_adapter, app)  # Initialize Flask-User

    # The Home page is accessible to anyone
    @app.route('/')
    def home_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
                <p><a href="{{ url_for('home_page') }}">Home page</a> |
                   <a href="{{ url_for('profile_page') }}">Profile page</a></p>

                <h2>Home page</h2>

                {% if current_user.is_authenticated() %}
                    <p><a href="{{ url_for('user.logout')  }}">Sign out</a></p>
                {% else %}
                    <p><a href="{{ url_for('user.login') }}">Sign in</a></p>
                {% endif %}
            {% endblock %}
            """)

    # The Profile page requires a logged-in user
    @app.route('/profile')
    @login_required  # Use of @login_required decorator
    def profile_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
                <p><a href="{{ url_for('home_page') }}">Home page</a> |
                   <a href="{{ url_for('profile_page') }}">Profile page</a></p>

                <h2>Profile page</h2>

                <p>Username: {{ current_user.username }}</p>
                <p>Email:    {{ current_user.email }}   </p>

                <p><a href="{{ url_for('user.change_username') }}">Change username</a></p>
                <p><a href="{{ url_for('user.change_password') }}">Change password</a></p>
                <p><a href="{{ url_for('user.logout') }}">Sign out</a></p>
            {% endblock %}
            """)

    return app
Beispiel #55
0
def mail_bulk_connection():
    mail = Mail(app)
    return mail.connect()
Beispiel #56
0
def init_app(app, test_config=None):  # For automated tests
    # Setup Flask and read config from ConfigClass defined above
    app.config.from_object(__name__ + '.ConfigClass')

    # Load local_settings.py if file exists         # For automated tests
    try:
        app.config.from_object('local_settings')
    except:
        pass

    # Load optional test_config                     # For automated tests
    if test_config:
        app.config.update(test_config)

    # Initialize Flask extensions
    babel = Babel(app)  # Initialize Flask-Babel
    mail = Mail(app)  # Initialize Flask-Mail

    # Reset all the database tables
    db.create_all()

    # Setup Flask-User
    db_adapter = SQLAlchemyAdapter(db,
                                   User,
                                   UserInvitationClass=UserInvitation)
    user_manager = UserManager(db_adapter, app)

    # Create regular 'member' user
    if not User.query.filter(User.username == 'member').first():
        user = User(username='******',
                    email='*****@*****.**',
                    active=True,
                    password=user_manager.hash_password('Password1'),
                    confirmed_at=datetime.datetime.utcnow())
        db.session.add(user)
        db.session.commit()

    # Create 'user007' user with 'secret' and 'agent' roles
    if not User.query.filter(User.username == 'user007').first():
        user1 = User(username='******',
                     email='*****@*****.**',
                     active=True,
                     password=user_manager.hash_password('Password1'))
        user1.roles.append(Role(name='secret'))
        user1.roles.append(Role(name='agent'))
        db.session.add(user1)
        db.session.commit()

    # The '/' page is accessible to anyone
    @app.route('/')
    def home_page():
        # if current_user.is_authenticated:
        #     return user_profile_page()
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Home Page{%endtrans%}</h2>
            <p><a href="{{ url_for('user.login') }}">{%trans%}Sign in{%endtrans%}</a></p>
            {% endblock %}
            """)

    # The '/profile' page requires a logged-in user
    @app.route('/user/profile')
    @login_required  # Use of @login_required decorator
    @confirm_email_required
    def user_profile_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Profile Page{%endtrans%}</h2>
            <p> {%trans%}Hello{%endtrans%}
                {{ current_user.username or current_user.email }},</p>
            <p> <a href="{{ url_for('user.change_username') }}">
                {%trans%}Change username{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.change_password') }}">
                {%trans%}Change password{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.invite') }}">
                {%trans%}Invite User{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.logout') }}?next={{ url_for('user.login') }}">
                {%trans%}Sign out{%endtrans%}</a></p>
            {% endblock %}
            """)

    # The '/special' page requires a user that has the 'special' AND ('sauce' OR 'agent') role.
    @app.route('/special')
    @roles_required('secret',
                    ['sauce', 'agent'])  # Use of @roles_required decorator
    def special_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Special Page{%endtrans%}</h2>
            {% endblock %}
            """)

    # For testing only
    app.db = db
    app.UserEmailClass = UserEmail

    return app
Beispiel #57
0
app = Flask(__name__)  # create Flask WSGI application
app.config['SECRET_KEY'] = environ.get('SECRET_KEY')

# mail configuration settings
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = environ.get('MAIL_PASSWORD')
app.config['AROWF_MAIL_SUBJECT_PREFIX'] = '[AROWF]'
app.config['AROWF_MAIL_SENDER'] = 'AROWF Admin'
app.config['AROWF_ADMIN'] = environ.get('AROWF_ADMIN')

bootstrap = Bootstrap(app)  # create Bootstrap instance
mail = Mail(app)  # create Mail instances


def send_async_email(app, msg):
    with app.app_context():
        mail.send(msg)


def send_email(to, subject, template, **kwargs):
    msg = Message(app.config['AROWF_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
                  sender=app.config['AROWF_ADMIN'],
                  recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    thr = Thread(target=send_async_email, args=[app, msg])
    thr.start()
Beispiel #58
0
        return fn(*args, **kwargs)

    return decorated_view


# CSRF Protection
csrf_protect = flask_wtf.CsrfProtect(app)

# Initalize DB object
db = SQLAlchemy(app)

# Initalize Bcrypt object for password hashing
bcrypt = Bcrypt(app)

# Initalize flask mail object for email notifications
flask_mail = Mail(app)

# Decorator for Token Auth on API Requests
from sleepypuppy.admin.admin.models import Admin as AdminModel


# The dectorat function for API token auth
def require_appkey(view_function):
    @wraps(view_function)
    def decorated_function(*args, **kwargs):
        if request.headers.get('Token'):
            for keys in AdminModel.query.all():
                print keys.api_key
                if request.headers.get('Token') == keys.api_key:
                    return view_function(*args, **kwargs)
            abort(401)
Beispiel #59
0
def create_app(config=None):
    if config is None:
        config = {}

    ROOT_DIR = os.path.abspath(os.path.dirname(__file__))

    app = flask.Flask(__name__, static_folder=os.path.join(ROOT_DIR, "..", "static"))

    app.config['COMBADGE_CONTACT_TIMEOUT'] = 60 * 60
    app.config['SHA512SUM'] = '/usr/bin/sha512sum'
    app.config['STORAGE_PATH'] = os.environ.get('STORAGE_PATH')
    _CONF_D_PATH = os.environ.get('CONFIG_DIRECTORY', os.path.join(ROOT_DIR, "..", "conf.d"))

    configs = [os.path.join(ROOT_DIR, "app.yml")]

    if os.path.isdir(_CONF_D_PATH):
        configs.extend(sorted(os.path.join(_CONF_D_PATH, x) for x in os.listdir(_CONF_D_PATH) if x.endswith(".yml")))
    for yaml_path in configs:
        if os.path.isfile(yaml_path):
            with open(yaml_path) as yaml_file:
                app.config.update(yaml.load(yaml_file))

    app.config.update(config)

    if 'SQLALCHEMY_DATABASE_URI' not in app.config:
        app.config['SQLALCHEMY_DATABASE_URI'] = os.path.expandvars(
            os.environ.get('SQLALCHEMY_DATABASE_URI', 'postgresql://localhost/{0}'.format(app.config['app_name'])))

    del app.logger.handlers[:]
    redirect_logging()

    app.logger.info("Started")

    Mail(app)
    
    if os.environ.get("SQLALCHEMY_LOG_QUERIES"):
        logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)

    app.raven = Sentry(
        app,
        client=raven.Client(
            dsn=app.config.get("SENTRY_DSN"),
            ignore_exceptions=[
                SSHException,
                JIRAError
            ],
        ),
    )

    from . import models

    models.db.init_app(app)

    from .errors import errors
    from .blueprints import auth, beams, files, issues, trackers, user_datastore, users, views, keys

    Security(app, user_datastore, register_blueprint=False)

    app.register_blueprint(auth)
    app.register_blueprint(beams, url_prefix="/beams")
    app.register_blueprint(files, url_prefix="/files")
    app.register_blueprint(issues, url_prefix="/issues")
    app.register_blueprint(trackers, url_prefix="/trackers")
    app.register_blueprint(users, url_prefix="/users")
    app.register_blueprint(keys, url_prefix="/keys")
    app.register_blueprint(views)

    if app.config.get('DEBUG'):
        from .blueprints import test_methods
        app.register_blueprint(test_methods)

    for code in errors:
        app.errorhandler(code)(errors[code])

    return app
Beispiel #60
0
def create_app(test_config=None):  # For automated tests
    # Setup Flask and read config from ConfigClass defined above
    app = Flask(__name__)
    app.config.from_object(__name__ + '.ConfigClass')

    # Load local_settings.py if file exists         # For automated tests
    try:
        app.config.from_object('local_settings')
    except:
        pass

    # Load optional test_config                     # For automated tests
    if test_config:
        app.config.update(test_config)

    # Initialize Flask extensions
    babel = Babel(app)  # Initialize Flask-Babel
    mail = Mail(app)  # Initialize Flask-Mail
    db = SQLAlchemy(app)  # Initialize Flask-SQLAlchemy

    @babel.localeselector
    def get_locale():
        translations = [
            str(translation) for translation in babel.list_translations()
        ]
        return request.accept_languages.best_match(translations)

    # Define User model. Make sure to add flask.ext.user UserMixin!!
    class User(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        active = db.Column(db.Boolean(), nullable=False, default=False)
        username = db.Column(db.String(50), nullable=False, unique=True)
        email = db.Column(db.String(255), nullable=False, unique=True)
        confirmed_at = db.Column(db.DateTime())
        password = db.Column(db.String(255), nullable=False, default='')
        reset_password_token = db.Column(db.String(100),
                                         nullable=False,
                                         default='')
        # Relationships
        roles = db.relationship('Role',
                                secondary='user_roles',
                                backref=db.backref('users', lazy='dynamic'))

    # Define Role model
    class Role(db.Model):
        id = db.Column(db.Integer(), primary_key=True)
        name = db.Column(db.String(50), unique=True)

    # Define UserRoles model
    class UserRoles(db.Model):
        id = db.Column(db.Integer(), primary_key=True)
        user_id = db.Column(db.Integer(),
                            db.ForeignKey('user.id', ondelete='CASCADE'))
        role_id = db.Column(db.Integer(),
                            db.ForeignKey('role.id', ondelete='CASCADE'))

    # Reset all the database tables
    db.create_all()

    # Setup Flask-User
    db_adapter = SQLAlchemyAdapter(db, User)
    user_manager = UserManager(db_adapter, app)

    # Create 'user007' user with 'secret' and 'agent' roles
    if not User.query.filter(User.username == 'user007').first():
        user1 = User(username='******',
                     email='*****@*****.**',
                     active=True,
                     password=user_manager.hash_password('Password1'))
        user1.roles.append(Role(name='secret'))
        user1.roles.append(Role(name='agent'))
        db.session.add(user1)
        db.session.commit()

    # The Home page is accessible to anyone
    @app.route('/')
    def home_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Home Page{%endtrans%}</h2>
            <p> <a href="{{ url_for('profile_page') }}">{%trans%}Profile Page{%endtrans%}</a> (requires sign-in)</p>
            <p> <a href="{{ url_for('special_page') }}">{%trans%}Special Page{%endtrans%}</a> (requires username 'user007' with password 'Password1')</p>
            {% if current_user.is_authenticated() %}
                <p> <a href="{{ url_for('user.logout') }}">{%trans%}Logout{%endtrans%}</a></p>
            {% else %}
                <p> <a href="{{ url_for('user.login') }}">{%trans%}Sign in{%endtrans%}</a> or
                    <a href="{{ url_for('user.register') }}">{%trans%}Register{%endtrans%}</a></p>
            {% endif %}
            {% endblock %}
            """)

    # The Profile page requires a logged-in user
    @app.route('/profile')
    @login_required  # Use of @login_required decorator
    def profile_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Profile Page{%endtrans%}</h2>
            <p> {%trans%}Hello{%endtrans%}
                {{ current_user.username or current_user.email }},</p>

            <p> <a href="{{ url_for('home_page') }}">{%trans%}Home Page{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.change_username') }}">
                {%trans%}Change username{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.change_password') }}">
                {%trans%}Change password{%endtrans%}</a></p>
            <p> <a href="{{ url_for('user.logout') }}?next={{ url_for('user.login') }}">
                {%trans%}Sign out{%endtrans%}</a></p>
            {% endblock %}
            """)

    # The Special page requires a user that has the 'special' AND ('sauce' OR 'agent') role.
    @app.route('/special')
    @roles_required('secret',
                    ['sauce', 'agent'])  # Use of @roles_required decorator
    def special_page():
        return render_template_string("""
            {% extends "base.html" %}
            {% block content %}
            <h2>{%trans%}Special Page{%endtrans%}</h2>
            {% endblock %}
            """)

    return app