Refactor (settings database, etc...)
This commit is contained in:
		
							parent
							
								
									d514722fa7
								
							
						
					
					
						commit
						aef608aa10
					
				|  | @ -48,20 +48,12 @@ TEMPLATEDIR = check_setting_str(CFG, 'General', 'TEMPLATEDIR', os.path.join(os.g | |||
| MAIN_DIR = check_setting_str(CFG, 'General', 'MAIN_DIR', os.getcwd()) | ||||
| PORT = check_setting_int(CFG, 'General', 'PORT', 8083) | ||||
| NEWEST_BOOKS = check_setting_str(CFG, 'General', 'NEWEST_BOOKS', 60) | ||||
| RANDOM_BOOKS = check_setting_int(CFG, 'General', 'RANDOM_BOOKS', 6) | ||||
| RANDOM_BOOKS = check_setting_int(CFG, 'General', 'RANDOM_BOOKS', 4) | ||||
| ALL_BOOKS = check_setting_str(CFG, 'General', 'ALL_BOOKS', 100) | ||||
| 
 | ||||
| CheckSection('Mail') | ||||
| MAIL_SERVER = check_setting_str(CFG, 'Mail', 'MAIL_SERVER', 'mail.example.com') | ||||
| MAIL_LOGIN = check_setting_str(CFG, 'Mail', 'MAIL_LOGIN', "mail@example.com") | ||||
| MAIL_PASSWORD = check_setting_str(CFG, 'Mail', 'MAIL_PASSWORD', "mypassword") | ||||
| MAIL_PORT = check_setting_int(CFG, 'Mail', 'MAIL_PORT', 25) | ||||
| MAIL_FROM = check_setting_str(CFG, 'Mail', 'MAIL_FROM', "library automailer <mail@example.com>") | ||||
| 
 | ||||
| CheckSection('Advanced') | ||||
| TITLE_REGEX = check_setting_str(CFG, 'Advanced', 'TITLE_REGEX', '^(Der|Die|Das|Ein|Eine)\s+') | ||||
| DEVELOPMENT = bool(check_setting_int(CFG, 'Advanced', 'DEVELOPMENT', 1)) | ||||
| FIRST_RUN = bool(check_setting_int(CFG, 'Advanced', 'FIRST_RUN', 1)) | ||||
| 
 | ||||
| SYS_ENCODING="UTF-8" | ||||
| 
 | ||||
|  | @ -73,13 +65,7 @@ configval["PORT"] = PORT | |||
| configval["NEWEST_BOOKS"] = NEWEST_BOOKS | ||||
| configval["ALL_BOOKS"] = ALL_BOOKS | ||||
| configval["DEVELOPMENT"] = DEVELOPMENT | ||||
| configval["MAIL_SERVER"] = MAIL_SERVER | ||||
| configval["MAIL_FROM"] = MAIL_FROM | ||||
| configval["MAIL_PORT"] = MAIL_PORT | ||||
| configval["MAIL_LOGIN"] = MAIL_LOGIN | ||||
| configval["MAIL_PASSWORD"] = MAIL_PASSWORD | ||||
| configval["TITLE_REGEX"] = TITLE_REGEX | ||||
| configval["FIRST_RUN"] = FIRST_RUN | ||||
| 
 | ||||
| def save_config(configval): | ||||
|     new_config = ConfigObj() | ||||
|  | @ -91,16 +77,9 @@ def save_config(configval): | |||
|     new_config['General']['PORT'] = configval["PORT"] | ||||
|     new_config['General']['NEWEST_BOOKS'] = configval["NEWEST_BOOKS"] | ||||
|     new_config['General']['ALL_BOOKS'] = configval["ALL_BOOKS"] | ||||
|     new_config['Mail'] = {} | ||||
|     new_config['Mail']['MAIL_PORT'] = int(configval["MAIL_PORT"]) | ||||
|     new_config['Mail']['MAIL_SERVER'] = configval["MAIL_SERVER"] | ||||
|     new_config['Mail']['MAIL_FROM'] = configval["MAIL_FROM"] | ||||
|     new_config['Mail']['MAIL_LOGIN'] = configval["MAIL_LOGIN"] | ||||
|     new_config['Mail']['MAIL_PASSWORD'] = configval["MAIL_PASSWORD"] | ||||
|     new_config['Advanced'] = {} | ||||
|     new_config['Advanced']['TITLE_REGEX'] = configval["TITLE_REGEX"] | ||||
|     new_config['Advanced']['DEVELOPMENT'] = int(configval["DEVELOPMENT"]) | ||||
|     new_config['Advanced']['FIRST_RUN'] = int(configval["FIRST_RUN"]) | ||||
|     new_config.write() | ||||
|     return "Saved" | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ def update_download(book_id, user_id): | |||
|         ub.session.commit() | ||||
| 
 | ||||
| def make_mobi(book_id): | ||||
|     kindlegen = os.path.join(config.MAIN_DIR, "kindlegen") | ||||
|     kindlegen = os.path.join(config.MAIN_DIR, "vendor", "kindlegen") | ||||
|     if not os.path.exists(kindlegen): | ||||
|         return False | ||||
|     book = db.session.query(db.Books).filter(db.Books.id == book_id).first() | ||||
|  | @ -54,9 +54,10 @@ def send_mail(book_id, kindle_mail): | |||
| 
 | ||||
|     is_mobi = False | ||||
|     is_epub = False | ||||
|     settings = ub.get_mail_settings() | ||||
|     # create MIME message | ||||
|     msg = MIMEMultipart() | ||||
|     msg['From'] = config.MAIL_FROM | ||||
|     msg['From'] = settings["mail_from"] | ||||
|     msg['To'] = kindle_mail | ||||
|     msg['Subject'] = 'Sent to Kindle' | ||||
|     text = 'This email has been automatically sent by library.' | ||||
|  | @ -93,10 +94,10 @@ def send_mail(book_id, kindle_mail): | |||
| 
 | ||||
|     # send email | ||||
|     try: | ||||
|         mail_server = smtplib.SMTP(host=config.MAIL_SERVER, | ||||
|                                       port=config.MAIL_PORT) | ||||
|         mail_server.login(config.MAIL_LOGIN, config.MAIL_PASSWORD) | ||||
|         mail_server.sendmail(config.MAIL_LOGIN, kindle_mail, msg) | ||||
|         mail_server = smtplib.SMTP(host=settings["mail_server"], | ||||
|                                       port=settings["mail_port"]) | ||||
|         mail_server.login(settings["mail_login"], settings["mail_password"]) | ||||
|         mail_server.sendmail(settings["mail_login"], kindle_mail, msg) | ||||
|         mail_server.close() | ||||
|     except smtplib.SMTPException: | ||||
|         traceback.print_exc() | ||||
|  |  | |||
							
								
								
									
										30
									
								
								cps/templates/email_edit.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								cps/templates/email_edit.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| {% extends "layout.html" %} | ||||
| {% block body %} | ||||
| <div class="discover"> | ||||
|   <h1>{{title}}</h1> | ||||
|   <form role="form" method="POST"> | ||||
|     <div class="form-group"> | ||||
|       <label for="mail_server">SMTP hostname</label> | ||||
|       <input type="text" class="form-control" name="mail_server" id="mail_server" value="{{content.mail_server}}"> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|       <label for="mail_port">SMTP port</label> | ||||
|       <input type="text" class="form-control" name="mail_port" id="mail_port" value="{{content.mail_port}}"> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|       <label for="mail_login">SMTP login</label> | ||||
|       <input type="text" class="form-control" name="mail_login" id="mail_login" value="{{content.mail_login}}"> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|       <label for="mail_password">SMTP password</label> | ||||
|       <input type="password" class="form-control" name="mail_password" id="mail_password" value="{{content.mail_password}}"> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|       <label for="mail_from">From e-mail</label> | ||||
|       <input type="text" class="form-control" name="mail_from" id="mail_from" value="{{content.mail_from}}"> | ||||
|     </div> | ||||
|     <button type="submit" class="btn btn-default">Submit</button> | ||||
|   </form> | ||||
| 
 | ||||
| </div> | ||||
| {% endblock %} | ||||
|  | @ -1,18 +1,14 @@ | |||
| {% extends "layout.html" %} | ||||
| {% block body %} | ||||
| <div class="discover"> | ||||
|   <h1>{{title}}</h1> | ||||
|   <div class="col-sm-10"> | ||||
|     <div class="btn btn-default"><a href="{{url_for('new_user')}}">create user</a></div> | ||||
|   </div> | ||||
|   </div> | ||||
|   <h2>{{title}}</h2> | ||||
|   <table class="table table-striped"> | ||||
|     <tr> | ||||
|         <th>nickname</th> | ||||
|         <th>email</th> | ||||
|         <th>kindle</th> | ||||
|         <th>dls</th> | ||||
|         <th>admin</th> | ||||
|         <th>Nickname</th> | ||||
|         <th>Email</th> | ||||
|         <th>Kindle</th> | ||||
|         <th>DLS</th> | ||||
|         <th>Admin</th> | ||||
|     </tr> | ||||
|     {% for user in content %} | ||||
|       <tr> | ||||
|  | @ -22,7 +18,27 @@ | |||
|         <td>{{user.downloads.count()}}</td> | ||||
|         <td>{% if user.role %}<span class="glyphicon glyphicon-ok"></span>{% else %}<span class="glyphicon glyphicon-remove"></span>{% endif %}</td> | ||||
|     {% endfor %} | ||||
|   </table> | ||||
|     <div class="btn btn-default"><a href="{{url_for('new_user')}}">Add new user</a></div> | ||||
|   <h2>SMTP mail settings</h2> | ||||
|   <table class="table table-striped"> | ||||
|     <tr> | ||||
|         <th>SMTP hostname</th> | ||||
|         <th>SMTP port</th> | ||||
|         <th>SMTP login</th> | ||||
|         <th>SMTP password</th> | ||||
|         <th>From mail</th> | ||||
|     </tr> | ||||
|       <tr> | ||||
|         <td>{{email.mail_server}}</td> | ||||
|         <td>{{email.mail_port}}</td> | ||||
|         <td>{{email.mail_login}}</td> | ||||
|         <td>********</td> | ||||
|         <td>{{email.mail_from}}</td> | ||||
| 
 | ||||
|   </table> | ||||
| 
 | ||||
|     <div class="btn btn-default"><a href="{{url_for('edit_mailsettings')}}">Change SMTP settings</a></div> | ||||
| 
 | ||||
|   </tabel> | ||||
| </div> | ||||
| {% endblock %} | ||||
|  |  | |||
							
								
								
									
										58
									
								
								cps/ub.py
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								cps/ub.py
									
									
									
									
									
								
							|  | @ -6,6 +6,7 @@ from sqlalchemy.ext.declarative import declarative_base | |||
| from sqlalchemy.orm import * | ||||
| import os | ||||
| from cps import config | ||||
| from werkzeug.security import generate_password_hash | ||||
| 
 | ||||
| dbpath = os.path.join(config.MAIN_DIR, "app.db") | ||||
| engine = create_engine('sqlite:///{0}'.format(dbpath), echo=False) | ||||
|  | @ -13,6 +14,7 @@ Base = declarative_base() | |||
| 
 | ||||
| ROLE_USER = 0 | ||||
| ROLE_ADMIN = 1 | ||||
| DEFAULT_PASS = "admin123" | ||||
| 
 | ||||
| class User(Base): | ||||
| 	__tablename__ = 'user' | ||||
|  | @ -101,7 +103,61 @@ class Whish(Base): | |||
| 	def __repr__(self): | ||||
| 		return '<Whish %r>' % (self.title) | ||||
| 
 | ||||
| Base.metadata.create_all(engine) | ||||
| class Settings(Base): | ||||
| 	__tablename__ = 'settings' | ||||
| 
 | ||||
| 	id = Column(Integer, primary_key=True) | ||||
| 	mail_server = Column(String) | ||||
| 	mail_port = Column(Integer, default = 25) | ||||
| 	mail_login = Column(String) | ||||
| 	mail_password = Column(String) | ||||
| 	mail_from = Column(String) | ||||
| 
 | ||||
| 	def __repr__(self): | ||||
| 		#return '<Smtp %r>' % (self.mail_server) | ||||
| 		pass | ||||
| 
 | ||||
| def create_default_config(): | ||||
| 	settings = Settings() | ||||
| 	settings.mail_server = "mail.example.com" | ||||
| 	settings.mail_port = 25 | ||||
| 	settings.mail_login = "mail@example.com" | ||||
| 	settings.mail_password = "mypassword" | ||||
| 	settings.mail_from = "automailer <mail@example.com>" | ||||
| 
 | ||||
| 	session.add(settings) | ||||
| 	session.commit() | ||||
| 
 | ||||
| def get_mail_settings(): | ||||
| 	settings = session.query(Settings).first() | ||||
| 
 | ||||
| 	if not settings: | ||||
| 	  return {} | ||||
| 
 | ||||
| 	data = { | ||||
| 	  'mail_server': settings.mail_server, | ||||
| 	  'mail_port': settings.mail_port, | ||||
| 	  'mail_login': settings.mail_login, | ||||
| 	  'mail_password': settings.mail_password, | ||||
| 	  'mail_from': settings.mail_from | ||||
| 	} | ||||
| 
 | ||||
| 	return data | ||||
| 
 | ||||
| def create_admin_user(): | ||||
| 	user = User() | ||||
| 	user.nickname = "admin" | ||||
| 	user.role = 1 | ||||
| 	user.password = generate_password_hash(DEFAULT_PASS) | ||||
| 
 | ||||
| 	session.add(user) | ||||
| 	session.commit() | ||||
| 
 | ||||
| Session = sessionmaker() | ||||
| Session.configure(bind=engine) | ||||
| session = Session() | ||||
| 
 | ||||
| if not os.path.exists(dbpath): | ||||
| 	Base.metadata.create_all(engine) | ||||
| 	create_default_config() | ||||
| 	create_admin_user() | ||||
|  |  | |||
							
								
								
									
										26
									
								
								cps/web.py
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								cps/web.py
									
									
									
									
									
								
							|  | @ -322,7 +322,10 @@ def logout(): | |||
| @app.route('/send/<int:book_id>') | ||||
| @login_required | ||||
| def send_to_kindle(book_id): | ||||
|     if current_user.kindle_mail: | ||||
|     settings = ub.get_mail_settings() | ||||
|     if settings.get("mail_server", "mail.example.com") == "mail.example.com": | ||||
|         flash("please configure your email account settings first...", category="error") | ||||
|     elif current_user.kindle_mail: | ||||
|         x = helper.send_mail(book_id, current_user.kindle_mail) | ||||
|         if x: | ||||
|             flash("mail successfully send to %s" % current_user.kindle_mail, category="success") | ||||
|  | @ -404,7 +407,8 @@ def profile(): | |||
| @login_required | ||||
| def user_list(): | ||||
|     content = ub.session.query(ub.User).all() | ||||
|     return render_template("user_list.html", content=content, title="User list") | ||||
|     settings = ub.session.query(ub.Settings).first() | ||||
|     return render_template("user_list.html", content=content, email=settings, title="User list") | ||||
| 
 | ||||
| @app.route("/admin/user/new", methods = ["GET", "POST"]) | ||||
| @login_required | ||||
|  | @ -424,6 +428,24 @@ def new_user(): | |||
|             flash(e, category="error") | ||||
|     return render_template("user_edit.html", content=content, title="User list") | ||||
| 
 | ||||
| @app.route("/admin/user/mailsettings", methods = ["GET", "POST"]) | ||||
| @login_required | ||||
| def edit_mailsettings(): | ||||
|     content = ub.session.query(ub.Settings).first() | ||||
|     if request.method == "POST": | ||||
|         to_save = request.form.to_dict() | ||||
|         content.mail_server = to_save["mail_server"] | ||||
|         content.mail_port = int(to_save["mail_port"]) | ||||
|         content.mail_login = to_save["mail_login"] | ||||
|         content.mail_password = to_save["mail_password"] | ||||
|         content.mail_from = to_save["mail_from"] | ||||
|         try: | ||||
|             ub.session.commit() | ||||
|             flash("Mail settings updated", category="success") | ||||
|         except (e): | ||||
|             flash(e, category="error") | ||||
|     return render_template("email_edit.html", content=content, title="Edit mail settings") | ||||
| 
 | ||||
| @app.route("/admin/user/<int:user_id>", methods = ["GET", "POST"]) | ||||
| @login_required | ||||
| def edit_user(user_id): | ||||
|  |  | |||
							
								
								
									
										0
									
								
								kindlegen → vendor/kindlegen
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								kindlegen → vendor/kindlegen
									
									
									
									
										vendored
									
									
								
							
							
								
								
									
										18
									
								
								wsgi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								wsgi.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| 
 | ||||
| import os | ||||
| import sys | ||||
| base_path = os.path.dirname(os.path.abspath(__file__)) | ||||
| 
 | ||||
| # Insert local directories into path | ||||
| sys.path.append(os.path.join(base_path, 'lib')) | ||||
| 
 | ||||
| from cps import web | ||||
| from cps import config | ||||
| 
 | ||||
| global title_sort | ||||
| 
 | ||||
| def title_sort(title): | ||||
|     return title | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     web.app.run(host="0.0.0.0",port=config.PORT, debug=True) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user