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)selfattrrrE/opt/alt/python38/lib64/python3.8/site-packages/playhouse/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)NrfieldsTnull)django.db.modelsrZ AutoFieldPrimaryKeyFieldBigIntegerField BooleanField CharField DateTimeField DateField DecimalFieldZ FilePathField FloatField IntegerFieldZNullBooleanFieldr TextField 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)r&rrr Cz3DjangoTranslator._translate_model..)keyr* max_depthbackrefsexcludezCycle detected: %s: %s) db_column+z __%s:%s:%s) related_namer2z%scSsg|]}||jfqSr)model.0frrr {sz5DjangoTranslator._translate_model..cSs0g|](}|js|jr|jr|js||jjfqSr)Z one_to_manyZ one_to_oneZ auto_createdZconcreter&r5r6rrr r9~s )"rr_metagetZ object_namesortedr(r#relto_translate_modelloggerwarnnamercolumnr4Zrelated_query_nameendswithstripr2typeModeldb_tabledatabase interpolationZget_all_related_objectsAttributeErrorZ get_fields many_to_manyr%r"ZManyToManyFieldZthrough)rr5mappingr/r0r1r$optionsattrsZ field_keyZ model_fieldr'Z related_modelZ model_namer4klassZ all_relatedZrel_objrLrrr r?/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/Nr0Fr1z9Error, you cannot specify a max_depth when recurse=False.rr)r.)rr; ValueErrorr?) rmodelsrNrMrQr/r0r1r5rrr translate_modelss(!      z!DjangoTranslator.translate_models)NFN)r r r rrr(r?rTrrrr rs  ir)__doc__ functoolsrloggingpeewee getLoggerr@dictrobjectrZdjangorT translate ImportErrorrrrr s  A