Exemple #1
0
 def test_basic(self):
     "just some very basic test to make sure it doesn't break on start :)"
     class Person(Document):
         structure = {'name': unicode, 'age': int}
         validators = {'name':[required()]}
     john = Person()
     PersonForm = document_form_factory(Person)
     form = PersonForm(name=u'John Doe', age=123)
     form.populate_obj(john)
     assert john.name == u'John Doe'
     assert john.age == 123
Exemple #2
0
def object_detail(request, namespace, model_name, pk=None):
    db = default_storage()
    model = _get_model(namespace, model_name)
    if pk:
        try:
            obj = db.get(model, pk)
        except doqu.validators.ValidationError:
            # Whoops, the data doesn't fit the schema. Let's try converting.
            obj = db.get(Document, pk)
            obj = obj.convert_to(model)
        creating = False
    else:
        obj = model()
        creating = True

    if not creating and request.form.get('DELETE'):
        # TODO: confirmation screen.
        # List related objects, ask what to do with them (cascade/ignore/..)
        obj.delete()
        return redirect_to('tool.ext.admin.views.object_list', namespace=namespace,
                        model_name=model_name)

    DocumentForm = document_form_factory(model, db)

    if not model.meta.structure:
        for k in obj:
            setattr(DocumentForm, k,
                    wtforms.fields.TextField(k.title().replace('_',' ')))

    form = DocumentForm(request.form, obj)

    for name in _get_excluded_names(model):
        del form[name]

    message = None
    if request.method == 'POST' and form.validate():
        form.populate_obj(obj)

        #assert 0==1, 'DEBUG'
        #if not __debug__:

        obj.save(db)    # storage can be omitted if not creating obj

        # TODO: move this to request.session['messages'] or smth like that
        message = u'%s has been saved.' % obj.__class__.__name__
        #if creating:
        # redirect to the same view but change URL
        # from ".../my_model/add/" to
        # to the editing URL ".../my_model/123/"
        # ...hmm, we *should* redirect even after editing an existing item
        return redirect_to('tool.ext.admin.views.object_detail',
                           namespace=namespace, model_name=model_name,
                           pk=obj.pk)
    obj_url = _get_url_for_object(obj)

    # objects of other models that are known to reference this one
    references = {}
    for model, attrs in model.meta.referenced_by.iteritems():
        for attr in attrs:
            qs = model.objects(db).where(**{attr: obj.pk})
            if qs.count():
                references.setdefault(model, {})[attr] = qs

    return {
        'namespace': namespace,
        'object': obj,
        'object_url': obj_url,
        'form': form,
        'message': message,
        'references': references,
        'other_doc_types': env('registered_models'),
    }