Advertisement
Guest User

Untitled

a guest
Mar 13th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.57 KB | None | 0 0
  1. import os
  2. import os.path as op
  3. from sqlalchemy.event import listens_for
  4. from jinja2 import Markup
  5. from flask import Flask, Blueprint, render_template, url_for, redirect, request, session, flash, abort
  6.  
  7.  
  8. from models import User, Role, Image, File
  9. from views import MyModelView, ImageView, FileView
  10. from forms import LoginForm, RegistrationForm
  11.  
  12. from flask_sqlalchemy import SQLAlchemy
  13. import flask_admin as admin
  14. import flask_login as login
  15. from flask_admin.contrib import sqla
  16. from flask_security import Security, SQLAlchemyUserDatastore, current_user, UserMixin, RoleMixin
  17. from werkzeug.security import generate_password_hash, check_password_hash
  18. from flask_admin import helpers, expose, form
  19. from wtforms import form, validators, fields
  20. from flask_admin import helpers as admin_helpers
  21.  
  22. # Create application
  23. app = Flask(__name__)
  24.  
  25. app.config['DATABASE_FILE'] = 'sample_db.sqlite'
  26. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
  27. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
  28. app.config['SECRET_KEY'] = 'thisissecret'
  29.  
  30. db = SQLAlchemy(app)
  31.  
  32. # Create directory for file fields to use
  33. file_path = op.join(op.dirname(__file__), 'static/images/menu-product')
  34. try:
  35. os.mkdir(file_path)
  36. except OSError:
  37. pass
  38.  
  39. '''
  40. def __init__(self, login, email, password, active):
  41. self.login = login
  42. self.email = email
  43. self.password = password
  44. self.active = active
  45. '''
  46.  
  47. # Setup Flask-Security
  48. user_datastore = SQLAlchemyUserDatastore(db, User, Role)
  49. security = Security(app, user_datastore)
  50.  
  51.  
  52. # Initialize flask-login
  53. def init_login():
  54. login_manager = login.LoginManager()
  55. login_manager.init_app(app)
  56.  
  57. # Create user loader function
  58. @login_manager.user_loader
  59. def load_user(user_id):
  60. return db.session.query(User).get(user_id)
  61.  
  62.  
  63. # Delete hooks for models, delete files if models are getting deleted
  64. @listens_for(File, 'after_delete')
  65. def del_file(mapper, connection, target):
  66. if target.path:
  67. try:
  68. os.remove(op.join(file_path, target.path))
  69. except OSError:
  70. # Don't care if was not deleted because it does not exist
  71. pass
  72.  
  73.  
  74. @listens_for(Image, 'after_delete')
  75. def del_image(mapper, connection, target):
  76. if target.path:
  77. # Delete image
  78. try:
  79. os.remove(op.join(file_path, target.path))
  80. except OSError:
  81. pass
  82.  
  83. # Delete thumbnail
  84. try:
  85. os.remove(op.join(file_path,
  86. admin.form.thumbgen_filename(target.path)))
  87. except OSError:
  88. pass
  89.  
  90.  
  91. # Create customized index view class that handles login & registration
  92. class MyAdminIndexView(admin.AdminIndexView):
  93. @expose('/')
  94. def index(self):
  95. if not login.current_user.is_authenticated:
  96. return redirect(url_for('.login_view'))
  97. return super(MyAdminIndexView, self).index()
  98.  
  99. @expose('/login/', methods=['GET', 'POST'])
  100. def login_view(self):
  101. # handle user login
  102. form = LoginForm(request.form)
  103.  
  104. if helpers.validate_form_on_submit(form):
  105. user = form.get_user()
  106. login.login_user(user)
  107.  
  108. if login.current_user.is_authenticated:
  109. return redirect(url_for('.index'))
  110. link = '<p>Don't have an account? <a href="' + url_for('.register_view') + '">Click here to register.</a></p>'
  111. self._template_args['form'] = form
  112. self._template_args['link'] = link
  113. return super(MyAdminIndexView, self).index()
  114.  
  115. @expose('/register/', methods=['GET', 'POST'])
  116. def register_view(self):
  117. form = RegistrationForm(request.form)
  118.  
  119. if helpers.validate_form_on_submit(form):
  120. user = User()
  121.  
  122. form.populate_obj(user)
  123. # we hash the users password to avoid saving it as plaintext in the db,
  124. # remove to use plain text:
  125. user.password = generate_password_hash(form.password.data)
  126.  
  127. db.session.add(user)
  128. db.session.commit()
  129.  
  130. login.login_user(user)
  131. return redirect(url_for('.index'))
  132. link = '<p>Already have an account? <a href="' + url_for('.login_view') + '">Click here to log in.</a></p>'
  133. self._template_args['form'] = form
  134. self._template_args['link'] = link
  135. return super(MyAdminIndexView, self).index()
  136.  
  137. @expose('/logout/')
  138. def logout_view(self):
  139. login.logout_user()
  140. return redirect(url_for('.index'))
  141.  
  142.  
  143. def common_args():
  144. name = 'Вхід'
  145. if login.current_user.is_authenticated:
  146. name = 'Кабінет' + ' ' + current_user.login
  147. return {'name': name}
  148.  
  149.  
  150. # Flask views
  151. @app.route('/')
  152. def index():
  153. return render_template('index.html', **common_args())
  154.  
  155.  
  156. @app.route('/menu')
  157. def menu():
  158. return render_template('project_templates/menu.html', **common_args())
  159.  
  160.  
  161. @app.route('/contacts')
  162. def contacts():
  163. return render_template('project_templates/contacts.html', **common_args())
  164.  
  165.  
  166. # Initialize flask-login
  167. init_login()
  168.  
  169. # Create admin
  170. admin = admin.Admin(app, index_view=MyAdminIndexView(), base_template='my_master.html')
  171.  
  172. # Add view
  173. admin.add_view(MyModelView(User, db.session, name='Shoppers'))
  174. admin.add_view(MyModelView(Role, db.session))
  175. admin.add_view(FileView(File, db.session))
  176. admin.add_view(ImageView(Image, db.session, name='Order'))
  177.  
  178.  
  179. # define a context processor for merging flask-admin's template context into the
  180. # flask-security views.
  181. @security.context_processor
  182. def security_context_processor():
  183. return dict(
  184. admin_base_template=admin.base_template,
  185. admin_view=admin.index_view,
  186. h=admin_helpers,
  187. get_url=url_for
  188. )
  189.  
  190.  
  191. def build_sample_db():
  192. """
  193. Populate a small db with some example entries.
  194. """
  195.  
  196. db.create_all()
  197.  
  198. with app.app_context():
  199. user_role = Role(name='user')
  200. super_user_role = Role(name='superuser')
  201. db.session.add(user_role)
  202. db.session.add(super_user_role)
  203. db.session.commit()
  204.  
  205. test_user = user_datastore.create_user(
  206. login='Admin',
  207. email='admin',
  208. password=generate_password_hash('admin'),
  209. roles=[super_user_role]
  210. )
  211. db.session.add(test_user)
  212. db.session.commit()
  213.  
  214. return
  215.  
  216.  
  217. if __name__ == '__main__':
  218. # Build a sample db on the fly, if one does not exist yet.
  219. app_dir = os.path.realpath(os.path.dirname(__file__))
  220. database_path = os.path.join(app_dir, app.config['DATABASE_FILE'])
  221. if not os.path.exists(database_path):
  222. build_sample_db()
  223.  
  224. # Start app
  225. app.run(debug=True)
  226.  
  227. from app import db
  228. from flask_security import UserMixin, RoleMixin
  229.  
  230.  
  231. # Create models
  232. class File(db.Model):
  233. __tablename__ = 'files'
  234.  
  235. id = db.Column(db.Integer, primary_key=True)
  236. name = db.Column(db.Unicode(64))
  237. path = db.Column(db.Unicode(128))
  238. price = db.Column(db.String(64))
  239.  
  240. def __unicode__(self):
  241. return self.name
  242.  
  243.  
  244. class Image(db.Model):
  245. __tablename__ = 'images'
  246.  
  247. id = db.Column(db.Integer, primary_key=True)
  248. name = db.Column(db.Unicode(64))
  249. path = db.Column(db.Unicode(128))
  250. price = db.Column(db.String(64))
  251.  
  252. def __unicode__(self):
  253. return self.name
  254.  
  255.  
  256. # Define models
  257. roles_users = db.Table(
  258. 'roles_users',
  259. db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
  260. db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
  261. )
  262.  
  263.  
  264. class Role(RoleMixin, db.Model):
  265. __tablename__ = 'roles'
  266.  
  267. id = db.Column(db.Integer(), primary_key=True)
  268. name = db.Column(db.String(80), unique=True)
  269. description = db.Column(db.String(255))
  270.  
  271. def __str__(self):
  272. return self.name
  273.  
  274.  
  275. class User(UserMixin, db.Model):
  276. __tablename__ = 'users'
  277.  
  278. id = db.Column(db.Integer, primary_key=True)
  279. login = db.Column(db.String(255))
  280. email = db.Column(db.String(50), unique=True)
  281. password = db.Column(db.String(100))
  282. active = db.Column(db.Boolean())
  283. registered_on = db.Column('registered_on', db.DateTime)
  284. roles = db.relationship('Role', secondary=roles_users,
  285. backref=db.backref('users', lazy='dynamic'))
  286.  
  287. # Flask-Login integration
  288. def is_authenticated(self):
  289. return True
  290.  
  291. def is_active(self):
  292. return True
  293.  
  294. def is_anonymous(self):
  295. return False
  296.  
  297. def get_id(self):
  298. return self.id
  299.  
  300. # Required for administrative interface
  301. def __unicode__(self):
  302. return self.login
  303.  
  304. def __repr__(self):
  305. return '<User %r>' % self.login
  306.  
  307. def __str__(self):
  308. return self.email
  309.  
  310. File "D:projectprobeprojectflaskapp.py", line 7, in <module>
  311. from models import User
  312. ImportError: cannot import name 'User'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement