o
    &zh                     @   s  d dl Z d dlZd dlZd dlZd dl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	Zejgd
 ejged
   Zd#ddZdd Zdd Zdd Zd#ddZdd Zdd Zdd Zd#ddZ dd Z!d#dd Z"d!d" Z#dS )$    N)OrderedDict)urlsplit)settings)get_user_model)ImproperlyConfiguredValidationError)	force_strapp_settings      c              	   C   s   ddl m} | }d }|pd}| D ]M}|sqtdt|}|ddd}t|dkr.qtt	|d|
 }|d	d }| }t	d
d|}z
|j|dd}W  n	 ty^   Y qw |pbdS )N   get_adapterz[^\w\s@+.-]NFKDasciiignorer    @z\s+_Tshallowuser)account.adapterr   unicodedata	normalizer   encodedecodelenresublowersplitstripclean_usernamer   )txtsregexr   adapterusernametxt r*   H/var/www/html/kangema/venv/lib/python3.10/site-packages/allauth/utils.py_generate_unique_username_base   s,   r,   c                  C   s4   ddl m}  | d urt }|j| j}|S d}|S )Nr   USER_MODEL_USERNAME_FIELDr   )account.app_settingsr.   r   _meta	get_field
max_length)r.   Userr2   r*   r*   r+   get_username_max_length8   s   r4   c                 C   s6   t  }ddd t|D }| d|t|  | S )Nr   c                 s   s    | ]
}t t| V  qd S N)randomchoiceUSERNAME_SUFFIX_CHARS).0ir*   r*   r+   	<genexpr>E   s    
z.generate_username_candidate.<locals>.<genexpr>r   )r4   joinranger   )basenamesuffix_lengthr2   suffixr*   r*   r+   generate_username_candidateC   s
   
rA   c                 C   sf   ddl m} t| |kr| g}ng }td|t|  }tt t}t||D ]
}|t	| | q&|S )Nr   )USERNAME_MIN_LENGTH)
r/   rB   r   maxminr4   MAX_USERNAME_SUFFIX_LENGTHr=   appendrA   )r>   rB   retmin_suffix_lengthmax_suffix_lengthr?   r*   r*   r+   generate_username_candidatesK   s   rJ   c           
   	   C   s   ddl m} ddlm} ddlm} | }t| |}t|}|| j|dd}t	dd	 |D }|D ]}	|	
 |vrNz
|j|	dd
W   S  tyM   Y q2w q2td)Nr   )filter_users_by_usernamer   r   r-   T)flatc                 S   s   g | ]}|  qS r*   )r!   )r9   nr*   r*   r+   
<listcomp>e   s    z,generate_unique_username.<locals>.<listcomp>r   z Unable to find a unique username)allauth.account.utilsrK   r   r   r/   r.   r,   rJ   values_listsetr!   r$   r   NotImplementedError)
r%   r&   rK   r   r.   r'   r>   
candidatesexisting_usernames	candidater*   r*   r+   generate_unique_usernameY   s&   
rV   c                 C   s2   t | tsJ | dd\}}tt||}|S )N.r   )
isinstancestrrsplitgetattr	importlibimport_module)pathpkgattrrG   r*   r*   r+   import_attributep   s   ra   c                 C   s   t | s
t| }|S | }|S r5   )callablera   )path_or_callablerG   r*   r*   r+   import_callablew   s
   rd   c              	   C   sX   |du rdS t  }|D ]}z
| j|||< W q ty    Y qw || j || _dS )a  
    This function is a verbatim copy of django.forms.Form.order_fields() to
    support field ordering below Django 1.9.

    field_order is a list of field names specifying the order. Append fields
    not included in the list in the default order for backward compatibility
    with subclasses not overriding field_order. If field_order is None, keep
    all fields in the order defined in the class. Ignore unknown fields in
    field_order to allow disabling fields in form subclasses without
    redefining ordering.
    N)r   fieldspopKeyErrorupdate)formfield_orderre   keyr*   r*   r+   set_form_field_order   s   
rl   c                 C   s   ddl m} | du r4tjstdddlm} |j }t|}|j	r&|j
s1dj|j|j|d}n|}n| |}|sC|jd	krC|j}|rP|d
 |d
d  }|S )zrequest.build_absolute_uri() helper

    Like request.build_absolute_uri, but gracefully handling
    the case where request is None.
    r   r	   Nz6Passing `request=None` requires `sites` to be enabled.r   )Sitez{proto}://{domain}{url})protodomainurlhttps:   )accountr
   SITES_ENABLEDr   django.contrib.sites.modelsrm   objectsget_currentr   schemenetlocformatDEFAULT_HTTP_PROTOCOLro   build_absolute_uri	partition)requestlocationprotocolaccount_settingsrm   sitebitsurir*   r*   r+   r}      s,   

r}   c                 C   s"   |  ||}t|trt|}|S r5   )getrX   rY   ra   )formsform_iddefault_form
form_classr*   r*   r+   get_form_class   s   
r   c                 C   s&   | d u r|S | j |p| j||S r5   )POSTr   GET)r   paramdefaultr*   r*   r+   get_request_param   s   r   c                 C   s"   t tddd }t|}|| |S )NALLAUTH_SETTING_GETTERc                 S   s   t t| |S r5   )r[   r   )namedfltr*   r*   r+   <lambda>   s    zget_setting.<locals>.<lambda>)r[   r   rd   )r   r   getterr*   r*   r+   get_setting   s   
r   r5   )$r\   r6   r   stringr   collectionsr   urllib.parser   django.confr   django.contrib.authr   django.core.exceptionsr   r   django.utils.encodingr   allauthr
   rE   digitsascii_lettersr8   r,   r4   rA   rJ   rV   ra   rd   rl   r}   r   r   r   r*   r*   r*   r+   <module>   s8    


*
