3
g.                 @   s"  d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZ eedd	Zeed
dZeeddZeeddZeede
je
je
je
jfZeedd(Zeedd)Zeedd*ZeeddZeeddZeeddZG d d! d!ZG d"d# d#eZG d$d% d%eZG d&d' d'eZ dS )+as  
The Django Admin Generator is a project which can automatically generate
(scaffold) a Django Admin for you. By doing this it will introspect your
models and automatically generate an Admin with properties like:

 - `list_display` for all local fields
 - `list_filter` for foreign keys with few items
 - `raw_id_fields` for foreign keys with a lot of items
 - `search_fields` for name and `slug` fields
 - `prepopulated_fields` for `slug` fields
 - `date_hierarchy` for `created_at`, `updated_at` or `joined_at` fields

The original source and latest version can be found here:
https://github.com/WoLpH/django-admin-generator/
    N)apps)settings)LabelCommandCommandError)models)signalcommandMAX_LINE_WIDTHN   INDENT_WIDTH   LIST_FILTER_THRESHOLD   RAW_ID_THRESHOLDd   LIST_FILTERSEARCH_FIELD_NAMESnameslugDATE_HIERARCHY_NAMES	joined_at
updated_at
created_atPREPOPULATED_FIELD_NAMES	slug=namePRINT_IMPORTSzY# -*- coding: utf-8 -*-
from django.contrib import admin

from .models import %(models)s
PRINT_ADMIN_CLASSzM

@admin.register(%(name)s)
class %(name)sAdmin(admin.ModelAdmin):%(class_)s
PRINT_ADMIN_PROPERTYz
    %(key)s = %(value)sc               @   s   e Zd ZdZdd ZdS )UnicodeMixinze
    Mixin class to handle defining the proper __str__/__unicode__
    methods in Python 2 or 3.
    c             C   s   | j  S )N)__unicode__)self r    s/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django_extensions/management/commands/admin_generator.py__str__M   s    zUnicodeMixin.__str__N)__name__
__module____qualname____doc__r"   r    r    r    r!   r   G   s   r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )AdminAppc             K   s   || _ || _|| _d S )N)
app_config	model_resoptions)r   r(   r)   r*   r    r    r!   __init__R   s    zAdminApp.__init__c             c   sR   xL| j j D ]>}t|f| j}x$| jD ]}|j|jr&P q&W | jrDq|V  qW d S )N)r(   Z
get_models
AdminModelr*   r)   searchr   )r   modeladmin_modelZmodel_rer    r    r!   __iter__W   s    zAdminApp.__iter__c             C   s   dj | j S )N )join_unicode_generator)r   r    r    r!   r   d   s    zAdminApp.__unicode__c             c   sZ   dd | D }t tdj|d V  g }x,| D ]$}tt|j|d V  |j|j q.W d S )Nc             S   s   g | ]
}|j qS r    )r   ).0r/   r    r    r!   
<listcomp>h   s    z/AdminApp._unicode_generator.<locals>.<listcomp>z, )r   )r   class_)r   dictr2   r   r   append)r   Zmodels_listZadmin_model_namesr/   r    r    r!   r3   g   s    
zAdminApp._unicode_generatorc             C   s   d| j j| jjf S )Nz<%s[%s]>)	__class__r#   appr   )r   r    r    r!   __repr__s   s    zAdminApp.__repr__N)r#   r$   r%   r+   r0   r   r3   r;   r    r    r    r!   r'   Q   s
   r'   c               @   s   e Zd Zd$ZeeeeefddZ	d	d
 Z
edd Zdd Zdd Zdd Zdd Zdd Zdd ZefddZdd Zdd Zdd  Zd!d" Zd#S )%r,   list_displaylist_filterraw_id_fieldssearch_fieldsprepopulated_fieldsdate_hierarchyc             K   sL   || _ g | _g | _g | _g | _i | _d | _|| _|| _|| _	|| _
|| _d S )N)r.   r<   r=   r>   r?   r@   rA   search_field_namesraw_id_thresholdlist_filter_thresholddate_hierarchy_namesprepopulated_field_names)r   r.   rC   rD   rB   rE   rF   r*   r    r    r!   r+      s    zAdminModel.__init__c             C   s   d| j j| jf S )Nz<%s[%s]>)r9   r#   r   )r   r    r    r!   r;      s    zAdminModel.__repr__c             C   s   | j jS )N)r.   r#   )r   r    r    r!   r      s    zAdminModel.namec             c   sf   | j }xZ|jD ]P}t|dr0t|jd|jj}ntd|jj }|d | j	 |k r|j
V  qW d S )Nremote_fieldrelated_modelz%Unable to process ManyToMany relation)rC   Zlocal_many_to_manyhasattrgetattrrG   r.   r   objectsallcountr   )r   metarC   fieldrH   Zrelated_objectsr    r    r!   _process_many_to_many   s    

z AdminModel._process_many_to_manyc             c   s4   |j j }x$|jD ]}| j||}|r|V  qW d S )N)parentsvaluesfields_process_field)r   rN   parent_fieldsrO   r   r    r    r!   _process_fields   s
    
zAdminModel._process_fieldsc             C   s   | j }| j}t||}t|dr4t|jd|jj}ntd|jj	 }|d | j
 }||krn| jj|j n||k r| jj|j n d S )NrG   rH   z%Unable to process ForeignKey relation)rC   rD   maxrI   rJ   rG   r.   r   rK   rL   rM   r>   r8   r   r=   )r   rO   rC   rD   	max_countrH   Zrelated_countr    r    r!   _process_foreign_key   s    


zAdminModel._process_foreign_keyc             C   sl   ||krd S t |j}| jj| t|trPt|tjrD| j| n| j	j| |j| j
krh| jj| |S )N)strr   r<   r8   
isinstancer   r   
ForeignKeyrY   r=   rB   r?   )r   rO   rU   
field_namer    r    r!   rT      s    

zAdminModel._process_fieldc             C   s   dj | j S )Nr1   )r2   r3   )r   r    r    r!   r      s    zAdminModel.__unicode__c             C   sd   t |tttfr | j|t|S t |tr6| j||S t |trL| j||S t	dt
||f d S )Nz%s is not supported in %r)r[   listsettuple_yield_tupler7   _yield_dictrZ   _yield_string	TypeErrortype)r   keyvaluer    r    r!   _yield_value   s    

zAdminModel._yield_valuec             C   s   t t|||d S )N)rf   rg   )r   r7   )r   rf   rg   	converterr    r    r!   rc      s    zAdminModel._yield_stringc             C   s   g }| j ||}t|tkr~|j| j |dt x0|j D ]$\}}|jddt d ||f  q:W |jtd d  dj|}|S )N{z%s%r: %r    }
)rc   lenr   r8   rZ   itemsr
   r2   )r   rf   rg   	row_partsrowkvr    r    r!   rb      s     
zAdminModel._yield_dictc             C   s|   g }| j ||}t|tkrx|j| j |dt x*|D ]"}|jdt d t| d  q6W |jtd d  dj|}|S )N(rk   rl   ,)rn   )rc   ro   r   r8   rZ   r
   reprr2   )r   rf   rg   rq   rr   rt   r    r    r!   ra      s    
"
zAdminModel._yield_tuplec             c   s8   | j   x*| jD ] }t| |}|r| j||V  qW d S )N)_processPRINTABLE_PROPERTIESrJ   rh   )r   rf   rg   r    r    r!   r3     s
    
zAdminModel._unicode_generatorc             C   s   | j j}|  jt| j|7  _t| j|}x0| jd d d D ]}||kr@| j r@|| _P q@W xbt| j	D ]T}|j
dd\}}|j
d}||krld}x|D ]}||krd}P qW |sl|| j|< qlW d| _d S )N   =rv   FT)r.   Z_metar>   r^   rP   rV   rE   rA   sortedrF   splitr@   	processed)r   rN   field_namesr]   rs   vs
incompletert   r    r    r!   ry     s&    

zAdminModel._processN)r<   r=   r>   r?   r@   rA   )r#   r$   r%   rz   r   r   r   r   r   r+   r;   propertyr   rP   rV   rY   rT   r   rh   rx   rc   rb   ra   r3   ry   r    r    r    r!   r,   z   s0        
r,   c               @   s(   e Zd ZdZdZdd Zedd ZdS )Commandz5Generate a `admin.py` file for the given app (models)Tc             C   s   |j d |j ddd |j dddtdd	 |j d
ddtdd	 |j dddtdd	 |j ddttddd |j ddttddd d S )Napp_name
model_name*)nargsz-sz--search-fieldr8   zNFields named like this will be added to `search_fields` [default: %(default)s])actiondefaulthelpz-dz--date-hierarchyzNA field named like this will be set as `date_hierarchy` [default: %(default)s]z-pz--prepopulated-fieldszThese fields will be prepopulated by the other field.The field names can be specified like `spam=eggA,eggB,eggC` [default: %(default)s]z-lz--list-filter-thresholdr   zsIf a foreign key has less than LIST_FILTER_THRESHOLD items it will be added to `list_filter` [default: %(default)s])re   r   metavarr   z-rz--raw-id-thresholdr   znIf a foreign key has more than RAW_ID_THRESHOLD items it will be added to `list_filter` [default: %(default)s])add_argumentr   r   r   intr   r   )r   parserr    r    r!   add_arguments+  s,    
zCommand.add_argumentsc       	      O   s   |d }yt j|}W n` tk
rv   | jjd | jjd dd t j D }x t|D ]}| jjd|  qZW d S X g }x$|d D ]}|jtj	|tj
 qW | jjt||f|j  d S )Nr   z6This command requires an existing app name as argumentzAvailable apps:c             S   s   g | ]
}|j qS r    )label)r4   r:   r    r    r!   r5   R  s    z"Command.handle.<locals>.<listcomp>z    %sr   )r   Zget_app_configLookupErrorstderrwriteZget_app_configsr~   r8   recompile
IGNORECASEstdoutr'   r"   )	r   argsr*   r   r:   Z
app_labelsr   r)   argr    r    r!   handleI  s    zCommand.handleN)r#   r$   r%   r   Zcan_import_settingsr   r   r   r    r    r    r!   r   &  s   r   )r   r   )r   r   r   )r   )!r&   r   Zdjango.appsr   Zdjango.confr   Zdjango.core.management.baser   r   Z	django.dbr   Z"django_extensions.management.utilsr   rJ   r   r
   r   r   Z	DateFieldZDateTimeFieldr\   ZBooleanFieldr   r   r   r   r   r   r   r   r'   r,   r   r    r    r    r!   <module>   sF   
   
) -