Как разделить вид модели по идентификатору с помощью Flask-admin? - PullRequest
0 голосов
/ 25 января 2019

Я создаю приложение оплаты за обучение с Flask и использую Flask-admin в качестве управления базой данных для каждой школы, которая зарегистрировалась в моем приложении.

Я уже сделал это, но теперь я действительно не уверен, как разделить доступ к данным между всеми учетными записями в школах, которые зарегистрировались для управления собственной оплатой за обучение.

С Flask-login , я могу сделать это с помощью этого кода:

@app.route('/school_admin')
@login_required
def school_admin():
    school_data = db.session.query(Student.id, Student.name).filter_by(school_id=current_user.id).all()
    return render_template('school_admin_dashboard.html', school_data=school_data)

Но, поскольку Flask-admin автоматически создает представления таблиц, я действительно не уверен, как это сделать ..?

Пока что я сделал ModelView следующим образом:

class SchoolAdminModelView(sqla.ModelView):
    def is_accessible(self):
        if not current_user.is_active or not current_user.is_authenticated:
            return False
        if current_user.has_role('schooladmin'):
            return True

        return False

    def _handle_view(self, name, **kwargs):
        if not self.is_accessible():
            if current_user.is_authenticated:
                # permission denied
                abort(403)
            else:
                # login
                return redirect(url_for('security.login', next=request.url))

class StudentModelView(SchoolAdminModelView):
    pass

admin.add_view(StudentModelView(Student, db.session))

Итак, как разделить модель вида по school_id ..?

ПРИМЕЧАНИЕ: моя причина, почему я использую Flask-admin вместо Flask-login для школьного администратора из-за довольно простого управления роли пользователя и суперпользователь . И я использую Flask-login для родителей учащегося, который является пользователем, который использует это приложение.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Ваш код почти работает @Joost, но я добавил к нему немного метода.

Я нашел решение здесь и немного его изменил, это кодкак разделить доступ к данным между различными школами следующим образом:

class StudentModelView(sqla.ModelView):
    def get_query(self):
        return Student.query.filter_by(school_id=current_user.id)

    def get_count_query(self):
        return self.session.query(func.count('*')).select_from(self.model).filter(
            Student.school_id == current_user.id
        )
0 голосов
/ 25 января 2019

Предполагая, что вошедший в систему пользователь имеет school_id, связанный с ним:

class SchoolAdminModelView(sqla.ModelView):
    def get_query(self):
        return super(SchoolAdminModelView, self).get_query().filter(School.id == current_user.school_id)

Он фильтрует запрос, который используется для генерации списка элементов в таблице.Возможно, вам придется немного подстроить его под свои нужды.

...