o
    š�ži´  ã                   @   sH   d dl Z d dlmZmZmZ d dlmZ e  e¡Z	G dd„ dej
ƒZdS )é    N)ÚapiÚfieldsÚmodels)Ú	LockErrorc                   @   st   e Zd ZdZdZdZdZejdddd�Z	ej
d	d
dd�Zejg d¢dddd�Ze d¡dd„ ƒZejddd„ƒZdS )ÚResUsersDeletionaÇ  User deletion requests.

    Those requests are logged in a different model to keep a trace of this action and the
    deletion is done in a CRON. Indeed, removing a user can be a heavy operation on
    large database (because of create_uid, write_uid on each model, which are not always
    indexed). This model just remove the users added in the deletion queue, remaining code
    must deal with other consideration (archiving, blacklist email...).
    zres.users.deletionzUsers Deletion RequestÚuser_idz	res.usersÚUserzset null)ÚstringÚondeletezUser IdÚ_compute_user_id_intT)ÚcomputeÚstore))ÚtodozTo Do)ÚdoneÚDone)ÚfailÚFailedÚStater   )r	   ÚrequiredÚdefaultc                 C   s   | D ]
}|j r|j j|_qd S ©N)r   ÚidÚuser_id_int)ÚselfÚuser_deletion© r   úF/home/minischoggi19/odoo/odoo/addons/base/models/res_users_deletion.pyr      s
   
€þz%ResUsersDeletion._compute_user_id_inté2   c                 C   s¦  |   dg¡}| dd„ ¡}d|_|| }| jd j}|t|ƒt|ƒd� |d|… D ]¦}| ¡  dd„ ¡}|s8q*|j}|j}|j	}	|j
j}
z| ¡  t d	|j||
¡ d|_|d
ƒ W n1 tyŒ } z%| jj ¡  t d|j||
|¡ d|_|d
ƒr€W Y d}~q*W Y d}~ dS d}~ww z|	 ¡  t d|	j||
¡ |ƒ s¢W  dS W q* tyÐ } z!| jj ¡  t d|	j||
|¡ |ƒ sÆW Y d}~ dS W Y d}~q*d}~ww dS )aU  Remove the portal users that asked to deactivate their account.

        (see <res.users>::_deactivate_portal_user)

        Removing a user can be an heavy operation on large database (because of
        create_uid, write_uid on each models, which are not always indexed). Because of
        that, this operation is done in a CRON.
        )ÚstateÚ=r   c                 S   s   | j  S r   )r   )Úrequestr   r   r   Ú<lambda>1   s    z3ResUsersDeletion._gc_portal_users.<locals>.<lambda>r   zir.cron)Ú	remainingNc                 S   s
   | j dkS )Nr   )r   )Údr   r   r   r!   9   s   
 z/User #%i %r, deleted. Original request from %r.é   zMUser #%i %r could not be deleted. Original request from %r. Related error: %sr   z2Partner #%i %r, deleted. Original request from %r.zPPartner #%i %r could not be deleted. Original request from %r. Related error: %s)ÚsearchÚfilteredr   ÚenvÚ_commit_progressÚlenÚtry_lock_for_updater   ÚnameÚ
partner_idÚ
create_uidÚunlinkÚ_loggerÚinfor   Ú	ExceptionÚcrÚrollbackÚerrorÚwarning)r   Ú
batch_sizeÚdelete_requestsÚdone_requestsÚtodo_requestsÚcommit_progressÚdelete_requestÚuserÚ	user_nameÚpartnerÚrequester_nameÚer   r   r   Ú_gc_portal_users$   sn   
þ
þ€öþÿ
þÿ€ûÚz!ResUsersDeletion._gc_portal_usersN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_nameÚ_descriptionÚ	_rec_namer   ÚMany2oner   ÚIntegerr   Ú	Selectionr   r   Údependsr   ÚmodelrA   r   r   r   r   r      s    
ÿ
r   )ÚloggingÚodoor   r   r   Úodoo.exceptionsr   Ú	getLoggerrB   r/   ÚModelr   r   r   r   r   Ú<module>   s
   
