U
     æf.  ã                   @   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_WIDTHéN   ÚINDENT_WIDTHé   ÚLIST_FILTER_THRESHOLDé   ÚRAW_ID_THRESHOLDéd   ÚLIST_FILTERÚSEARCH_FIELD_NAMES)ÚnameZslugÚDATE_HIERARCHY_NAMES)Z	joined_atZ
updated_atZ
created_atÚPREPOPULATED_FIELD_NAMES)z	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   |   ¡ S ©N)Ú__unicode__©Úself© r   úY/tmp/pip-unpacked-wheel-1isl55vw/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 r   )Ú
app_configÚ	model_resÚoptions)r   r&   r'   r(   r   r   r   Ú__init__R   s    zAdminApp.__init__c                 c   sL   | j  ¡ D ]<}t|f| jŽ}| jD ]}| |j¡r" q@q"| jr@q
|V  q
d S r   )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  |  ¡ ¡S ©NÚ ©ÚjoinÚ_unicode_generatorr   r   r   r   r   d   s    zAdminApp.__unicode__c                 c   sV   dd„ | D ƒ}t td |¡d V  g }| D ]$}tt|j|d V  | |j¡ q,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)   r.   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 r   )r,   r=   r>   r?   r@   rA   rB   Úsearch_field_namesÚraw_id_thresholdÚlist_filter_thresholdÚdate_hierarchy_namesÚprepopulated_field_names)r   r,   rD   rE   rC   rF   rG   r(   r   r   r   r)   „   s    zAdminModel.__init__c                 C   s   d| j j| jf S r9   )r:   r!   r   r   r   r   r   r<   –   s    þzAdminModel.__repr__c                 C   s   | j jS r   )r,   r!   r   r   r   r   r   œ   s    zAdminModel.namec                 c   sb   | j }|jD ]P}t|dƒr.t|jd|jjƒ}ntdƒ‚|j ¡ }|d |…  	¡ |k r|j
V  qd S )NÚremote_fieldÚrelated_modelz%Unable to process ManyToMany relation)rD   Zlocal_many_to_manyÚhasattrÚgetattrrH   r,   r   ÚobjectsÚallÚcountr   )r   ÚmetarD   ÚfieldrI   Zrelated_objectsr   r   r   Ú_process_many_to_many    s    


z AdminModel._process_many_to_manyc                 c   s0   |j  ¡ }|jD ]}|  ||¡}|r|V  qd S r   )ÚparentsÚvaluesÚfieldsÚ_process_field)r   rO   Úparent_fieldsrP   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 	¡ }|d |…  
¡ }||krn| j |j¡ n||k r†| j |j¡ n d S )NrH   rI   z%Unable to process ForeignKey relation)rD   rE   ÚmaxrJ   rK   rH   r,   r   rL   rM   rN   r?   r8   r   r>   )r   rP   rD   rE   Ú	max_countrI   Zrelated_countr   r   r   Ú_process_foreign_key²   s    


zAdminModel._process_foreign_keyc                 C   sl   ||krd S t |jƒ}| j |¡ t|tƒrPt|tjƒrD|  |¡ n| j	 |¡ |j| j
krh| j |¡ |S r   )Ústrr   r=   r8   Ú
isinstancer   r   Ú
ForeignKeyrZ   r>   rC   r@   )r   rP   rV   Ú
field_namer   r   r   rU   Æ   s    

zAdminModel._process_fieldc                 C   s   d  |  ¡ ¡S r/   r1   r   r   r   r   r   ×   s    zAdminModel.__unicode__c                 C   sd   t |tttfƒr |  |t|ƒ¡S t |tƒr6|  ||¡S t |tƒrL|  ||¡S t	dt
|ƒ|f ƒ‚d S )Nz%s is not supported in %r)r\   ÚlistÚsetÚtupleÚ_yield_tupler7   Ú_yield_dictr[   Ú_yield_stringÚ	TypeErrorÚtype©r   ÚkeyÚvaluer   r   r   Ú_yield_valueÚ   s    

zAdminModel._yield_valuec                 C   s   t t|||ƒd S )N)rh   ri   )r   r7   )r   rh   ri   Ú	converterr   r   r   rd   ä   s    þzAdminModel._yield_stringc                 C   s~   g }|   ||¡}t|ƒtkrz| |   |dt¡¡ | ¡ D ]$\}}| ddt d ||f ¡ q8| td d ¡ d |¡}|S )NÚ{z%s%r: %ré   ú Ú}Ú
)rd   Úlenr	   r8   r[   Úitemsr   r2   )r   rh   ri   Ú	row_partsÚrowÚkÚvr   r   r   rc   ê   s    
zAdminModel._yield_dictc                 C   sx   g }|   ||¡}t|ƒtkrt| |   |dt¡¡ |D ]"}| dt d t|ƒ d ¡ q4| td d ¡ d |¡}|S )Nú(rm   rn   ú,ú)rp   )rd   rq   r	   r8   r[   r   Úreprr2   )r   rh   ri   rs   rt   rv   r   r   r   rb   ÷   s     
zAdminModel._yield_tuplec                 c   s4   |   ¡  | jD ] }t| |ƒ}|r|  ||¡V  qd S r   )Ú_processÚPRINTABLE_PROPERTIESrK   rj   rg   r   r   r   r3     s
    

zAdminModel._unicode_generatorc                 C   sÄ   | j j}|  jt|  |¡ƒ7  _t|  |¡ƒ}| jd d d… D ]}||kr>| js>|| _ q\q>t| j	ƒD ]R}| 
dd¡\}}| 
d¡}||krfd}|D ]}||kr”d} qªq”|sf|| j|< qfd| _d S )Néÿÿÿÿú=é   rx   FT)r,   Z_metar?   r_   rQ   rW   rF   rB   ÚsortedrG   ÚsplitrA   Ú	processed)r   rO   Úfield_namesr^   ru   ÚvsÚ
incompleterv   r   r   r   r{     s&    
zAdminModel._processN)r!   r"   r#   r|   r   r   r   r   r   r)   r<   Úpropertyr   rQ   rW   rZ   rU   r   rj   rz   rd   rc   rb   r3   r{   r   r   r   r   r*   z   s*   	ü


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„   |  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-fieldsz‡These 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])rf   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+  sN    
  ý  ý  ý   ý   ýzCommand.add_argumentsc           	      O   sº   |d }zt  |¡}W n^ tk
rt   | j d¡ | j d¡ dd„ t  ¡ D ƒ}t|ƒD ]}| j d| ¡ qXY d S X g }|d D ]}| t 	|tj
¡¡ q‚| j t||f|Ž ¡ ¡ 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˜   Zdjango.appsr   Zdjango.confr   Zdjango.core.management.baser   r   Z	django.dbr   Z"django_extensions.management.utilsr   rK   r	   r   r   r   Z	DateFieldZDateTimeFieldr]   ZBooleanFieldr   r   r   r   r   r   r   r   r%   r*   r‡   r   r   r   r   Ú<module>   s6   ü
) -