
    M (i-                     T   d dl mZ d dlmZmZmZmZ d dlmZ d dlm	Z	 d dl
Z
d dlZd dlmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZm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% d dl&m'Z' d dl(m)Z) d dl*Z*d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z3 ddl4m5Z5mZ ddl6m7Z7  e5       Z8 ejr                  ddi      Z:e%jv                  de:ifZ<e%jz                   ej|                  ddi      dd fZ?e@e%j                  d!difeBe<ee%j                  de:ifeDe?ee%j                  dej                  ifee%j                  dej                  ifee%j                  dej                  ifee%j                  dej                  ifeMe%j                  de:ifi	ZOd" ZPeOj                   ePej                               e*j                  seOj                  eTe<eUe?i       d# ZV G d$ d%ej                        ZX G d& d'ej                        ZZ G d( d)e[      Z\ej                  j                  e\geZ       y)*    )OrderedDict)datetimedatetime	timedelta)Decimal)
itemgetterN)formsVERSION)apps)settings)includere_path)adminmessages)widgets)csrf_protect_m)PermissionDeniedImproperlyConfigured)default_storage)fields)HttpResponseRedirect)TemplateResponse)smart_bytes)localize)import_string)gettext_lazy   )
LazyConfigr   )get_inconsistent_fieldnamessize
   )attrswidgetrows   F)r$   requiredr'   c           	      .   | D ]  }t        | |         }t        |      dk(  r|j                  i        t        |d         |d<   d|d   v rCt        |d   d         } |di |d   j	                  di       xs i |d   d<   d|d   v r|d   d= || |<    | S )Nr   r   r$   widget_kwargs )listlenappendr   get)r   keyfieldklasss       /opt/sopds/constance/admin.pyparse_additional_fieldsr3   :   s     VC[!u:?LL q*auQx!%(8"45E!& "8<<4:"E!HX %(*!H_-s#& M    c            	          d t         j                  j                         D        } t        | fi t        t        j
                  j                  t         j                              }|S )z@
    Get dictionary of values from the backend
    :return:
    c              3   0   K   | ]  \  }}||d    f  yw)r   Nr*   ).0nameoptionss      r2   	<genexpr>zget_values.<locals>.<genexpr>a   s'      E(4 gaj) Es   )r   CONFIGitemsdictconfig_backendmget)default_initialinitials     r2   
get_valuesrC   Z   sN    E,4OO,A,A,CEO ?Rd6??+?+?+P&QRGNr4   c                   n     e Zd Z ej                  ej
                        Z fdZd Zd Z	 fdZ
 xZS )ConstanceForm)r$   c           	      p   t        t        | 
  |d|i| t        j                         }t
        j                  j                         D ]  \  }}|d   }t        |      dk(  r<|d   }|t
        j                  vr0t        ||      s$t        t        d      d|iz        t        |      }|t        vrt        t        d      ||dz        t        |   \  }	} |	dd	|i|| j                  |<   |j!                  t#        |j%                  |d
                    |j'                         | j(                  d<   y )NrB   r   r&      zoDefault value type must be equal to declared config parameter type. Please fix the default value of '%(name)s'.r8   zhConstance doesn't support config values of the type %(config_type)s. Please fix the value of '%(name)s'.)config_typer8   label versionr*   )superrE   __init__hashlibmd5r   r;   r<   r,   ADDITIONAL_FIELDS
isinstancer   _typeFIELDSr   updater   r.   	hexdigestrB   )selfrB   argskwargsversion_hashr8   r9   defaultrH   field_class	__class__s             r2   rM   zConstanceForm.__init__l   sO   mT+TM7MfM{{}%__224 	DMD'ajG7|q %ajh&@&@@T[]hIi.q 2? 0@
 39$0@ A A #7m&(*1 .H ,I >I6:.<	,< = = #)"5K + A$ A& ADKKGKKb,A BC1	D2 #/"8"8":Yr4   c                 ^   | j                   D ]J  }| j                  |   }t        j                  |j                  |       |j                  | j                  |<   L t
        j                  D ]A  }t        t        |      | j                  |   k7  s$t        t        || j                  |          C y N)
filescleaned_datar   saver8   r   r;   getattrr>   setattr)rW   
file_fieldfiler8   s       r2   rb   zConstanceForm.save   s    ** 	6J$$Z0D  D1,0IIDj)	6
 OO 	?Dvt$(9(9$(??d&7&7&=>	?r4   c                     | j                   d   }t        j                  r|S || j                  d   k7  rt	        j
                  t        d            |S )NrK   zbThe settings have been modified by someone else. Please reload the form and resubmit your changes.)ra   r   IGNORE_ADMIN_VERSION_CHECKrB   r
   ValidationErrorrR   )rW   values     r2   clean_versionzConstanceForm.clean_version   s[    !!),..LDLL++'' +L )M N N r4   c                     t         t        |          }t        j                  s|S t               rt        j                  t        d            |S )NzOCONSTANCE_CONFIG_FIELDSETS is missing field(s) that exists in CONSTANCE_CONFIG.)	rL   rE   cleanr   CONFIG_FIELDSETSr    r
   ri   rR   )rW   ra   r]   s     r2   rm   zConstanceForm.clean   sR    ]D79((&('' +V )W X X r4   )__name__
__module____qualname__r
   	CharFieldHiddenInputrK   rM   rb   rk   rm   __classcell__r]   s   @r2   rE   rE   i   s2    eooU%6%67G;>?

 
r4   rE   c                   X     e Zd ZdZeZd Zd Zd Ze	d	d       Z
d Zd Zd	 fd	Z xZS )
ConstanceAdminz admin/constance/change_list.htmlc                 R   | j                   j                  j                  | j                   j                  j                  f}t	        d| j
                  j                  | j                        d|z        t	        d| j
                  j                  | j                        d|z        gS )Nz^$z%s_%s_changelist)r8   z	%s_%s_add)model_meta	app_labelmodule_nameurl
admin_site
admin_viewchangelist_view)rW   infos     r2   get_urlszConstanceAdmin.get_urls   s    zz))4::+;+;+G+GG**4+?+?@'$.0 **4+?+?@ 4')	
 	
r4   c                    |d   |d   }}|j                  |      }|t        t        |      }|t        |      |t	        |      t        |      t        |      t        |      k7  ||   t        |t              t        |t              t        ||   j                  j                  t        j                        t        ||   j                  j                  t        j                        d}|S )Nr   r   )r8   r[   raw_default	help_textrj   modified
form_fieldis_dateis_datetimeis_checkboxis_file)r.   rc   r>   r   rR   rQ   r   r   r0   r$   r
   CheckboxInput	FileInput)	rW   r8   r9   formrB   r[   r   rj   config_values	            r2   get_config_valuezConstanceAdmin.get_config_value   s    $QZD!=FD)E("9e_ 8G+<<t*!'40%gx8%d4j&6&6&=&=u?R?RS!$t*"2"2"9"95??K
 r4   c                     | j                   S )zF
        Returns a Form class for use in the changelist_view.
        )change_list_form)rW   requests     r2   get_changelist_formz"ConstanceAdmin.get_changelist_form   s     $$$r4   c                 ^   | j                  |d       st        t               }| j                  |      } ||      }|j                  dk(  rx ||j
                  |j                  |      }|j                         rI|j                          t        j                  |t        j                  t        d             t        d      S t        | j                  j!                  |      g | j"                  j$                  j&                  j(                  d| j"                  j$                  || j*                  |j*                  z   t,        dk  rdnd	
      }t.        j0                  j3                         D ]+  \  }}|d   j5                  | j7                  ||||             - t.        j8                  rg |d<   t.        j8                  j3                         D ]  \  }	}
|
D cg c]  }|t.        j0                  vr| }}t;        |      rJ ddj=                  |      z         g }|
D ]G  }t.        j0                  j?                  |      }|s%|j5                  | j7                  ||||             I |d   j5                  |	|d        tA        t.        j8                  tB              s|d   jE                  tG        d             tA        t.        j0                  tB              s|d   jE                  tG        d             | j                  jH                  |_%        tM        || jN                  |      S c c}w )N)rB   POST)datar`   rB   z#Live settings updated successfully..	constance)r   	   gifsvg)config_valuestitler{   optsr   media	icon_typer   	fieldsetszDCONSTANCE_CONFIG_FIELDSETS contains field(s) that does not exist: %sz, )r   r   r   )r/   r8   )(has_change_permissionr   rC   r   methodr   FILESis_validrb   r   add_messageSUCCESSrR   r   r=   r~   each_contextry   rz   
app_configverbose_namer   r   r   r;   r<   r-   r   rn   anyjoinr.   rQ   r   sortr	   r8   current_appr   change_list_template)rW   r   extra_contextrB   form_clsr   contextr8   r9   fieldset_titlefields_listr0   absent_fieldsr   s                 r2   r   zConstanceAdmin.changelist_view   s   ))'48"",++G4(>>V#\\D }}		$$$$;<
 ,C00OO((1**""--::!!!**tzz)&/eU	
 &__224 	MD'O$++%%dGT7C	
 $$#%GK /7/H/H/N/N/P +4? !B5$)$@ "' !B !B}- @$&*ii&>?@- !#' D&oo11$7G%,, 11$wO $+++%2- !( h77E$))j.A)B(//;7O$))j.@)A"oo22)B)BGLL3!Bs   L*c                      yNFr*   rW   rX   rY   s      r2   has_add_permissionz!ConstanceAdmin.has_add_permission      r4   c                      yr   r*   r   s      r2   has_delete_permissionz$ConstanceAdmin.has_delete_permission  r   r4   c                 x    t         j                  r|j                  j                  S t        t
        |   ||      S r_   )r   SUPERUSER_ONLYuseris_superuserrL   rw   r   )rW   r   objr]   s      r2   r   z$ConstanceAdmin.has_change_permission"  s0    ""<<,,,^T@#NNr4   r_   )ro   rp   rq   r   rE   r   r   r   r   r   r   r   r   r   rt   ru   s   @r2   rw   rw      sK    =$	
.% =M =M~O Or4   rw   c                   0    e Zd Z G d de      Z e       Zy)Configc                   p    e Zd ZdZdZdxZZ ed      ZdZ	dZ
d Zd Zed        Zed        Zed	        Zy
)Config.Metar   r   r>   Fc                      yr   r*   rW   s    r2   get_ordered_objectszConfig.Meta.get_ordered_objects1  s    r4   c                      d| j                   z  S )Nz	change_%s)
model_namer   s    r2   get_change_permissionz!Config.Meta.get_change_permission4  s    00r4   c                 @    t        j                  | j                        S r_   )r   get_app_configr{   r   s    r2   r   zConfig.Meta.app_config7  s    &&t~~66r4   c                 8    | j                   d| j                  S Nr   )r{   object_namer   s    r2   rI   zConfig.Meta.label;  s    "nnd.>.>??r4   c                 8    | j                   d| j                  S r   )r{   r   r   s    r2   label_lowerzConfig.Meta.label_lower?  s    "nndoo>>r4   N)ro   rp   rq   r{   r   r   r|   rR   verbose_name_pluralabstractswappedr   r   propertyr   rI   r   r*   r4   r2   Metar   )  sr    	#++
[k		1 
	7 
	7 
	@ 
	@ 
	? 
	?r4   r   N)ro   rp   rq   objectr   rz   r*   r4   r2   r   r   (  s    ?v ?4 FEr4   r   )_collectionsr   r   r   r   r   decimalr   operatorr	   rN   osdjangor
   r   django.appsr   django.confr   django_settingsdjango.urlsr   r   r}   django.contribr   r   django.contrib.adminr   django.contrib.admin.optionsr   django.core.exceptionsr   r   django.core.files.storager   django.formsr   django.httpr   django.template.responser   sixdjango.utils.encodingr   django.utils.formatsr   django.utils.module_loadingr   django.utils.translationr   rR   rJ   r   checksr    r>   	TextInputNUMERIC_WIDGETIntegerFieldINTEGER_LIKErr   TextareaSTRING_LIKEboolBooleanFieldintDecimalFieldstrSplitDateTimeFieldAdminSplitDateTimeDurationFieldAdminTextInputWidget	DateFieldAdminDateWidget	TimeFieldAdminTimeWidgetfloat
FloatFieldrT   r3   rU   rP   PY3longunicoderC   FormrE   
ModelAdminrw   r   r   siteregisterr*   r4   r2   <module>r     s   # 4 4    	 !  3 / * ( 7 I 5  , 5 
 - ) 5 6 " / 
 !|4##h%?@ennFA;/"  	6U 3
4f!!Hn#=>!!Hg.H.H#I x)E)EF 	6h(?(?@
A6h(?(?@
A	F.9:
". %h&@&@A B
ww
MMl BEJJ BJwOU%% wOtV < 

  VHn -r4   