B
    ebP                 @   s  d dl mZ eedr2ejd  dkr2d dlmZ n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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 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/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; ee(Z<ee* Z=ye	j>?e9 W n e	j@jAk
r   Y nX G dd de,ZBe.Ce9eB dS )     )settingsDJANGO_VERSION   )re_path)url)adminmessages)IS_POPUP_VAR)unquote)get_user_model)update_session_auth_hash)PermissionDenied)routertransaction)Http404HttpResponseRedirect)TemplateResponse)reverse)method_decorator)	force_str)escape)gettextgettext_lazy)csrf_protect)sensitive_post_parameters)ZKModelAdmin)zk_site)
UserDelete)ChangePasswordCloudUserAdd)UserChangeFormUserCreationFormAdminPasswordChangeForm)MyUser)AdminRuntimeWarningc                   s  e Zd ZejreeegZneegZdZ	e
dddife
dddife
dddife
d	dd
iffZddddffZeZeZeZejrdZndZdddiiZdZdZdZdZdd ZdB fdd	ZdC fdd	Zdd Zedd  Zed!d" Zed#d$ Z ed%d& Z!ed'd( Z"ed)d* Z#d+d, Z$e
d-e$_%d.d/ Z&e
d0e&_% fd1d2Z' fd3d4Z(e)e*dDd6d7Z+dE fd8d9	Z,e)dFd:d;Z-dG fd<d=	Z. fd>d?Z/d@dA Z0  Z1S )H	UserAdminNZAccountfields)nicknamepasswordZ
login_typezPersonal info)
first_name	last_nameemailZPermissions)Z	is_activeis_staffZcan_manage_all_deptgroupszImportant dates)
last_logindate_joined)Zwide)r'   Z	password1Z	password2r)   r*   )classesr&   )get_display_namer)   r*   r+   groups_namer,   is_superuser_displayZis_vendor_displayr.   login_countr/   )
r1   r)   r*   r+   r2   r,   r3   r.   r4   r/   __all__widthZ150)r'   r/   r,   r4   r-    )r'   )r-   c             C   s   t jr
dS dS d S )NFT)r   CLOUD_VERSION)selfrequestr7   r7   :G:\easytimepro\master/mysite/base\admin\auth_user_admin.pyhas_add_permissions   s    zUserAdmin.has_add_permissionc                s   |s
| j S tt| ||S )N)add_fieldsetssuperr%   get_fieldsets)r9   r:   obj)	__class__r7   r;   r?   y   s    zUserAdmin.get_fieldsetsc                s6   i }|dkr| j |d< || tt| j||f|S )z7
        Use special form during user creation
        Nform)add_formupdater>   r%   get_form)r9   r:   r@   kwargsdefaults)rA   r7   r;   rE   ~   s
    

zUserAdmin.get_formc       	      C   sT  t jj|jdj|jd }|r8|jdkr8ttdt	j
s|jd}d|jdg kr`dnd	}|s||s||r|ttd
t jj|jdj|jd}| rttd|j|_n|jsttd|j|_|  | ||| | || t	j
sP|rDd|jdg krdnd	}|r,| | n| || | | n| || dS )zA
        Given a model instance save it to the database.
        )id)r+    Zduplicate_emailauth_companyonis_superuserTFzCompany need be assigned)r'   Zduplicate_usernameZempty_email_fieldN)r#   objectsexcludepkfilterr+   firstr$   _r   r8   POSTgetlistr'   rH   existsusernamesaveupdate_group_profileupdate_membershipassign_all_companyassign_normal_user_companychange_superuser_to_stuffset_option_for_add_user)	r9   r:   r@   rB   changeZemail_keeperassign_companiesrL   Ztem_userr7   r7   r;   
save_model   s<    
zUserAdmin.save_modelc             C   sD   ddl m} d|_|jj| jj|dd }d|_|  |j	|_|S )z`
        For enterprise version: set current company as the first company when add user
        r   )
MembershipT)
company_iduser)
mysite.base.modelsra   r,   rM   get_or_createrc   current_companyrolerW   rb   )r:   r@   ra   
membershipr7   r7   r;   r]      s    z!UserAdmin.set_option_for_add_userc             C   s<   ddl m} |jj| dd}x|D ]}d|_|  q"W dS )zu
        for enterprise version: when change one superuser to stuff, need keep he is stuff in all companies.
        r   )ra      )rc   rg   N)rd   ra   rM   rP   rg   rW   )r@   ra   ZmembershipsZmemr7   r7   r;   r\      s
    
z#UserAdmin.change_superuser_to_stuffc       	      C   s   ddl m} t| jd}tdd |jj|jddD }|| }|| }|rx.|D ]&}|jj	||dd }d|_
|  qZW |rx0|D ](}|jj||d}| r|   qW |j|kr| |_|  d	S )
zI
        update membership for assign/unassign company for stuff
        r   )ra   rJ   c             S   s   g | ]}t |d  qS )company)str).0itemr7   r7   r;   
<listcomp>   s    z8UserAdmin.assign_normal_user_company.<locals>.<listcomp>)rc   rj   )rb   rc   N)rd   ra   setrS   rT   rM   rP   rH   valuesre   rg   rW   rU   rQ   deleterf   pop)	r:   r@   ra   r_   owd_companiesZadd_objZ
reduce_objrb   rh   r7   r7   r;   r[      s*    




z$UserAdmin.assign_normal_user_companyc             C   s   ddl m} ddlm} tdd |j dD }tdd |jj| j	dd	D }|| }x.|D ]&}|jj
|| d
d }d|_|  qhW dS )z
        for enterprise version, when create a new superuser or change one user to superuser,
        need assign all exist company to this superuser.
        r   )Company)ra   c             S   s   g | ]}t |d  qS )rH   )rk   )rl   rm   r7   r7   r;   rn      s   z0UserAdmin.assign_all_company.<locals>.<listcomp>rH   c             S   s   g | ]}t |d  qS )rj   )rk   )rl   rm   r7   r7   r;   rn      s    )rc   rj   )rb   rc   ri   N)Zmysite.cloud.modelsrt   rd   ra   ro   rM   allrp   rP   rH   re   rg   rW   )r@   rt   ra   Z	companiesrs   Zadd_companyrj   rh   r7   r7   r;   rZ      s    
zUserAdmin.assign_all_companyc             C   s   ddl m} ddlm}m}m} | jd}| jd}| jd}| jdg }	d|	kr^d	nd
}	|jj	| j
j|dd }
|	rdnd|
_|jj|d|
_|jj|d|
_|jj|d|
_|
  dS )z
        create membership for user, membership record auth area an d dept for the user in a company.
        :param request:
        :param obj: user obj
        r   )ra   )Area
DepartmentPosition	auth_dept	auth_areaauth_posrL   rK   TF)rb   rc   ri   )id__inN)rd   ra   Zmysite.personnel.modelsrv   rw   rx   rS   rT   rM   re   rc   rf   rg   rP   rz   ry   r{   rW   )r:   r@   ra   rv   rw   rx   Zauth_dept_idsZauth_area_idsZauth_pos_idsrL   rh   r7   r7   r;   rY      s    zUserAdmin.update_membershipc       	      C   s   ddl m} | jd}|jj|| jjd}|j	 }|j| jjd}x |D ]}||krL|j
| qLW x |D ]}|j
| |  qnW dS )a=  
        aftet save user already, we have groupprofile for this user.
        one company can have many groups, it means also many groupprofile,
        for cloud version, we use groupprofile instead of group to find users permission.
        step:
        1. get all group seleted in edit user page.
        2. get current company.
        3. get groupprofiles depend on selected groups and current company.
        4. get old groupprofiles the edited user have.
        5. if the old groupprofile for eidted emp not select again, it will delete.
        6. save.
        r   )GroupProfileZ
auth_group)Zgroup_ptr_id__incompany__id)r~   N)rd   r}   rS   rT   rM   rP   rc   rf   groupprofile_setru   Z
group_userremoveaddrW   )	r:   r@   r^   r}   Z
groups_idsZcurrent_group_profileZold_group_profileZold_proZcur_pror7   r7   r;   rX     s    


zUserAdmin.update_group_profilec             C   s   t js|js|jS |jS )N)r   r8   r'   rV   )r9   r@   r7   r7   r;   r1   .  s    zUserAdmin.get_display_nameZuser_field_usernamec       
      C   s   ddl m} ddlm} | }|j j|jd}dd |D }|j	j|d}|sXdS d	
d
d |D }tjrtdd}	||	 }|S )Nr   )Group)threadlocals)r~   c             S   s   g | ]
}|j qS r7   )Zgroup_ptr_id)rl   Zprofiler7   r7   r;   rn   ;  s    z)UserAdmin.groups_name.<locals>.<listcomp>)r|   rI   ,c             S   s   g | ]
}|j qS r7   )name)rl   ir7   r7   r;   rn   ?  s    i)Zdjango.contrib.auth.modelsr   Zmysite.baser   Zget_current_userr   ru   rP   rf   rM   joinr   r8   slice)
r9   r@   r   r   Zcurrent_userZgroup_profilesZ	group_idsr-   r   Z
name_slicer7   r7   r;   r2   5  s    


zUserAdmin.groups_nameZuser_group_field_namec                s(   t d| j| jddgtt|   S )Nzbase/password_change/$Zauth_user_password_change)r   )r   
admin_siteZ
admin_viewuser_change_passwordr>   r%   get_urls)r9   )rA   r7   r;   r   G  s
    zUserAdmin.get_urlsc                s    | drdS tt| ||S )Nr(   F)
startswithr>   r%   lookup_allowed)r9   lookupvalue)rA   r7   r;   r   N  s    
zUserAdmin.lookup_allowedrI   c          	   C   s.   t jt| jd | |||S Q R X d S )N)Zusing)r   Zatomicr   Zdb_for_writemodel	_add_view)r9   r:   form_urlextra_contextr7   r7   r;   add_viewT  s    zUserAdmin.add_viewc                sn   |  |s&| |r"tjr"tdt|d kr2i }| jj| jj	}d|j
d}|| tt| |||S )NzYour user does not have the "Change user" permission. In order to add users, Django requires that your user account have both the "Add user" and "Change user" permissions set.r7   )Zauto_populated_fieldsZusername_help_text)has_change_permissionr<   r   DEBUGr   r   r   _metaZ	get_fieldZUSERNAME_FIELDZ	help_textrD   r>   r%   r   )r9   r:   r   r   Zusername_fieldrG   )rA   r7   r;   r   Z  s    


zUserAdmin._add_viewc             C   s  |  |st| |t|}|d krJttdt| jjj	t
|d |jdkr| ||j}| r|  | ||d }| ||| td}t|| t||j ttd| jj|jj|jjf |jfdS n
| |}d dt|jifg}t j!"||i }	tdt
|#  |	||t$|jkp4t$|j%kd	d
d
d	d
| jj|d
d	d}
|
&| j'| | jj|_(t)|| j*pzd|
S )Nz8%(name)s object with primary key %(key)r does not exist.)r   keyrS   zPassword changed successfully.z%s:%s_%s_change)argsr&   zChange password: %sTF)title	adminFormr   rB   Zis_popupr   r^   Zhas_delete_permissionr   Zhas_absolute_urlZoptsZoriginalZsave_asZ	show_savez$admin/auth/user/change_password.html)+r   r   Z
get_objectr
   r   rR   r   r   r   Zverbose_namer   methodchange_password_formrS   Zis_validrW   Zconstruct_change_messageZ
log_changer   r   successr   rc   r   r   r   r   Z	app_labelZ
model_namerO   listZbase_fieldsr   ZhelpersZ	AdminFormZget_usernamer	   ZGETrD   Zeach_contextZcurrent_appr   change_user_password_template)r9   r:   rH   r   rc   rB   Zchange_messagemsg	fieldsetsr   contextr7   r7   r;   r   v  sb    





zUserAdmin.user_change_passwordc                s>   d|j kr*t|j kr*|j  |_ d|j d< tt| |||S )z
        Determines the HttpResponse for the add_view stage. It mostly defers to
        its superclass implementation but is customized because the User model
        has a slightly different workflow.
        Z_addanotherri   Z	_continue)rS   r	   copyr>   r%   response_add)r9   r:   r@   Zpost_url_continue)rA   r7   r;   r     s    
zUserAdmin.response_addc                sL   ddl m} tt| |}|jj|jjd	d}|j
ddj|d}|S )Nr   )ra   )rb   rc   ZAnonymousUser)rV   )r|   )rd   ra   r>   r%   get_querysetrM   rP   rc   rf   Zvalues_listrN   )r9   r:   ra   ZqsZuser_ls)rA   r7   r;   r     s    zUserAdmin.get_querysetc             C   s   ddl m} ddlm} |r|jj|j|jjd}|j	dkrH|t
d|j	dkr|j|jkr|jdrv|jd	s|t
d
|jddS )z
        Given a ModelForm return an unsaved instance. ``change`` is True if
        the object is being changed, and False if it's being added.
        r   )ra   )r$   )rc   rb   r   zVendor can not be edit.ri   rL   r,   z(it dosnt allow to be changed by yourselfF)Zcommit)rd   ra   mysite.admin.exceptionsr$   rM   getinstancerc   rf   rg   rR   datarW   )r9   r:   rB   r^   ra   r$   rh   r7   r7   r;   	save_form  s    

zUserAdmin.save_form)N)N)rI   N)rI   N)rI   )N)2__name__
__module____qualname__r   r8   r   r   r   Zactionsr   rR   r   r=   r    rB   r!   rC   r"   r   Zlist_displayZlist_display_paramsZlist_filterZsort_fieldsZorderingZfilter_horizontalr<   r?   rE   r`   staticmethodr]   r\   r[   rZ   rY   rX   r1   Zshort_descriptionr2   r   r   sensitive_post_parameters_mcsrf_protect_mr   r   r   r   r   r   __classcell__r7   r7   )rA   r;   r%   6   sb   

)

?r%   N)DZdjango.confr   hasattrr   Zdjango.urlsr   r   Zdjango.conf.urlsZdjango.contribr   r   Zdjango.contrib.admin.optionsr	   Zdjango.contrib.admin.utilsr
   Zdjango.contrib.authr   r   Zdjango.core.exceptionsr   Z	django.dbr   r   Zdjango.httpr   r   Zdjango.template.responser   r   Zdjango.utils.decoratorsr   Zdjango.utils.encodingr   Zdjango.utils.htmlr   Zdjango.utils.translationr   r   rR   Zdjango.views.decorators.csrfr   Zdjango.views.decorators.debugr   Zmysite.adminr   Zmysite.admin.sitesr   Z"mysite.base.actions.myuser_actionsr   Zmysite.base.actionsr   r   Z&mysite.base.admin.forms.auth_user_formr    r!   r"   Zmysite.accounts.modelsr#   r   r$   r   r   ZsiteZ
unregisterZsitesZNotRegisteredr%   registerr7   r7   r7   r;   <module>	   sJ   
   1