U
    W+d'                     @   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} ztdd |r|D ]}|j|  q:|| | _|	 D ]&}t
|| tr^|| }|| | q^g }|  }	|	D ]}
|
jjds||
j qt| d| W n tk
r   Y nX d S )Nr   )get_managerc                 S   s
   t | tS N)
issubclassModel)b r   5/tmp/pip-unpacked-wheel-dlxw5sjy/boto/sdb/db/model.py<lambda>(       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 r	   r.   r!   r   r   r   kindG   s    z
Model.kindc                 C   s   |s
| j }|| |S r	   )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   )r<   )r/   r:   r8   r   r   r1   T   s     z#Model.get_by_id.<locals>.<listcomp>)r   listr<   )r!   idsparentobjsr   r8   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_namesr?   r   r   r   get_by_key_name[   s    zModel.get_by_key_namec                 K   s4   t | ||d}| D ]\}}|d| | q|S )Nlimit
next_tokenz%s =)r   itemsr   )r!   rF   rG   paramsqr%   valuer   r   r   find_   s    z
Model.findc                 C   s   | j ||dS )NrE   )rL   )r!   rF   rG   r   r   r   allf   s    z	Model.allc                 K   s   t dd S )Nz%get_or_insert not currently supportedrB   )Zkey_namekwr   r   r   get_or_insertj   s    zModel.get_or_insertTc                 C   sl   g }| rh| j  D ]4}| j | }t|tr|s<|jjds|| qt| j	dkrb| j	d } qd } q|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   sl   d }| rh| j  D ]4}| j | }t|tr|jjds||jkr|}qt| j	dkrb| j	d } qd } q|S rP   )
rQ   r   r   r   r   r   r   r   rR   rS   )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.xmlmanagerrX   rW   )r!   rX   r   r   r   get_xmlmanager   s    

    zModel.get_xmlmanagerc                 C   s   |   }||S r	   )rZ   Zunmarshal_object)r!   fp
xmlmanagerr   r   r   from_xml   s    zModel.from_xmlc                 K   s   d| _ | jddD ]0}zt| |j|  W q tk
r@   Y qX qd|krV|d | _|| _|D ]P}|dkr`zt| |||  W q` tk
r } zt	j
| W 5 d }~X Y q`X q`d S )NFrT   r;   )_loadedr   r   r   default_value
ValueErrorr   r:   	Exceptionbotolog	exception)selfr:   rN   r(   r%   er   r   r   r      s    
zModel.__init__c                 C   s   d| j j| jf S )Nz%s<%s>)r   r   r:   rf   r   r   r   __repr__   s    zModel.__repr__c                 C   s
   t | jS r	   )strr:   rh   r   r   r   __str__   s    zModel.__str__c                 C   s   |ot |to| j|jkS r	   )r   r   r:   )rf   otherr   r   r   __eq__   s    zModel.__eq__c                 C   s   | j | S r	   )r   Zget_raw_itemrh   r   r   r   _get_raw_item   s    zModel._get_raw_itemc                 C   s   | j r| js| j|  d S r	   r:   r_   r   Zload_objectrh   r   r   r   load   s    z
Model.loadc                 C   s   | j rd| _| j|  d S )NFro   rh   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)rf   Zexpected_valuer   r   r   put   s    z	Model.putc                 C   s\   t |tstd|D ]8}|| }| |}|s<td| | j|| || q|   | 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#   AssertionErrorrV   r   Zset_propertyrq   )rf   attrsrU   rK   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   r=   rs   r   domaindelete_attributesr:   rq   )rf   rt   r   r   r   rw      s    	zModel.delete_attributesc                 C   s   | j |  d S r	   )r   Zdelete_objectrh   r   r   r   delete   s    zModel.deletec                 C   s
   t | dS )N)objr   rh   r   r   r   r%      s    z	Model.keyc                 C   s
   || _ d S r	   )r   )rf   r;   r   r   r   set_manager   s    zModel.set_managerc                 C   s@   i }| j ddD ]}t| |j||j< q|| jd}| jj|iS )NFr^   )r   r:   )r   getattrr   r:   r   r   )rf   r'   r(   ry   r   r   r   to_dict   s    zModel.to_dictc                 C   s   |   }|| |}|S r	   )rZ   Zmarshal_object)rf   docr\   r   r   r   to_xml  s    zModel.to_xmlc                 C   s8   || j kr| S | jD ]}||}|dk	r|  S qdS )z!Find a subclass with a given nameN)r   r   find_subclass)r!   r   Zscrr   r   r   r     s    


zModel.find_subclass)N)NN)N)NN)NN)T)N)N)N)'r   r*   r+   r   __metaclass__Z__consistent__r:   classmethodr7   r9   r<   rA   Z
get_by_idsrD   rL   rM   rO   r   rV   rZ   r]   r   ri   rk   rm   rn   rp   rq   rr   saveru   rw   Zsave_attributesrx   r%   rz   r|   r~   r   r   r   r   r   r   <   s^   








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   r:   )r   object__setattr__r   r   Zset_key_valuerf   r   rK   r   r   r   r     s    

zExpando.__setattr__c                 C   s6   | ds.| j| |}|r.t| || |S td S )Nr   )r   r   Zget_key_valuer   r   AttributeErrorr   r   r   r   __getattr__"  s    
zExpando.__getattr__N)r   r*   r+   r   r   r   r   r   r   r     s   r   )Zboto.sdb.db.propertyr   Zboto.sdb.db.keyr   Zboto.sdb.db.queryr   rc   Zboto.compatr   typer   r   r   r   r   r   r   r   <module>   s     Z