def _value(self): if isinstance(self.data, (list, tuple)): return u','.join(as_unicode(v) for v in self.data) elif self.data: return as_unicode(self.data) else: return u''
def test_ajax_fk(): app, db, admin = setup() Model1, Model2 = create_models(db) view = CustomModelView( Model2, url='view', form_ajax_refs={'model1': { 'fields': ('test1', 'test2') }}) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(test1=u'first') model.save() model2 = Model1(test1=u'foo', test2=u'bar').save() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model needle = u'data-json="["%s", "first"]"' % as_unicode( model.id) ok_(needle in form.model1()) ok_(u'value="%s"' % as_unicode(model.id) in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data, u'[["%s", "foo"]]' % model2.id) # Check submitting client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = Model2.objects.first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def __init__(self, base_path, base_url, name=None, category=None, endpoint=None, url=None, verify_path=True): self.base_path = as_unicode(base_path) self.base_url = base_url self.init_actions() self._on_windows = platform.system() == 'Windows' # Convert allowed_extensions to set for quick validation if (self.allowed_extensions and not isinstance(self.allowed_extensions, set)): self.allowed_extensions = set(self.allowed_extensions) # Convert editable_extensions to set for quick validation if (self.editable_extensions and not isinstance(self.editable_extensions, set)): self.editable_extensions = set(self.editable_extensions) # Check if path exists if not op.exists(base_path): raise IOError('FileAdmin path "%s" does not exist or is not accessible' % base_path) super(FileAdmin, self).__init__(name, category, endpoint, url)
def __call__(self, field, **kwargs): kwargs['data-role'] = u'select2-ajax' kwargs['data-url'] = url_for('.ajax_lookup', name=field.loader.name) allow_blank = getattr(field, 'allow_blank', False) if allow_blank and not self.multiple: kwargs['data-allow-blank'] = u'1' kwargs.setdefault('id', field.id) kwargs.setdefault('type', 'hidden') if self.multiple: result = [] ids = [] for value in field.data: data = field.loader.format(value) result.append(data) ids.append(as_unicode(data[0])) separator = getattr(field, 'separator', ',') kwargs['value'] = separator.join(ids) kwargs['data-json'] = json.dumps(result) kwargs['data-multiple'] = u'1' else: data = field.loader.format(field.data) if data: kwargs['value'] = data[0] kwargs['data-json'] = json.dumps(data) return HTMLString('<input %s>' % html_params(name=field.name, **kwargs))
def _refresh_filters_cache(self): self._filters = self.get_filters() if self._filters: self._filter_groups = OrderedDict() self._filter_args = {} for i, flt in enumerate(self._filters): if flt.name not in self._filter_groups: self._filter_groups[flt.name] = [] self._filter_groups[flt.name].append( { "index": i, "arg": self.get_filter_arg(i, flt), "operation": as_unicode(flt.operation()), "options": flt.get_options(self) or None, "type": flt.data_type, } ) self._filter_args[self.get_filter_arg(i, flt)] = (i, flt) else: self._filter_groups = None self._filter_args = None
def _refresh_filters_cache(self): self._filters = self.get_filters() if self._filters: self._filter_groups = OrderedDict() self._filter_args = {} for i, flt in enumerate(self._filters): if flt.name not in self._filter_groups: self._filter_groups[flt.name] = [] self._filter_groups[flt.name].append({ 'index': i, 'arg': self.get_filter_arg(i, flt), 'operation': as_unicode(flt.operation()), 'options': flt.get_options(self) or None, 'type': flt.data_type }) self._filter_args[self.get_filter_arg(i, flt)] = (i, flt) else: self._filter_groups = None self._filter_args = None
def test_ajax_fk_multi(): app, db, admin = setup() class Model1(db.Model): __tablename__ = 'model1' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) def __str__(self): return self.name table = db.Table( 'm2m', db.Model.metadata, db.Column('model1_id', db.Integer, db.ForeignKey('model1.id')), db.Column('model2_id', db.Integer, db.ForeignKey('model2.id'))) class Model2(db.Model): __tablename__ = 'model2' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) model1_id = db.Column(db.Integer(), db.ForeignKey(Model1.id)) model1 = db.relationship(Model1, backref='models2', secondary=table) db.create_all() view = CustomModelView(Model2, db.session, url='view', form_ajax_refs={'model1': { 'fields': ['name'] }}) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(name=u'first') db.session.add_all([model, Model1(name=u'foo')]) db.session.commit() # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectMultipleField') with app.test_request_context('/admin/view/'): ok_(u'data-json="[]"' in form.model1()) form.model1.data = [model] ok_(u'data-json="[[1, "first"]]"' in form.model1()) # Check submitting client = app.test_client() client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = db.session.query(Model2).first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(len(mdl.model1), 1)
def test_ajax_fk(): app, db, admin = setup() Model1, Model2 = create_models(db) view = CustomModelView( Model2, db.session, url='view', form_ajax_refs={ 'model1': ('test1', 'test2') } ) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(u'first') model2 = Model1(u'foo', u'bar') db.session.add_all([model, model2]) db.session.commit() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model ok_(u'data-json="[%s, "first"]"' % model.id in form.model1()) ok_(u'value="1"' in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data.decode('utf-8'), u'[[%s, "foo"]]' % model2.id) # Check submitting req = client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = db.session.query(Model2).first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def handle_view_exception(self, exc): if isinstance(exc, ValidationError): flash(as_unicode(exc)) return True if self._debug: raise return False
def test_ajax_fk(): app, db, admin = setup() Model1, Model2 = create_models(db) view = CustomModelView(Model2, db.session, url='view', form_ajax_refs={'model1': ('test1', 'test2')}) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(u'first') model2 = Model1(u'foo', u'bar') db.session.add_all([model, model2]) db.session.commit() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model ok_(u'data-json="[%s, "first"]"' % model.id in form.model1()) ok_(u'value="1"' in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data.decode('utf-8'), u'[[%s, "foo"]]' % model2.id) # Check submitting req = client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = db.session.query(Model2).first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def __init__(self, base_path, base_url=None, name=None, category=None, endpoint=None, url=None, verify_path=True): """ Constructor. :param base_path: Base file storage location :param base_url: Base URL for the files :param name: Name of this view. If not provided, will default to the class name. :param category: View category :param endpoint: Endpoint name for the view :param url: URL for view :param verify_path: Verify if path exists. If set to `True` and path does not exist will raise an exception. """ self.base_path = as_unicode(base_path) self.base_url = base_url self.init_actions() self._on_windows = platform.system() == 'Windows' # Convert allowed_extensions to set for quick validation if (self.allowed_extensions and not isinstance(self.allowed_extensions, set)): self.allowed_extensions = set(self.allowed_extensions) # Convert editable_extensions to set for quick validation if (self.editable_extensions and not isinstance(self.editable_extensions, set)): self.editable_extensions = set(self.editable_extensions) # Check if path exists if not op.exists(base_path): raise IOError( 'FileAdmin path "%s" does not exist or is not accessible' % base_path) super(FileAdmin, self).__init__(name, category, endpoint, url)
def __init__(self, base_path, base_url, name=None, category=None, endpoint=None, url=None, verify_path=True): """ Constructor. :param base_path: Base file storage location :param base_url: Base URL for the files :param name: Name of this view. If not provided, will default to the class name. :param category: View category :param endpoint: Endpoint name for the view :param url: URL for view :param verify_path: Verify if path exists. If set to `True` and path does not exist will raise an exception. """ self.base_path = as_unicode(base_path) self.base_url = base_url self.init_actions() self._on_windows = platform.system() == 'Windows' # Convert allowed_extensions to set for quick validation if (self.allowed_extensions and not isinstance(self.allowed_extensions, set)): self.allowed_extensions = set(self.allowed_extensions) # Convert editable_extensions to set for quick validation if (self.editable_extensions and not isinstance(self.editable_extensions, set)): self.editable_extensions = set(self.editable_extensions) # Check if path exists if not op.exists(base_path): raise IOError('FileAdmin path "%s" does not exist or is not accessible' % base_path) super(FileAdmin, self).__init__(name, category, endpoint, url)
def get_filter_arg(self, index, flt): """ Given a filter `flt`, return a unique name for that filter in this view. Does not include the `flt[n]_` portion of the filter name. :param index: Filter index in _filters array :param flt: Filter instance """ if self.named_filter_urls: name = ('%s %s' % (flt.name, as_unicode(flt.operation()))).lower() name = filter_char_re.sub('', name) name = filter_compact_re.sub('_', name) return name else: return str(index)
def __call__(self, field, **kwargs): kwargs["data-role"] = u"select2-ajax" kwargs["data-url"] = url_for(".ajax_lookup", name=field.loader.name) allow_blank = getattr(field, "allow_blank", False) if allow_blank and not self.multiple: kwargs["data-allow-blank"] = u"1" kwargs.setdefault("id", field.id) kwargs.setdefault("type", "hidden") if self.multiple: result = [] ids = [] for value in field.data: data = field.loader.format(value) result.append(data) ids.append(as_unicode(data[0])) separator = getattr(field, "separator", ",") kwargs["value"] = separator.join(ids) kwargs["data-json"] = json.dumps(result) kwargs["data-multiple"] = u"1" else: data = field.loader.format(field.data) if data: kwargs["value"] = data[0] kwargs["data-json"] = json.dumps(data) placeholder = gettext(field.loader.options.get("placeholder", "Please select model")) kwargs.setdefault("data-placeholder", placeholder) return HTMLString("<input %s>" % html_params(name=field.name, **kwargs))
def _get_filter_dict(self): """ Return flattened filter dictionary which can be JSON-serialized. """ return dict((as_unicode(k), v) for k, v in iteritems(self._filter_dict))
def format_error(error): if isinstance(error, ValidationError): return '. '.join(itervalues(error.to_dict())) return as_unicode(error)
def test_ajax_fk(): app, db, admin = setup() class BaseModel(peewee.Model): class Meta: database = db class Model1(BaseModel): test1 = peewee.CharField(max_length=20) test2 = peewee.CharField(max_length=20) def __str__(self): return self.test1 class Model2(BaseModel): model1 = peewee.ForeignKeyField(Model1) Model1.create_table() Model2.create_table() view = CustomModelView( Model2, url='view', form_ajax_refs={ 'model1': { 'fields': ('test1', 'test2') } } ) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(test1=u'first', test2=u'') model.save() model2 = Model1(test1=u'foo', test2=u'bar') model2.save() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model needle = u'data-json="[%s, "first"]"' % as_unicode(model.id) ok_(needle in form.model1()) ok_(u'value="%s"' % as_unicode(model.id) in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data, u'[[%s, "foo"]]' % model2.id) # Check submitting client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = Model2.select().first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def make_name(base, name): if base: return ('%s-%s' % (base, name)).lower() else: return as_unicode(name).lower()
def format(self, model): if not model: return None return (as_unicode(model.id), as_unicode(model))
def test_ajax_fk(): app, db, admin = setup() class Model1(db.Document): test1 = db.StringField(max_length=20) test2 = db.StringField(max_length=20) def __str__(self): return self.test1 class Model2(db.Document): int_field = db.IntField() bool_field = db.BooleanField() model1 = db.ReferenceField(Model1) Model1.objects.delete() Model2.objects.delete() view = CustomModelView( Model2, url='view', form_ajax_refs={ 'model1': { 'fields': ('test1', 'test2') } } ) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(test1=u'first') model.save() model2 = Model1(test1=u'foo', test2=u'bar').save() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model needle = u'data-json="["%s", "first"]"' % as_unicode(model.id) ok_(needle in form.model1()) ok_(u'value="%s"' % as_unicode(model.id) in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data, u'[["%s", "foo"]]' % model2.id) # Check submitting client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = Model2.objects.first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def format(self, model): if not model: return None return (getattr(model, self.pk), as_unicode(model))
def test_ajax_fk(): app, db, admin = setup() class BaseModel(peewee.Model): class Meta: database = db class Model1(BaseModel): test1 = peewee.CharField(max_length=20) test2 = peewee.CharField(max_length=20) def __str__(self): return self.test1 class Model2(BaseModel): model1 = peewee.ForeignKeyField(Model1) Model1.create_table() Model2.create_table() view = CustomModelView( Model2, url='view', form_ajax_refs={'model1': { 'fields': ('test1', 'test2') }}) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(test1=u'first', test2=u'') model.save() model2 = Model1(test1=u'foo', test2=u'bar') model2.save() # Check loader loader = view._form_ajax_refs[u'model1'] mdl = loader.get_one(model.id) eq_(mdl.test1, model.test1) items = loader.get_list(u'fir') eq_(len(items), 1) eq_(items[0].id, model.id) items = loader.get_list(u'bar') eq_(len(items), 1) eq_(items[0].test1, u'foo') # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectField') with app.test_request_context('/admin/view/'): ok_(u'value=""' not in form.model1()) form.model1.data = model needle = u'data-json="[%s, "first"]"' % as_unicode(model.id) ok_(needle in form.model1()) ok_(u'value="%s"' % as_unicode(model.id) in form.model1()) # Check querying client = app.test_client() req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') eq_(req.data, u'[[%s, "foo"]]' % model2.id) # Check submitting client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = Model2.select().first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(mdl.model1.id, model.id) eq_(mdl.model1.test1, u'first')
def _get_filter_dict(self): """ Return flattened filter dictionary which can be JSON-serialized. """ return dict( (as_unicode(k), v) for k, v in iteritems(self._filter_dict))
def format_error(self, error): """ modify exception messages for prettified flashes """ if isinstance(error, ValidationError): return '. '.join(itervalues(error.to_dict())) return as_unicode(error)
def handle_view_exception(self, exc): if isinstance(exc, ValidationError): flash(as_unicode(exc), category='error') return True return super(ModelView, self).handle_view_exception(exc)
def test_ajax_fk_multi(): app, db, admin = setup() class Model1(db.Model): __tablename__ = 'model1' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) def __str__(self): return self.name table = db.Table('m2m', db.Model.metadata, db.Column('model1_id', db.Integer, db.ForeignKey('model1.id')), db.Column('model2_id', db.Integer, db.ForeignKey('model2.id')) ) class Model2(db.Model): __tablename__ = 'model2' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) model1_id = db.Column(db.Integer(), db.ForeignKey(Model1.id)) model1 = db.relationship(Model1, backref='models2', secondary=table) db.create_all() view = CustomModelView( Model2, db.session, url='view', form_ajax_refs={ 'model1': { 'fields': ['name'] } } ) admin.add_view(view) ok_(u'model1' in view._form_ajax_refs) model = Model1(name=u'first') db.session.add_all([model, Model1(name=u'foo')]) db.session.commit() # Check form generation form = view.create_form() eq_(form.model1.__class__.__name__, u'AjaxSelectMultipleField') with app.test_request_context('/admin/view/'): ok_(u'data-json="[]"' in form.model1()) form.model1.data = [model] ok_(u'data-json="[[1, "first"]]"' in form.model1()) # Check submitting client = app.test_client() client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) mdl = db.session.query(Model2).first() ok_(mdl is not None) ok_(mdl.model1 is not None) eq_(len(mdl.model1), 1)