B
    ?F['                 @   sl   d dl mZ d dlmZ d dlmZ d dlZd dlmZ G dd de	Z
G dd	 d	eZG d
d deZdS )    )Property)Key)QueryN)filterc                   s    e Zd ZdZ fddZ  ZS )	ModelMetazMetaclass for all Modelsc                s   t t| ||| g | _ddlm} ytdd |rx|D ]}|j|  q<W || | _x2|	 D ]&}t
|| trd|| }|| | qdW g }|  }	x&|	D ]}
|
jjds||
j qW t| d| W n tk
r   Y nX d S )Nr   )get_managerc             S   s
   t | tS )N)
issubclassModel)b r   0lib/python3.7/site-packages/boto/sdb/db/model.py<lambda>(   s    z$ModelMeta.__init__.<locals>.<lambda>__prop_names)superr   __init____sub_classes__Zboto.sdb.db.managerr   r   append_managerkeys
isinstancer   Z__property_config__
properties	__class____name__
startswithnamesetattr	NameError)clsr   basesdictr   basekeypropertyZ
prop_namespropsprop)r   r   r   r      s(    


zModelMeta.__init__)r   
__module____qualname____doc__r   __classcell__r   r   )r   r   r      s   r   c               @   sJ  e Zd ZeZdZdZedd Zedd Z	ed<ddZ
ed=d	d
ZeZed>ddZed?ddZed@ddZedd ZedAddZedd Zedd Zedd ZdBddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdCd*d+ZeZd,d- Zd.d/ ZeZ d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$dDd8d9Z%ed:d; Z&dS )Er	   FNc             C   s$   dd |   D }|  d|S )Nc             S   s   g | ]
}|j qS r   )r   ).0cr   r   r   
<listcomp>C   s    z%Model.get_lineage.<locals>.<listcomp>.)mroreversejoin)r   lr   r   r   get_lineageA   s    zModel.get_lineagec             C   s   | j S )N)r   )r   r   r   r   kindG   s    z
Model.kindc             C   s   |s
| j }|| |S )N)r   Z
get_object)r   idmanagerr   r   r   
_get_by_idK   s    zModel._get_by_idc                s.   t |tr  fdd|D }|S  |S d S )Nc                s   g | ]}  |qS r   )r6   )r*   r4   )r   r   r   r,   T   s    z#Model.get_by_id.<locals>.<listcomp>)r   listr6   )r   ZidsparentZobjsr   )r   r   	get_by_idQ   s    
zModel.get_by_idc             C   s   t dd S )Nz%Key Names are not currently supported)NotImplementedError)r   Z	key_namesr8   r   r   r   get_by_key_name[   s    zModel.get_by_key_namec             K   s8   t | ||d}x$| D ]\}}|d| | qW |S )N)limit
next_tokenz%s =)r   itemsr   )r   r<   r=   Zparamsqr"   valuer   r   r   find_   s    z
Model.findc             C   s   | j ||dS )N)r<   r=   )rA   )r   r<   r=   r   r   r   allf   s    z	Model.allc             K   s   t dd S )Nz%get_or_insert not currently supported)r:   )Zkey_namekwr   r   r   get_or_insertj   s    zModel.get_or_insertTc             C   st   g }xj| rnxB| j  D ]4}| j | }t|tr|s@|jjds|| qW t| j	dkrh| j	d } qd } qW |S )Nr   r   )
__dict__r   r   r   r   r   r   r   len	__bases__)r   hiddenr   r"   r%   r   r   r   r   n   s    

zModel.propertiesc             C   st   d }xj| rnxB| j  D ]4}| j | }t|tr|jjds||jkr|}qW t| j	dkrh| j	d } qd } qW |S )Nr   r   )
rE   r   r   r   r   r   r   r   rF   rG   )r   	prop_namer#   r"   r%   r   r   r   find_property}   s    

zModel.find_propertyc          
   C   s6   t | ds0ddlm} || d d d d d d d d	| _| jS )N_xmlmanagerr   )
XMLManagerF)hasattrZboto.sdb.db.manager.xmlmanagerrL   rK   )r   rL   r   r   r   get_xmlmanager   s
    

zModel.get_xmlmanagerc             C   s   |   }||S )N)rN   Zunmarshal_object)r   fp
xmlmanagerr   r   r   from_xml   s    zModel.from_xmlc             K   s   d| _ x@| jddD ]0}yt| |j|  W q tk
rB   Y qX qW d|krZ|d | _|| _xX|D ]P}|dkrfyt| |||  W qf tk
r } zt	j
| W d d }~X Y qfX qfW d S )NF)rH   r5   )_loadedr   r   r   Zdefault_value
ValueErrorr   r4   	ExceptionbotologZ	exception)selfr4   rC   r%   r"   er   r   r   r      s    


zModel.__init__c             C   s   d| j j| jf S )Nz%s<%s>)r   r   r4   )rW   r   r   r   __repr__   s    zModel.__repr__c             C   s
   t | jS )N)strr4   )rW   r   r   r   __str__   s    zModel.__str__c             C   s   |ot |to| j|jkS )N)r   r	   r4   )rW   otherr   r   r   __eq__   s    zModel.__eq__c             C   s   | j | S )N)r   Zget_raw_item)rW   r   r   r   _get_raw_item   s    zModel._get_raw_itemc             C   s   | j r| js| j|  d S )N)r4   rR   r   load_object)rW   r   r   r   load   s    z
Model.loadc             C   s   | j rd| _| j|  d S )NF)r4   rR   r   r_   )rW   r   r   r   reload   s    zModel.reloadc             C   s   | j | | | S )a  
        Save this object as it is, with an optional expected value

        :param expected_value: Optional tuple of Attribute, and Value that
            must be the same in order to save this object. If this
            condition is not met, an SDBResponseError will be raised with a
            Confict status code.
        :type expected_value: tuple or list
        :return: This object
        :rtype: :class:`boto.sdb.db.model.Model`
        )r   Zsave_object)rW   Zexpected_valuer   r   r   put   s    z	Model.putc             C   s`   t |tstdx@|D ]8}|| }| |}|s>td| | j|| || qW |   | S )z
        Save just these few attributes, not the whole object

        :param attrs: Attributes to save, key->value dict
        :type attrs: dict
        :return: self
        :rtype: :class:`boto.sdb.db.model.Model`
        z.Argument must be a dict of key->values to savezProperty not found: %s)r   r    AssertionErrorrJ   r   Zset_propertyra   )rW   attrsrI   r@   r%   r   r   r   put_attributes   s    	

zModel.put_attributesc             C   s0   t |tstd| jj| j| |   | S )z
        Delete just these attributes, not the whole object.

        :param attrs: Attributes to save, as a list of string names
        :type attrs: list
        :return: self
        :rtype: :class:`boto.sdb.db.model.Model`
        z3Argument must be a list of names of keys to delete.)r   r7   rc   r   Zdomaindelete_attributesr4   ra   )rW   rd   r   r   r   rf      s    	zModel.delete_attributesc             C   s   | j |  d S )N)r   Zdelete_object)rW   r   r   r   delete   s    zModel.deletec             C   s
   t | dS )N)obj)r   )rW   r   r   r   r"      s    z	Model.keyc             C   s
   || _ d S )N)r   )rW   r5   r   r   r   set_manager   s    zModel.set_managerc             C   sD   i }x&| j ddD ]}t| |j||j< qW || jd}| jj|iS )NF)rH   )r   r4   )r   getattrr   r4   r   r   )rW   r$   r%   rh   r   r   r   to_dict   s    
zModel.to_dictc             C   s   |   }|| |}|S )N)rN   Zmarshal_object)rW   docrP   r   r   r   to_xml  s    zModel.to_xmlc             C   s8   || j kr| S x$| jD ]}||}|dk	r|S qW dS )z!Find a subclass with a given nameN)r   r   find_subclass)r   r   Zscrr   r   r   rn     s    

zModel.find_subclass)N)NN)N)NN)NN)T)N)N)N)'r   r&   r'   r   Z__metaclass__Z__consistent__r4   classmethodr2   r3   r6   r9   Z
get_by_idsr;   rA   rB   rD   r   rJ   rN   rQ   r   rY   r[   r]   r^   r`   ra   rb   Zsavere   rf   Zsave_attributesrg   r"   ri   rk   rm   rn   r   r   r   r   r	   <   sP   


r	   c               @   s   e Zd Zdd Zdd ZdS )Expandoc             C   sn   || j krt| || nP|dr4t| || n6|dkrLt| || n| j| || t| || d S )Nr   r4   )r   object__setattr__r   r   Zset_key_value)rW   r   r@   r   r   r   rs     s    

zExpando.__setattr__c             C   s6   | ds.| j| |}|r.t| || |S td S )Nr   )r   r   Zget_key_valuerr   rs   AttributeError)rW   r   r@   r   r   r   __getattr__"  s    
zExpando.__getattr__N)r   r&   r'   rs   ru   r   r   r   r   rq     s   rq   )Zboto.sdb.db.propertyr   Zboto.sdb.db.keyr   Zboto.sdb.db.queryr   rU   Zboto.compatr   typer   rr   r	   rq   r   r   r   r   <module>   s     Z