示例#1
0
    def __init__(self,
                 app,
                 url_prefix="/admin",
                 title="flask-dashed",
                 main_dashboard=None,
                 endpoint='admin'):

        if not main_dashboard:
            from .dashboard import DefaultDashboard
            main_dashboard = DefaultDashboard

        self.blueprint = Blueprint(endpoint,
                                   __name__,
                                   static_folder='static',
                                   template_folder='templates')
        self.app = app
        self.url_prefix = url_prefix
        self.endpoint = endpoint
        self.title = title
        self.secure_functions = OrderedMultiDict()
        # Checks security for current path
        self.blueprint.before_request(
            lambda: self.check_path_security(request.path))

        self.app.register_blueprint(self.blueprint, url_prefix=url_prefix)
        self.root_nodes = []

        self._add_node(main_dashboard, '/', 'main-dashboard', 'dashboard')
        # Registers recursive_getattr filter
        self.app.jinja_env.filters['recursive_getattr'] = recursive_getattr
示例#2
0
def test_ordered_multidict_encoding():
    """"Make sure URLs are properly encoded from OrderedMultiDicts"""
    d = OrderedMultiDict()
    d.add('foo', 1)
    d.add('foo', 2)
    d.add('foo', 3)
    d.add('bar', 0)
    d.add('foo', 4)
    assert url_encode(d) == 'foo=1&foo=2&foo=3&bar=0&foo=4'
示例#3
0
 def __new__(cls, *args, **kwargs):
     if not cls.model:
         raise Exception('ModelAdminModule must provide `model` attribute')
     if not cls.list_fields:
         cls.list_fields = OrderedMultiDict()
         for column in cls.model.__table__._columns:
             cls.list_fields[column.name] = {
                 'label': column.name,
                 'column': getattr(cls.model, column.name)
             }
     if not cls.form_class:
         cls.form_class = model_form(cls.model, cls.db_session)
     return super(ModelAdminModule, cls).__new__(cls, *args, **kwargs)
示例#4
0
class UserModule(ModelAdminModule):
    model = User
    db_session = db_session
    profile_alias = aliased(Profile)

    list_fields = OrderedMultiDict((
        ('id', {
            'label': 'id',
            'column': User.id
        }),
        ('username', {
            'label': 'username',
            'column': User.username
        }),
        ('profile.name', {
            'label': 'name',
            'column': profile_alias.name
        }),
        ('profile.location', {
            'label': 'location',
            'column': profile_alias.location
        }),
    ))

    list_title = 'user list'

    searchable_fields = ['username', 'profile.name', 'profile.location']

    order_by = ('id', 'desc')

    list_query_factory = model.query\
           .outerjoin(profile_alias, 'profile')\
           .options(contains_eager('profile', alias=profile_alias))\

    form_class = UserForm

    def create_object(self):
        user = self.model()
        user.profile = Profile()
        return user
    class BookModule(ModelAdminModule):
        """Sample module with explicit eager loaded query.
        """
        model = Book
        db_session = db.session
        author_alias = aliased(Author)

        list_fields = OrderedMultiDict((
            ('id', {
                'label': 'id',
                'column': Book.id
            }),
            ('title', {
                'label': 'book title',
                'column': Book.title
            }),
            ('year', {
                'label': 'year',
                'column': Book.year
            }),
            ('author.name', {
                'label': 'author name',
                'column': author_alias.name
            }),
        ))
        list_title = 'books list'

        searchable_fields = ['title', 'author.name']

        order_by = ('id', 'asc')

        list_query_factory = model.query\
               .outerjoin(author_alias, 'author')\
               .options(contains_eager('author', alias=author_alias))\

        form_class = BookForm
示例#6
0
def custom_form_factory(form, field_types=None, field_slugs=None,
                        excluded_field_types=None,
                        registration_fields=False):
    fields = (CustomField.query.filter_by(meeting_id=g.meeting.id)
              .order_by(CustomField.sort))

    if field_types:
        fields = fields.filter(CustomField.field_type.in_(field_types))

    if field_slugs:
        fields = fields.filter(CustomField.slug.in_(field_slugs))

    if excluded_field_types:
        fields = fields.filter(
            ~CustomField.field_type.in_(excluded_field_types))

    if registration_fields:
        fields = fields.for_registration()

    if getattr(form, 'CUSTOM_FIELDS_TYPE', None):
        fields = fields.filter_by(custom_field_type=form.CUSTOM_FIELDS_TYPE)

    form_attrs = {
        '_custom_fields': OrderedMultiDict({c.slug: c for c in fields}),
    }

    for f in fields:
        attrs = {'label': unicode(CustomFieldLabel(f.label)),
                 'validators': [],
                 'render_kw': {},
                 'description': f.hint}

        data = _CUSTOM_FIELDS_MAP[f.field_type.code]

        # overwrite data if _CUSTOM_FIELDS_MAP attribute is present on form
        form_fields_map = getattr(form, '_CUSTOM_FIELDS_MAP', None)
        if form_fields_map:
            try:
                data = form_fields_map[f.field_type.code]
            except KeyError:
                pass

        if f.required:
            attrs['validators'].append(DataRequired())
        attrs['validators'].extend(data.get('validators', []))

        if f.max_length:
            attrs['validators'].append(Length(max=f.max_length))

        if f.field_type.code == CustomField.SELECT:
            query = CustomFieldChoice.query.filter_by(custom_field=f)
            attrs['choices'] = [(unicode(c.value), __(c.value.english))
                                for c in query]
            if not f.required:
                attrs['choices'] = [('', '---')] + attrs['choices']
            if f.slug == 'title':
                attrs['choices'] = [choice for choice in attrs['choices']
                                    if choice[0] in app.config['TITLE_CHOICES']]
            attrs['coerce'] = unicode

        if f.field_type.code == CustomField.LANGUAGE:
            attrs['choices'] = [i for i in Participant.LANGUAGE_CHOICES
                                if i[0].lower() in app.config['TRANSLATIONS']]
            if not f.required:
                attrs['choices'] = [('', '---')] + attrs['choices']

            attrs['coerce'] = unicode

        if f.field_type.code == CustomField.CATEGORY:
            query = Category.get_categories_for_meeting(
                form.CUSTOM_FIELDS_TYPE)
            if registration_fields:
                query = query.filter_by(visible_on_registration_form=True)
            attrs['choices'] = [(c.id, c) for c in query]
            attrs['coerce'] = int

        if f.field_type.code in (CustomField.MULTI_CHECKBOX, CustomField.RADIO):
            query = CustomFieldChoice.query.filter_by(custom_field=f)
            attrs['choices'] = [(unicode(c.value), c.value) for c in query]
            attrs['coerce'] = unicode

        if f.field_type.code == CustomField.IMAGE and f.photo_size and f.photo_size.code:
            attrs['render_kw']["data-photoSize"] = f.photo_size.code
            for coord in ("x1", "y1", "x2", "y2"):
                form_attrs['%s_%s_' % (f.slug, coord)] = HiddenField(default=0)

        # set field to form
        # _set_rules_for_custom_fields(f, attrs)
        field = data['field'](**attrs)
        setattr(field, 'field_type', f.field_type.code)
        form_attrs[f.slug] = field

    form_attrs['rules'] = Rule.get_rules_for_fields(fields)
    return type(form)(form.__name__, (form,), form_attrs)
示例#7
0
 def __init__(self, *args, **kwargs):
     super(AdminModule, self).__init__(*args, **kwargs)
     self.rules = OrderedMultiDict()
     self._register_rules()