U SW@sxdZddlmZddlZddlTedZGdddeZGdd d e Z zddl Z e j Z Wnek rrYnXdS) zE Simple translation of Django model classes to peewee model classes. )partialN)*zpeewee.playhouse.djpeeweec@seZdZddZdS)AttrDictcCs||SN)selfattrrr /djpeewee.py __getattr__ szAttrDict.__getattr__N)__name__ __module__ __qualname__r rrrr r src@s6eZdZddZddZddZd d d Zd d ZdS)DjangoTranslatorcCs||_dSr)get_django_field_map _field_map)rrrr __init__szDjangoTranslator.__init__cCsddlm}|jtf|jtf|jtf|jtf|jtf|jtf|j t f|j tf|j t f|j t f|j ttddf|jtf|jtf|jjtfgS)NrfieldsTZnull)django.db.modelsrZ AutoFieldZPrimaryKeyFieldZBigIntegerFieldZ BooleanFieldZ CharFieldZ DateTimeFieldZ DateFieldZ DecimalFieldZ FilePathFieldZ FloatField IntegerFieldZNullBooleanFieldrZ TextFieldZ TimeFieldrelatedZ ForeignKeyForeignKeyField)rdjfrrr rs   z%DjangoTranslator.get_django_field_mapcCs*d}|jD]\}}t||r |}q&q |Sr)r isinstance)rfield convertedZ django_fieldZ peewee_fieldrrr convert_field's  zDjangoTranslator.convert_fieldNFcCsT|r||krdS|dkrd}ddlm}|j}||jr>dSd||j<i}dd} t|j| dD]} || } | tkrP|dkr<| jj } | jj} | |krd|| <|j | ||d||d|| dkrt d | j | t| jd || j <nL| jjp| }|d r d || j |d f}t|| || jd || j <nt| jd || j <qb| rb| | jd || j <qbt|jtf|}|j|j_d|jj_|||j<|rzdd|D}Wn(tk rdd|D}YnX|D]4\}}|jj|krq|j |||d||dq|jD]2}t||jj s4q|j |jj!||||dqdS)NrrcSs|jr dp d|fS)Nrr)rrrr Cz3DjangoTranslator._translate_model..)keyr max_depthbackrefsexcludezCycle detected: %s: %s) db_column+z __%s:%s:%s) related_namer'z%scSsg|]}||jfqSr)model.0frrr {sz5DjangoTranslator._translate_model..cSs0g|](}|js|jr|jr|js||jjfqSr)Z one_to_manyZ one_to_oneZ auto_createdZconcreterr*r+rrr r.~s )"rrZ_metagetZ object_namesortedrrZrelto_translate_modelloggerwarnnamercolumnr)Zrelated_query_nameendswithstripr'typeZModelZdb_tableZdatabaseZ interpolationZget_all_related_objectsAttributeErrorZ get_fields many_to_manyrrZManyToManyFieldZthrough)rr*mappingr$r%r&roptionsZattrsZ field_keyZ model_fieldrZ related_modelZ model_namer)klassZ all_relatedZrel_objr;rrr r2/s                z!DjangoTranslator._translate_modelc Ost}|dd}|dd}|dd}|dd}|sH|rHtdn|sRd }n|rb|dkrbd }|D]}|j|||||d qf|S) av Generate a group of peewee models analagous to the provided Django models for the purposes of creating queries. :param model: A Django model class. :param options: A dictionary of options, see note below. :returns: A dictionary mapping model names to peewee model classes. :rtype: dict Recognized options: `recurse`: Follow foreign keys (default: True) `max_depth`: Max depth to recurse (default: None, unlimited) `backrefs`: Follow backrefs (default: False) `exclude`: A list of models to exclude Example:: # Map Django models to peewee models. Foreign keys and M2M will be # traversed as well. peewee = translate(Account) # Generate query using peewee. PUser = peewee['User'] PAccount = peewee['Account'] query = (PUser .select() .join(PAccount) .where(PAccount.acct_type == 'foo')) # Django raw query. users = User.objects.raw(*query.sql()) recurseTr$Nr%Fr&z9Error, you cannot specify a max_depth when recurse=False.rrr#)rr/ ValueErrorr2) rZmodelsr=r<r?r$r%r&r*rrr translate_modelss(!      z!DjangoTranslator.translate_models)NFN)r r r rrrr2rArrrr rs  ir)__doc__ functoolsrZloggingZpeeweeZ getLoggerr3dictrobjectrZdjangorA translate ImportErrorrrrr s  A