U
    7h.                     @   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)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   o/var/www/formularioweb/env/lib/python3.8/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 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rd} qq|sf|| j|< qfd| _d S )N=   rx   FT)r,   _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-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])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   
) -