You've already forked Mailu
							
							
				mirror of
				https://github.com/Mailu/Mailu.git
				synced 2025-10-30 23:37:43 +02:00 
			
		
		
		
	Setup a basic flask-admin interface
This commit is contained in:
		
							
								
								
									
										16
									
								
								admin/freeposte/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								admin/freeposte/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| from flask import Flask | ||||
| from flask_sqlalchemy import SQLAlchemy | ||||
|  | ||||
|  | ||||
|  | ||||
| # Create application | ||||
| app = Flask(__name__) | ||||
|  | ||||
| app.config.update({ | ||||
|     'SQLALCHEMY_DATABASE_URI': 'sqlite:////tmp/freeposte.db' | ||||
| }) | ||||
|  | ||||
| # Create the database | ||||
| db = SQLAlchemy(app) | ||||
|  | ||||
| from freeposte import views | ||||
							
								
								
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/__init__.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/__init__.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/models.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/models.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/views.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								admin/freeposte/__pycache__/views.cpython-35.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										34
									
								
								admin/freeposte/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								admin/freeposte/models.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| from freeposte import db | ||||
|  | ||||
|  | ||||
| class Domain(db.Model): | ||||
|     id = db.Column(db.Integer, primary_key=True) | ||||
|     name = db.Column(db.String(80)) | ||||
|     max_users = db.Column(db.Integer) | ||||
|     max_aliases = db.Column(db.Integer) | ||||
|  | ||||
|     def __str__(self): | ||||
|         return self.name | ||||
|  | ||||
|  | ||||
| class User(db.Model): | ||||
|     id = db.Column(db.Integer, primary_key=True) | ||||
|     username = db.Column(db.String(80)) | ||||
|     domain_id = db.Column(db.Integer, db.ForeignKey(Domain.id)) | ||||
|     domain = db.relationship(Domain, backref='users') | ||||
|     password = db.Column(db.String(255)) | ||||
|     quota_bytes = db.Column(db.Integer()) | ||||
|  | ||||
|     def __str__(self): | ||||
|         return '{0}@{1}'.format(self.username, self.domain.name) | ||||
|  | ||||
|  | ||||
| class Alias(db.Model): | ||||
|     id = db.Column(db.Integer, primary_key=True) | ||||
|     localpart = db.Column(db.String(80)) | ||||
|     domain_id = db.Column(db.Integer, db.ForeignKey(Domain.id)) | ||||
|     domain = db.relationship(Domain, backref='aliases') | ||||
|     destination = db.Column(db.String()) | ||||
|  | ||||
|     def __str__(self): | ||||
|         return '{0}@{1}'.format(self.username, self.domain.name) | ||||
							
								
								
									
										26
									
								
								admin/freeposte/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								admin/freeposte/views.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| import flask_admin as admin | ||||
| from flask_admin.contrib import sqla | ||||
|  | ||||
| from freeposte import app, db, models | ||||
|  | ||||
|  | ||||
| # Flask admin | ||||
| admin = admin.Admin(app, name='Freeposte.io', template_mode='bootstrap3') | ||||
|  | ||||
|  | ||||
| class DomainModelView(sqla.ModelView): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class UserModelView(sqla.ModelView): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class AliasModelView(sqla.ModelView): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| # Add views | ||||
| admin.add_view(DomainModelView(models.Domain, db.session)) | ||||
| admin.add_view(UserModelView(models.User, db.session)) | ||||
| admin.add_view(AliasModelView(models.Alias, db.session)) | ||||
							
								
								
									
										2
									
								
								admin/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								admin/requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| Flask | ||||
| Flask-SQLAlchemy | ||||
							
								
								
									
										5
									
								
								admin/run.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								admin/run.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| from freeposte import app | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     app.run(debug=True) | ||||
							
								
								
									
										7
									
								
								admin/testdb.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								admin/testdb.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| from freeposte import db, models | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     db.drop_all() | ||||
|     db.create_all() | ||||
|     db.session.commit() | ||||
| @@ -3,8 +3,14 @@ connect = /data/freeposte.db | ||||
|  | ||||
| # Return the user hashed password | ||||
| password_query = \ | ||||
|  SELECT password FROM users, domains WHERE username = '%n' AND domain = '%d' | ||||
|  SELECT password \ | ||||
|    FROM users INNER JOIN domains ON users.domain_id = domains.id \ | ||||
|   WHERE domains.name = '%d' \ | ||||
|     AND users.username = '%n' | ||||
|  | ||||
| # Mostly get the user quota | ||||
| user_query = \ | ||||
|  SELECT '*:bytes=' || quota_bytes AS quota_rule FROM users WHERE username = '%n' AND domain = '%d' | ||||
|  SELECT '*:bytes=' || users.quota_bytes AS quota_rule \ | ||||
|    FROM users INNER JOIN domains ON users.domain_id = domains.id \ | ||||
|   WHERE domains.name = '%d' \ | ||||
|     AND users.username = '%n' | ||||
|   | ||||
| @@ -1,2 +1,6 @@ | ||||
| dbpath = /data/freeposte.db | ||||
| query = SELECT destination FROM aliases WHERE localpart = '%u' AND domain = '%d' | ||||
| query = \ | ||||
|  SELECT destination  \ | ||||
|    FROM aliases INNER JOIN domains ON aliases.domain_id = domains.id \ | ||||
|   WHERE domains.name = '%d' \ | ||||
|     AND aliases.localpart = '%n' | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| dbpath = /data/freeposte.db | ||||
| query = SELECT domain FROM domains WHERE domain='%s' | ||||
| query = SELECT name FROM domains WHERE domain='%s' | ||||
|   | ||||
		Reference in New Issue
	
	Block a user