ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@sdZddlZddlZddlmZddlmZddlmZddlmZdd lm Z dd l m Z ddl mZ dd l m Z dd l mZdd l mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl mZe a!a"dZ#dZ$dZ%e&dZ'dZ(dZ)de*fdYZ+d e+fd!YZ,d"Z-d#Z.d$Z/d%e/_0d&Z1dS('s(Internal implementation for declarative.iN(tinstrumentationi(t clsregistryi(tevent(texc(tutil(t class_mapper(tmapper(t mapperlib(tsynonym(tQueryableAttribute(t_is_mapped_class(tInspectionAttr(tMapperProperty(tColumnProperty(tCompositeProperty(tColumn(tTable(t expression(t topologicalcCs@tj|rtj|St|r8t|dtSdSdS(Nt configure(t_DeferredMapperConfigthas_clstconfig_for_clsR RtFalsetNone(tcls((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_declared_mapping_info%s   cCs|tkrdSt|ddtr\xT|jD]"}t|}|dk r/|Sq/WdSn t|}|dk rx|S|SdS(Nt __abstract__tstrict(tobjectRt_get_immediate_cls_attrtTruet __bases__t"_resolve_for_abstract_or_classicalt"_dive_for_classically_mapped_class(Rtsupt classical((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR!0s     cCsjt|drdStj|}|dk r2|Sx1|jD]"}t|}|dk r<|Sq<WdSdS(Nt_decl_class_registry(thasattrRRtmanager_of_classR R"(RtmanagerR#R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR"Cs   cCst|tsdSx|jD]}t|d}| oHt|dk }||jkr||ks|r{||jkntr| r| rt ||SqWdSdS(sreturn an attribute of the class that is either present directly on the class, e.g. not on a superclass, or is from a superclass but this superclass is a non-mapped mixin, that is, not a descendant of the declarative base and is also not classically mapped. This is used to detect attributes that indicate something about a mapped class independently from any mapped classes that it may inherit from. R%N( t issubclassRRt__mro__R&R"t__dict__R Rtgetattr(RtattrnameRtbaset_is_declarative_inheritst_is_classicial_inherits((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRWs  cCs^tdkr.ddlmattjfant|ddtrGdStj |||dS(Ni(t declared_attrRR( R1RtapiRt classpropertytdeclarative_propsRRt _MapperConfigt setup_mapping(Rt classnametdict_((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_as_declarativeys  cCsGt|tr?t|dtr;tjd||fntStSdS(Nt _cascadings~@declared_attr.cascading is not supported on the %s attribute on class %s. This attribute invokes for subclasses in any case.(t isinstanceR4R,RRtwarnR(tobjtnameR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_check_declared_props_nocascadesR5cBseZedZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd ZRS( cCsMt|ddtp!t|d}|r3t}nt}||||dS(Nt_sa_decl_prepare_nocascadeRt_sa_decl_prepare(RRR&RR5(Rtcls_R7R8t defer_maptcfg_cls((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR6s cCs||_t||_||_d|_tj|_t |_ i|_ |j i|j_ |jtjjzLtj|j|j|j|j|j|j|jWdtjjXdS(N(RtdictR8R7Rtpersist_selectableRt OrderedDictt propertiestsettdeclared_columnst column_copiest_setup_declared_eventst_sa_declared_attr_regt_scan_attributesRt_CONFIGURE_MUTEXtacquireRt add_classt_extract_mappable_attributest_extract_declared_columnst _setup_tablet_setup_inheritancet_early_mappingtrelease(tselfRBR7R8((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt__init__s&             cCs|jdS(N(tmap(RX((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRVscsptjdr6tjtdfd}ntjdrltjtdfd}ndS(Nt__declare_last__tafter_configuredcsjjdS(N(RR[((RX(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR\st__declare_first__tbefore_configuredcsjjdS(N(RR]((RX(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR^s(RRRt listens_forR(RXR\R^((RXsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRLs$cs|j|j}|j}d}d}}d}x_jD]T}|k ort|dk ort|ddt }| r|k r|j|nxt |j D]\} } | dkrt | | } | r| s| rfd}qq| dkr?t | | } | r| s0| rj }qq| dkrt | | } | r| sq| rj }t|tttdfstjdn|k rt}qqq|rt| trtjd|j| |fqqq|k rt| tr$qqt| trEtjd qt| trut| tj} | r| jr| |krtjd | fn| j| || <|| <} t| | nn| rtjd nt | } t| t!r-| j"r-t| j#t r-| j$} n| || <|| R=t check_declt oldclassproptret((RsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRNs              "       cCs0t|tjr,tjd||fndS(NsAttribute '%s' on class %s appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping(R;Rt ColumnClauseRR<(RXRtkeytc((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRtcscCs|j}|j}|j}xt|jD]\}}t|tr.t|||k rdq.q|jrt j dq||krd|ko|j p||dj k r|j ||<}|j|_t||||||R~tcopyt_creation_orderRm(RXR.RR8RKR>R=tcopy_((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRdls"        cCs|j}|j}|j}t|ddt}xt|D]}|d krUq=n||}t|trt|tr|j rt j d|jnt ||}nOt|t r|j|k r|j|krt|j}t|||nt|trOt|dkrOt|dttfrOt j d |q=nt|ttfs|jd s=|j||j||||st|||qq=q=n|d krtjd ntj||}|||tiszOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteads, (RHtsortRJt collectionst defaultdictRIRRfR;R RtcolumnsRttableRt_undefer_column_nameR>taddR}RRR<R7tjointsorted(RXRJtname_to_prop_keyR}R~tcolR>tkeys((RsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRSs.     c Cs|j}|j}|j}|j}|j}t|dd}|_d}t|drstj |j }nt }d|kr\|dk rd i}} |rt |t r|} qt |trt |dt r|dd!|d}} q|}qn|jd} | r't| dR~t primary_keyt append_columnt_refresh_for_new_column( RXRRRuRJRR~tinherited_mappertinherited_tabletinherited_persist_selectable((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRU's`                      c Cs|j}|jr!|j}ni}x@dD]8}||kr.||}|jj||||sc3s/|]%}|kr|fVqdS(N((Rtbase_cls(t all_m_by_clstm_cls(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pys s( RtvaluesRRR)REtextendR RRR(RRRRRBtclasses_for_basettuples((RRsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRs5' cCs)|jj|jdtt|jS(N(RRRRtsuperRRZ(RX((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRZs(RjRRRGRRVtpropertyRtsetterRRRRRRRRZ(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRs   cCsd|jkrkt|trQt|||jj||jj||q~t|trxO|j D]D}t|trj|j dkrjt|||jj|qjqjW|jj||q~t|t r|jj|t j||q~t|trH|j|krHt|j}|jj|t j||q~tj||||jjntj|||dS(sadd an attribute to an existing declarative class. This runs through the logic to determine MapperProperty, adds it to the Mapper, adds a column to the mapped Table, etc. RN(R+R;RRRRRt add_propertyR RRRR RRR R}RRht __setattr__t_expire_memoizations(RR}RR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_add_attributes*    cCsd|jkr||jkr|jj r|j|}t|ttttfrbtdqt j |||jj nt j ||dS(NRs<Can't un-map individual mapped attributes on a mapped class.( R+Rt_dispose_calledR;RR R R tNotImplementedErrorRht __delattr__R(RR}R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_del_attribute%s   cKs`t|}xM|D]E}t||sDtd||jfnt||||qWdS(s=A simple constructor that allows initialization from kwargs. Sets attributes on the constructed instance using the names and values in ``kwargs``. Only keys that are present as attributes of the instance's class are allowed. These could be, for example, any mapped columns or relationships. s(%r is an invalid keyword argument for %sN(RhR&t TypeErrorRjRm(RXtkwargsRBR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_declarative_constructor:s  RYcCs:|jdkr||_n|jdkr6||_ndS(N(R}RR>(R}tcolumn((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRPs (2RsRRtsqlalchemy.ormRRRRRRtormRRRRRtorm.attributesR torm.baseR R torm.interfacesR torm.propertiesR RtschemaRRtsqlRRRR1R4RR!R"RRR9R?RR5RRRRRjR(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pytsL      " ,B %