3
(hV$                 @   s~   d dl mZ d dlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ e ZG d	d
 d
eZG dd deZdS )    )url)get_permission_codename   )CreateModelView)DeleteModelView)DetailModelView)ListModelView)UpdateModelViewc               @   s   e Zd ZdZedd ZdS )BaseViewsetz,Base router-like class for frontend viewset.c                sh   g }d j jji} fdd j D }x:|D ]2}|\}}}|jt|jf |||jf |d q.W |S )zCollect url specs from the instance attributes.

        Assumes that each attribute with name ending with `_view`
        contains tripple (regexp, view, url_name)
        
model_namec             3   s6   | ].}|j d rtt |ttfrt |V  qdS )Z_viewN)endswith
isinstancegetattrlisttuple).0attr)self L/tmp/pip-install-q3hcpn_q/django-material/material/frontend/views/viewset.py	<genexpr>   s   
z#BaseViewset.urls.<locals>.<genexpr>)name)model_metar   __dir__appendr   format)r   resultZformat_kwargsZurl_entriesZ	url_entryregexpviewr   r   )r   r   urls   s    


zBaseViewset.urlsN)__name__
__module____qualname____doc__propertyr    r   r   r   r   r
      s   r
   c               @   s   e Zd ZdZdZeZeZeZeZ	eZ
dd Zdd ZeZdd Zd	d
 Zedd Zdd ZeZdd Zdd Zd-ddZedd ZeZdd Zdd Zedd ZeZ dd Z!dd  Z"d.d!d"Z#ed#d$ Z$e%Z&d%d& Z'd/d'd(Z(d)d* Z)ed+d, Z*dS )0ModelViewSeta  Model Create/Read/Update/Delete/List viewset.

    Lightweight alternative for django admin. CRUD interface based in
    the django generic views. Viewset provides a sinple place to
    configure the views and share the common configuration parameters.

    :keyword model: Model class views

    :keyword queryset: Base views queryset

    :keyword list_display: List of fields for ListView

    :keyword list_display_links: List of fields form `list_display`
                                 linked to change view

    :keyword create_view_class: CBV for create an object

    :keyword list_view_class:  CBV for create to list objects

    :keyword detail_view_class:  CBV to show an object detail

    :keyword update_view_class: CBV to update an object

    :keyword delete_view_class: CBV to delete an object

    There is no specifical requirements to CBV, by overriding
    corresponsing `get_<op>_view` method you can even use function
    based views with this viewset.

    Example::

        class CityViewSet(ModelViewSet):
            model = models.Sea
            list_display = ('name', 'parent', 'ocean', 'sea_area', )
            layout = Layout(
                Row('name', 'parent'),
                'ocean',
                Row('area', 'avg_depth', 'max_depth'),
                'basin_countries'
            )

            def sea_area(self, sea):
                return None if sea.area == 0 else sea.area

    Nc             C   s   | j S )zReturn common queryset for all CRUD views.

        By default just return `self.queryset`. Subclasses can
        override that.
        )queryset)r   requestr   r   r   get_querysetf   s    zModelViewSet.get_querysetc                s0   | j | | jd}|j|  fdd|j D S )a3  Add defaults and filter kwargs to only thouse that view can accept.

        Viewset pass to the view only kwars that have non DEFAULT values,
        and if the view have a corresponding attribute.

        In addition, if view has `viewset` attribute, it will receive
        the `self` instance

        )r   Zviewsetr'   c                s(   i | ] \}}t  |r|tk	r||qS r   )hasattrDEFAULT)r   r   value)
view_classr   r   
<dictcomp>~   s    
z.ModelViewSet.filter_kwargs.<locals>.<dictcomp>)r   r'   updateitems)r   r-   kwargsr   r   )r-   r   filter_kwargsn   s
    

zModelViewSet.filter_kwargsc             C   s   | j jf | j S )z#Function view for create an object.)create_view_classas_viewget_create_view_kwargs)r   r   r   r   get_create_view   s    zModelViewSet.get_create_viewc             K   s(   | j | jd}|j| | j| jf|S )zoConfiguration arguments for create view.

        May not be called if `get_create_view` is overriden.
        )layout
form_class)r7   r8   r/   r2   r3   )r   r1   r   r   r   r   r5      s    

z#ModelViewSet.get_create_view_kwargsc             C   s   d| j  dgS )z8Tripple (regexp, view, name) for create view url config.z^add/$z{model_name}_add)r6   )r   r   r   r   create_view   s    zModelViewSet.create_viewc             C   s(   | j j}td|}|jjdj|j|S )zDefault add permission check for a detail and list views.

        May not be called if views have own implementation.
        addz{}.{})r   r   r   userhas_permr   	app_label)r   r(   optscodenamer   r   r   has_add_permission   s    
zModelViewSet.has_add_permissionc             C   s   | j jf | j S )z Function view for object detail.)detail_view_classr4   get_detail_view_kwargs)r   r   r   r   get_detail_view   s    zModelViewSet.get_detail_viewc             K   s   | j | jf|S )zoConfiguration arguments for detail view.

        May not be called if `get_detail_view` is overriden.
        )r2   rA   )r   r1   r   r   r   rB      s    z#ModelViewSet.get_detail_view_kwargsc             C   sB   | j j}td|}dj|j|}|jj||dr4dS | j||dS )zDefault view permission check for a detail and list views.

        May not be called if views have own implementation.
        r   z{}.{})objT)r   r   r   r   r=   r;   r<   has_change_permission)r   r(   rD   r>   r?   Z	view_permr   r   r   has_view_permission   s    
z ModelViewSet.has_view_permissionc             C   s   d| j  dgS )z8Tripple (regexp, view, name) for detail view url config.z^(?P<pk>.+)/detail/$z{model_name}_detail)rC   )r   r   r   r   detail_view   s    zModelViewSet.detail_viewc             C   s   | j jf | j S )zFunction view for objects list.)list_view_classr4   get_list_view_kwargs)r   r   r   r   get_list_view   s    zModelViewSet.get_list_viewc             K   s(   | j | jd}|j| | j| jf|S )zkConfiguration arguments for list view.

        May not be called if `get_list_view` is overriden.
        )list_displaylist_display_links)rK   rL   r/   r2   rH   )r   r1   r   r   r   r   rI      s    

z!ModelViewSet.get_list_view_kwargsc             C   s   d| j  dgS )z6Tripple (regexp, view, name) for list view url config.z^$z{model_name}_list)rJ   )r   r   r   r   	list_view   s    zModelViewSet.list_viewc             C   s   | j jf | j S )z#Function view for update an object.)update_view_classr4   get_update_view_kwargs)r   r   r   r   get_update_view   s    zModelViewSet.get_update_viewc             K   s(   | j | jd}|j| | j| jf|S )zoConfiguration arguments for update view.

        May not be called if `get_update_view` is overriden.
        )r7   Z
form_Class)r7   r8   r/   r2   rN   )r   r1   r   r   r   r   rO      s    

z#ModelViewSet.get_update_view_kwargsc             C   s,   | j j}td|}|jjdj|j||dS )z~Default change permission check for a update view.

        May not be called if update view have own implementation.
        Zchangez{}.{})rD   )r   r   r   r;   r<   r   r=   )r   r(   rD   r>   r?   r   r   r   rE     s    
z"ModelViewSet.has_change_permissionc             C   s   d| j  dgS )z8Tripple (regexp, view, name) for update view url config.z^(?P<pk>.+)/change/$z{model_name}_change)rP   )r   r   r   r   update_view  s    zModelViewSet.update_viewc             C   s   | j jf | j S )z#Function view for delete an object.)delete_view_classr4   get_delete_view_kwargs)r   r   r   r   get_delete_view  s    zModelViewSet.get_delete_viewc             C   s,   | j j}td|}|jjdj|j||dS )z~Default delete permission check for a delete view.

        May not be called if delete view have own implementation.
        deletez{}.{})rD   )r   r   r   r;   r<   r   r=   )r   r(   rD   r>   r?   r   r   r   has_delete_permission  s    
z"ModelViewSet.has_delete_permissionc             K   s   | j | jf|S )zoConfiguration arguments for delete view.

        May not be called if `get_delete_view` is overriden.
        )r2   rR   )r   r1   r   r   r   rS   '  s    z#ModelViewSet.get_delete_view_kwargsc             C   s   d| j  dgS )z8Tripple (regexp, view, name) for delete view url config.z^(?P<pk>.+)/delete/$z{model_name}_delete)rT   )r   r   r   r   delete_view.  s    zModelViewSet.delete_view)N)N)N)+r!   r"   r#   r$   r   r+   r'   rK   rL   r7   r8   r)   r2   r   r3   r6   r5   r%   r9   r@   r   rA   rC   rB   rF   rG   r   rH   rJ   rI   rM   r	   rN   rP   rO   rE   rQ   r   rR   rT   rV   rS   rW   r   r   r   r   r&   /   sB   -	




r&   N)Zdjango.conf.urlsr   Zdjango.contrib.authr   creater   rU   r   Zdetailr   r   r   r/   r	   objectr+   r
   r&   r   r   r   r   <module>   s   !