flask - python-couchdb add ViewField to Model after instantiation -


i trying build base model class used couch-views on (mainly crud).

i cannot add viewfields base class, since js string inside must changed per model class name.
no problem inside base class __init__ reason, viewfield wont work.

when using viewfield so:

class mymodel(document):     only_carrots = viewfield("mymodel", js-string) 

then if run:

mod = mymodel() mod.only_carrots  

it show:
<viewdefinition '_design/mymodel/_view/only_carrots'>

but if viewfield added during __init__, looks this:

<flaskext.couchdb.viewfield object @ 0x10fe8f190> 

the code running on base model this:

    attr_name in dir(self):         if not attr_name.startswith("_") , attr_name not in ["id", "rev"]:             attr_val = getattr(self, attr_name)             if isinstance(attr_val, couchview):                 vd = viewfield(self.doc_type, attr_val.template.render(self.__dict__), name=attr_name, wrapper=self.__class__)                 setattr(self, attr_name, vd) 

the couchview class own. used store info viewfield in way not detected code inside metaclasses.

the document class (of base model sub class) has __metaclass__. takes care of, @ least, part of work viewfield working, think have part covered in own class.

the source python-couchdb found here:
https://code.google.com/p/couchdb-python/source/browse/#hg%2fcouchdb

and flask-couchdb:
https://bitbucket.org/leafstorm/flask-couchdb/src

so, how make viewfield work when added __init__ , therefore not available __new__ inside metaclasses?

many help.

well, think figured out. or @ least, workaround.

all viewfield fire viewdefinition wrapper-param filled class bound to.

so, when doing @ init time, call viewdefinition instead, so:

    def __init__(self, *args, **kwargs):     if not self.doc_type:         self.doc_type = self.__class__.__name__     attr_name in dir(self):         if not attr_name.startswith("_") , attr_name not in ["id", "rev"]:             attr_val = getattr(self, attr_name)             if isinstance(attr_val, couchview):                 setattr(self, attr_name, viewdefinition(self.doc_type, attr_name, attr_val.template.render(self.__dict__), wrapper=self)) 

of course, must remember instantiate model classes before adding them manager (it comes flask extension):

user = user() manager.add_document(user) 

this bit me while testing. gotta stop doing when i'm tired.
, reason need add _data = {} custom base class. can't figure out why not getting set properly, easy fix.


Comments

Popular posts from this blog

Ansible - ERROR! the field 'hosts' is required but was not set -

customize file_field button ruby on rails -

SoapUI on windows 10 - high DPI/4K scaling issue -