o
    &zh                     @   s   d dl Z d dlZd dlmZ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 G dd deZdd ZdS )    N)AnyDictOptional)get_user_model)models)Field)app_settings)EmailAddress)user_displayuser_username)BaseAdapter)default_get_frontend_url)import_attributec                
   @   s\   e Zd ZdZdddddejd dd	d
d	Zdeee	f fddZ
dd Zdd Zdd ZdS )DefaultHeadlessAdapteraB  The adapter class allows you to override various functionality of the
    ``allauth.headless`` app.  To do so, point ``settings.HEADLESS_ADAPTER`` to your own
    class that derives from ``DefaultHeadlessAdapter`` and override the behavior by
    altering the implementation of the methods according to your own need.
    zUnknown account.z`client_id` required.zInvalid token.z/Provider does not support token authentication.z*`id_token` and/or `access_token` required.requiredzUnknown email address.zUnknown provider.zInvalid URL.)	account_not_foundclient_id_requiredinvalid_token"token_authentication_not_supportedtoken_requiredr   unknown_emailunknown_providerinvalid_urlreturnc                 C   s   dd t | | D S )a  
        Returns the basic user data. Note that this data is also exposed in
        partly authenticated scenario's (e.g. password reset, email
        verification).

        Do not override this method if you would like your customized user payloads
        to be reflected in the (dynamically rendered) OpenAPI specification. In that
        case, override ``get_user_dataclass()`` and ``user_as_dataclass`` instead.
        c                 S   s   i | ]\}}|d vr||qS )) N ).0kvr   r   S/var/www/html/kangema/venv/lib/python3.10/site-packages/allauth/headless/adapter.py
<dictcomp>1   s
    z9DefaultHeadlessAdapter.serialize_user.<locals>.<dictcomp>)dataclassesasdictuser_as_dataclassitems)selfuserr   r   r   serialize_user'   s   
z%DefaultHeadlessAdapter.serialize_userc                 K   s   t | j|fi |S )z/Return the frontend URL for the given URL name.)r   request)r%   urlnamekwargsr   r   r   get_frontend_url7   s   z'DefaultHeadlessAdapter.get_frontend_urlc                 C   s   |   }i }t }t|jj}|jsd}nt|tjr|j}nt|j}t	j
r-t||d< |jr7tj|}nd}|||r@|ndt|| d |di |S )z
        See ``get_user_dataclass()``. This method returns an instance of
        that ``dataclass``, populated with the given ``user`` fields.
        Nusername)idemaildisplayhas_usable_passwordr   )get_user_dataclassr   type_metapk
issubclassr   IntegerFieldstraccount_settingsUSER_MODEL_USERNAME_FIELDr   r	   objectsget_primary_emailupdater
   r0   )r%   r&   UserDcr*   Userpk_field_classid_dcr.   r   r   r   r#   ;   s,   

z(DefaultHeadlessAdapter.user_as_dataclassc              
   C   s   g }t  }t|jj}t|tjrt}tt	 }nt|tj
r%t}d}nt}d}dd }||dt| d||dtdd	|d
tt dd|dtddg tjr[||dtdd td|S )a  
        Basic user data payloads are exposed in some of the headless responses. If
        you need to customize these payloads in such a way that your custom user
        payload is also reflected in the OpenAPI specification, you wil need to
        provide a ``dataclass`` representing the schema of your custom payload,
        as well as method that takes a ``User`` instance and wraps it into your
        dataclass. This method returns that ``dataclass``.
        {   uidc                 S   s   | |t j||ddfS )N)descriptionexample)metadata)r!   field)attrtyprC   rD   r   r   r   dc_fieldp   s   z;DefaultHeadlessAdapter.get_user_dataclass.<locals>.dc_fieldr-   zThe user ID.r/   zThe display name for the user.zMagic Wizardr.   zThe email address.zemail@domain.orgr0   z.Whether or not the account has a password set.Tr,   zThe username.wizardr>   )r   r2   r3   r4   r5   r   	UUIDFieldr7   uuiduuid4r6   intextendr   boolr8   r9   appendr!   make_dataclass)r%   fieldsr>   r?   id_type
id_examplerI   r   r   r   r1   Z   s>   	z)DefaultHeadlessAdapter.get_user_dataclassN)__name__
__module____qualname____doc__r   default_error_messageserror_messagesr   r7   r   r'   r+   r#   r1   r   r   r   r   r      s     	r   c                   C   s   t tj S )N)r   r   ADAPTERr   r   r   r   get_adapter   s   r]   )r!   rL   typingr   r   r   django.contrib.authr   	django.dbr   django.forms.fieldsr   allauth.accountr   r8   allauth.account.modelsr	   allauth.account.utilsr
   r   allauth.core.internal.adapterr   allauth.core.internal.httpkitr   allauth.headlessallauth.utilsr   r   r]   r   r   r   r   <module>   s      