def configure_admin_panel(app): # Admin panel LOGIN_ENABLED = app.config['LOGIN_ENABLED'] if LOGIN_ENABLED: from conekt.controllers.admin.views import MyAdminIndexView from conekt.controllers.admin.views.ecc import ECCView from conekt.controllers.admin.views.sequences import AddSequenceDescriptionsView from conekt.controllers.admin.views.expression_profiles import AddExpressionProfilesView from conekt.controllers.admin.views.expression_networks import AddCoexpressionNetworkView from conekt.controllers.admin.views.expression_networks import ExpressionNetworkMethodAdminView from conekt.controllers.admin.views.expression_specificity import AddSpecificityView from conekt.controllers.admin.views.expression_specificity import ConditionTissueAdminView from conekt.controllers.admin.views.expression_specificity import ExpressionSpecificityMethodAdminView from conekt.controllers.admin.views.go_interpro import AddInterProView from conekt.controllers.admin.views.go_interpro import AddGOView from conekt.controllers.admin.views.go_interpro import AddFunctionalDataView from conekt.controllers.admin.views.go_interpro import GOEnrichmentView from conekt.controllers.admin.views.go_interpro import PredictGOView from conekt.controllers.admin.views.families import AddFamiliesView, AddFamilyAnnotationView from conekt.controllers.admin.views.families import GeneFamilyMethodAdminView from conekt.controllers.admin.views.species import AddSpeciesView from conekt.controllers.admin.views.species import SpeciesAdminView from conekt.controllers.admin.views.trees import AddTreesView from conekt.controllers.admin.views.expression_clusters import BuildNeighorhoodToClustersView from conekt.controllers.admin.views.expression_clusters import BuildCoexpressionClustersView from conekt.controllers.admin.views.expression_clusters import AddCoexpressionClustersView from conekt.controllers.admin.views.expression_clusters import ClusterSimilaritiesView from conekt.controllers.admin.views.expression_clusters import CoexpressionClusteringMethodAdminView from conekt.controllers.admin.views.clades import AddCladesView from conekt.controllers.admin.views.clades import CladesAdminView from conekt.controllers.admin.views.xrefs import AddXRefsFamiliesView from conekt.controllers.admin.views.xrefs import AddXRefsView from conekt.controllers.admin.views.controls import ControlsView from conekt.controllers.admin.views.news import NewsAdminView from conekt.controllers.admin.views.trees import TreeMethodAdminView from conekt.controllers.admin.views.trees import ReconcileTreesView from conekt.models.users import User from conekt.models.species import Species from conekt.models.gene_families import GeneFamilyMethod from conekt.models.expression.coexpression_clusters import CoexpressionClusteringMethod from conekt.models.expression.networks import ExpressionNetworkMethod from conekt.models.expression.specificity import ExpressionSpecificityMethod from conekt.models.condition_tissue import ConditionTissue from conekt.models.clades import Clade from conekt.models.news import News from conekt.models.trees import TreeMethod admin = Admin(template_mode='bootstrap3', base_template='admin/my_base.html') admin.init_app(app, index_view=MyAdminIndexView(template='admin/home.html')) # Add views used to build the database admin.add_view(AddSpeciesView(name='Species', endpoint='admin.add.species', url='add/species/', category='Add')) admin.add_view(AddSequenceDescriptionsView(name='Sequence Descriptions', endpoint='admin.add.sequence_descriptions', url='add/sequence_descriptions/', category='Add')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Add') admin.add_menu_item(MenuLink("Functional Annotation", class_name="disabled", url="#"), target_category='Add') admin.add_view(AddFunctionalDataView(name='GO and InterPro definitions', endpoint='admin.add.functional_data', url='add/functional_data/', category='Add')) admin.add_view(AddGOView(name='GO Genes', endpoint='admin.add.go_sequences', url='add/go/', category='Add')) admin.add_view(AddInterProView(name='InterPro Genes', endpoint='admin.add.interpro_sequences', url='add/interpro/', category='Add')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Add') admin.add_menu_item(MenuLink("Expression", class_name="disabled", url="#"), target_category='Add') admin.add_view(AddExpressionProfilesView(name='Expression profiles', endpoint='admin.add.expression_profiles', url='add/expression_profiles/', category='Add')) admin.add_view(AddCoexpressionNetworkView(name='Coexpression network', endpoint='admin.add.coexpression_network', url='add/coexpression_network/', category='Add')) admin.add_view(AddCoexpressionClustersView(name='Coexpression clusters', endpoint='admin.add.coexpression_clusters', url='add/coexpression_clusters/', category='Add')) admin.add_view(AddSpecificityView(name='Expression Specificity', endpoint='admin.add.expression_specificity', url='add/expression_specificity/', category='Add')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Add') admin.add_menu_item(MenuLink("Comparative Genomics", class_name="disabled", url="#"), target_category='Add') admin.add_view(AddFamiliesView(name='Gene Families', endpoint='admin.add.families', url='add/families/', category='Add')) admin.add_view(AddTreesView(name='Trees', endpoint='admin.add.trees', url='add/trees/', category='Add')) admin.add_view(AddCladesView(name='Clades', endpoint='admin.add.clades', url='add/clades/', category='Add')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Add') admin.add_menu_item(MenuLink("Misc.", class_name="disabled", url="#"), target_category='Add') admin.add_view(AddXRefsView(name='XRefs Genes', endpoint='admin.add.xrefs', url='add/xrefs/', category='Add')) admin.add_view(AddXRefsFamiliesView(name='XRefs Families', endpoint='admin.add.xrefs_families', url='add/xrefs_families/', category='Add')) # Build Menu admin.add_menu_item(MenuLink("Update Counts", url="/admin_controls/update/counts", class_name="confirmation"), target_category='Build') admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Build') admin.add_menu_item(MenuLink("Assign Clades", url="/admin_controls/update/clades", class_name="confirmation"), target_category='Build') admin.add_view(AddFamilyAnnotationView(name='Family-wise annotation', endpoint='admin.add.family_annotation', url='build/family_annotation/', category='Build')) admin.add_view(ReconcileTreesView(name='Reconcile Trees', endpoint='admin.reconcile_trees', url='build/reconciled_trees', category='Build')) admin.add_view(ECCView(name='Expression Context Conservations (ECC)', endpoint='admin.ecc', url='build/ecc/', category='Build')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Build') admin.add_menu_item(MenuLink("Co-expression Clusters", class_name="disabled", url="#"), target_category='Build') admin.add_view(ClusterSimilaritiesView(name='Cluster Similarities', endpoint='admin.clustersimilarities', url='build/cluster_similarities/', category='Build')) admin.add_view(GOEnrichmentView(name='Cluster GO Enrichment', endpoint='admin.goenrichment', url='build/go_enrichment/', category='Build')) admin.add_view(BuildCoexpressionClustersView(name='HCCA Clusters', endpoint='admin.build.hcca_clusters', url='build/hcca_clusters/', category='Build')) admin.add_view(BuildNeighorhoodToClustersView(name='Neighborhood to clusters', endpoint='admin.build.neighborhood_to_clusters', url='build/neighborhood_to_clusters/', category='Build')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Build') admin.add_view(PredictGOView(name='Predict GO from neighborhood', endpoint='admin.predict.go', url='predict/go', category='Build')) # Control panel admin.add_view(ControlsView(name='Controls', endpoint='admin.controls', url='controls/')) # CRUD for various database tables admin.add_view(NewsAdminView(News, db.session, endpoint='admin.news', url='news', category='Browse')) admin.add_view(SpeciesAdminView(Species, db.session, url='species', category='Browse')) admin.add_view(CladesAdminView(Clade, db.session, url='clades', category='Browse', name='Clades')) admin.add_view(ConditionTissueAdminView(ConditionTissue, db.session, url='condition_tissue/', category="Browse", name='Condition to Tissue')) admin.add_menu_item(MenuLink("------------", class_name="divider", url='#'), target_category='Browse') admin.add_menu_item(MenuLink("Methods", class_name="disabled", url="#"), target_category='Browse') admin.add_view(GeneFamilyMethodAdminView(GeneFamilyMethod, db.session, url='families', category="Browse", name='Gene Families')) admin.add_view(TreeMethodAdminView(TreeMethod, db.session, url='trees', category="Browse", name='Tree Methods')) admin.add_view(ExpressionNetworkMethodAdminView(ExpressionNetworkMethod, db.session, url='networks', category="Browse", name='Expression Networks')) admin.add_view(CoexpressionClusteringMethodAdminView(CoexpressionClusteringMethod, db.session, url='clusters', category="Browse", name='Coexpression Clustering')) admin.add_view(ExpressionSpecificityMethodAdminView(ExpressionSpecificityMethod, db.session, url='specificity', category="Browse", name='Expression Specificity'))
@expose('/') def index(self): return self.render('send_email.html') can_delete = False def is_accessible(self): return current_user.has_roles('Admin') # these are the views needed to display tables in the Admin section admin.add_view(MyModelView(User, db.session)) admin.add_view(MyModelView6(Role, db.session)) admin.add_view(MyModelView2(Employee, db.session)) admin.add_view(MyModelView5(Todo, db.session)) admin.add_view(AdminViewStore(Store, db.session)) admin.add_view(AdminViewClass(Course, db.session)) admin.add_view(AdminViewClass4(Grade, db.session)) admin.add_menu_item(MenuLink(name='Main Site', url='/', category="Links")) admin.add_view(hreditor(hrfiles, db.session)) admin.add_view(MyModelView8(Incidentnumbers, db.session, category="Paul")) admin.add_view(MyModelView9(Saltlog, db.session)) admin.add_view(MyModelViewReclaim(reclaimtank, db.session, category="Paul")) admin.add_view(MyModelView10(cwmaintenance, db.session, category="Paul")) #admin.add_view(MyModelView11(Employee, db.session)) admin.add_view(EmailView(name='Email', endpoint='email')) #admin.add_sub_category(name = "Links", parent_name="Team") from flaskblog import routes
def create_app(config, register_blueprints=True): app = Flask(__name__) app.config.from_object(config) convention = { "ix": 'ix_%(column_0_label)s', "uq": "uq_%(table_name)s_%(column_0_name)s", "ck": "ck_%(table_name)s_%(constraint_name)s", "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", "pk": "pk_%(table_name)s" } MetaData(naming_convention=convention) db.init_app(app) #app.config['PROFILE'] = True #app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[30]) # This needs to be after db is instantiated for migrate to discover from portal.user.models import Role, User from portal.account.models import Account from portal.vps.models import Vps from portal.vendor.models import Vendor from portal.transfer.models import Transfer from portal.bank_account.models import BankAccount from portal.permission.models import Permission Migrate(app, db) db_adapter = SQLAlchemyAdapter(db, User) UserManager(db_adapter, app) Compress(app) #DebugToolbarExtension(app) cache.init_app(app, config={'CACHE_TYPE': 'simple'}) babel = Babel(app) # Monkeypatching Flask-babel babel.domain = 'flask_user' babel.translation_directories = 'translations' # All the translation should be done using Flask_Babelex's lazy_gettext as # opposed to flask_admin.babel's. The latter is referencing the domain # flask_admin. @babel.localeselector def get_locale(): if request.args.get('lang'): session['lang'] = request.args.get('lang') return session.get('lang', 'en') class JSONEncoder(BaseEncoder): """so/questions/26124581/flask-json-serializable-error-because-of-flask-babel """ def default(self, o): if isinstance(o, _LazyString): return text_type(o) return BaseEncoder.default(self, o) app.json_encoder = JSONEncoder @app.route('/') def default_page(): if is_authenticated(): return redirect(url_for('user.member_page')) return redirect(url_for('user.home_page')) def get_account_view_endpoint(suffix=None): """Returns 'ROLE_account.X' based on current_user """ if not is_authenticated(): raise Exception("Attempt to call get_account_view_endpoint without authentication") assert len(current_user.roles) == 1, 'User has more than 1 role!' if suffix: return '%s_account.%s' % (current_user.roles[0].name, suffix) return '%s_account' % current_user.roles[0].name class RegexConverter(BaseConverter): def __init__(self, url_map, *items): super(RegexConverter, self).__init__(url_map) self.regex = items[0] app.url_map.converters['regex'] = RegexConverter @app.context_processor def inject_admin_views(): return dict(is_heroku=issubclass(config, HerokuConfig), # isinstance doesn't work admin_view=root.index_view, h=admin_helpers, get_url=url_for, get_account_view_endpoint=get_account_view_endpoint) @app.template_filter() def format_currency(value): try: return "{:,.2f}".format(value) except ValueError: return value @app.template_filter() def to_hktz(value): if value: return value.astimezone(pytz.timezone('Asia/Hong_Kong')) @app.template_filter() def format_datetime(value): if value: return value.strftime('%m/%d %H:%M') if register_blueprints: # prevent cyclical imports from portal.user.views import user_blueprint from portal.access.views import access_blueprint from portal.api.eve import eve_blueprint from portal.api.prometheus import prometheus_blueprint app.register_blueprint(user_blueprint, url_prefix='/user') app.register_blueprint(access_blueprint, url_prefix='/access') app.register_blueprint(eve_blueprint, url_prefix='/eve') app.register_blueprint(prometheus_blueprint, url_prefix='/prometheus') root = Admin(app, name='Portal', url='/', template_mode='bootstrap3') root.add_menu_item(RoleBasedMenuLink(name=lazy_gettext('Budget'), endpoint='user.budget', roles=[RolesEnum.CLIENT.value])) root.add_menu_item(RoleBasedMenuLink(name=lazy_gettext('Appointments'), endpoint='user.appointments', roles=[RolesEnum.CLIENT.value])) from portal.admin.views import UserModelView, RoleModelView root.add_view(UserModelView(User, db.session, category=lazy_gettext('User'), endpoint='admin_user')) root.add_view(RoleModelView(Role, db.session, category=lazy_gettext('User'), endpoint='admin_role')) from portal.account.views import account_blueprint, AdminAccountModelView, \ TechnicianAccountModelView, SupportAccountModelView, ClientAccountModelView app.register_blueprint(account_blueprint, url_prefix='/account') ac = lazy_gettext('Account') root.add_view(AdminAccountModelView( Account, db.session, category=ac, name=lazy_gettext('Account (Admin)'), endpoint='admin_account')) root.add_view(SupportAccountModelView( Account, db.session, category=ac, name=lazy_gettext('Account (Support)'), endpoint='support_account')) root.add_view(TechnicianAccountModelView( Account, db.session, category=ac, name=lazy_gettext('Account (Technician)'), endpoint='technician_account')) root.add_view(ClientAccountModelView( Account, db.session, category=ac, name=lazy_gettext('Account (Client)'), endpoint='client_account')) root.add_link(UsernameBasedMenuLink( name=lazy_gettext('Batch Add'), category=ac, url='/account/handson_batch', usernames=['vincent', 'kevin', 'liang', 'bang'])) from portal.vps.views import VpsModelView c = lazy_gettext('Vps') v = VpsModelView(Vps, db.session, endpoint='vps', category=c) root.add_view(v) root.add_link(RoleBasedMenuLink( name=lazy_gettext('Create'), category=c, endpoint='vps.create_view', roles=v.get_accessible_roles())) c = lazy_gettext('Vendor') from portal.vendor.views import VendorModelView v = VendorModelView(Vendor, db.session, endpoint='vendor', category=c) root.add_view(v) from portal.permission.views import PermissionModelView v = PermissionModelView(Permission, db.session, endpoint='permission', category=c) root.add_view(v) c = lazy_gettext('Finance') from portal.bank_account.views import BankAccountModelView v = BankAccountModelView(BankAccount, db.session, endpoint='bank_account', category=c) root.add_view(v) from portal.transfer.views import TransferModelView v = TransferModelView(Transfer, db.session, endpoint='transfer', category=c) root.add_view(v) return app
def __repr__(self): return '<%r>' % self.name class MyModelView(ModelView): def is_accessible(self): if current_user.is_authenticated and session.get('role') == "admin": return True column_exclude_list = 'tokens' column_display_pk = True admin.add_view(MyModelView(User, db.session)) admin.add_view(MyModelView(Request, db.session)) admin.add_menu_item(MenuLink(name='Real Home Page', url='/')) admin.add_menu_item(MenuLink(name='Requests', url='/requests')) # Adding request for testing purposes req1 = Request(start_date='2019.01.20', finish_date='2019.01.22', sum=2) cat0 = Category(name='Default', days=20) cat1 = Category(name='Young', days=25) cat2 = Category(name='Middle age', days=30) cat3 = Category(name='Old', days=35) stat1 = Status(name='Pending') stat2 = Status(name='Approved') stat3 = Status(name='Declined') db.session.add(req1) db.session.add(cat0)
class CategoryModelView(MyModelView): column_editable_list = ['title'] column_labels = dict(title='Название', dishes='Блюда') form_args = { 'title': { 'label': 'Название', 'validators': [DataRequired(message="Необходимо ввести название категории")] }, 'dishes': { 'label': 'Блюда', }, } admin = Admin(app, "Панель управления", "/sadmin/") admin.add_view(UserModelView(User, db.session, "Пользователи", "Магазин")) admin.add_view(OrderModelView(Order, db.session, "Заказы", "Магазин")) admin.add_view(DishModelView(Dish, db.session, "Товары", "Магазин")) admin.add_view(CategoryModelView(Category, db.session, "Категории", "Магазин")) admin.add_menu_item(MyMenuLink("Перейти на сайт", "/"), "Управление") admin.add_menu_item(MyMenuLink("Войти в аккаунт", "/account/"), "Управление") admin.add_menu_item(MyMenuLink("Вход/выход", "/logout"), "Управление") admin.add_menu_item(MyMenuLink("Создать/обновить БД", "/upgradedb/gdrgr/"), "База данных") admin.add_menu_item(MyMenuLink("Загрузить данные в чистую БД", "/loaddb/"), "База данных")