U
    7h&                     @   sF  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mZ d dlmZmZmZ G dd	 d	e
ZG d
d deeZG dd deZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZG dd dZG dd deZG dd deeeZG d d! d!eeZdS )"    N)ImproperlyConfigured)Form)models)HttpResponseRedirect)ContextMixinTemplateResponseMixinView)BaseDetailViewSingleObjectMixin!SingleObjectTemplateResponseMixinc                       sr   e Zd ZdZi ZdZdZ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 Z fddZ  ZS )	FormMixinz5Provide a way to show and handle a form in a request.Nc                 C   s
   | j  S )z6Return the initial data to use for forms on this view.)initialcopyself r   S/var/www/formularioweb/env/lib/python3.8/site-packages/django/views/generic/edit.pyget_initial   s    zFormMixin.get_initialc                 C   s   | j S )z#Return the prefix to use for forms.)prefixr   r   r   r   
get_prefix   s    zFormMixin.get_prefixc                 C   s   | j S )zReturn the form class to use.)
form_classr   r   r   r   get_form_class   s    zFormMixin.get_form_classc                 C   s   |dkr|   }|f |  S )z7Return an instance of the form to be used in this view.N)r   get_form_kwargs)r   r   r   r   r   get_form#   s    zFormMixin.get_formc                 C   s:   |   |  d}| jjdkr6|| jj| jjd |S )8Return the keyword arguments for instantiating the form.)r   r   )POSTPUT)datafiles)r   r   requestmethodupdater   ZFILESr   kwargsr   r   r   r   )   s    zFormMixin.get_form_kwargsc                 C   s   | j stdt| j S )<Return the URL to redirect to after processing a valid form.-No URL to redirect to. Provide a success_url.)success_urlr   strr   r   r   r   get_success_url9   s    zFormMixin.get_success_urlc                 C   s   t |  S )z3If the form is valid, redirect to the supplied URL.)r   r(   r   formr   r   r   
form_valid?   s    zFormMixin.form_validc                 C   s   |  | j|dS )z0If the form is invalid, render the invalid form.)r*   Zrender_to_responseget_context_datar)   r   r   r   form_invalidC   s    zFormMixin.form_invalidc                    s"   d|kr|   |d< t jf |S )z&Insert the form into the context dict.r*   )r   superr-   r"   	__class__r   r   r-   G   s    zFormMixin.get_context_data)N)__name__
__module____qualname____doc__r   r   r&   r   r   r   r   r   r   r(   r+   r.   r-   __classcell__r   r   r0   r   r      s   
r   c                       s@   e Zd ZdZdZdd Z fddZdd Z fd	d
Z  Z	S )ModelFormMixinz:Provide a way to show and handle a ModelForm in a request.Nc                 C   s   | j dk	r| jrtd| jr$| jS | jdk	r6| j}n$t| dddk	rP| jj}n
|  j}| j dkrttd| jj t	j
|| j dS dS )z*Return the form class to use in this view.Nz;Specifying both 'fields' and 'form_class' is not permitted.objectzUUsing ModelFormMixin (base class of %s) without the 'fields' attribute is prohibited.)fields)r9   r   r   modelgetattrr8   r1   Zget_querysetr2   model_formsZmodelform_factory)r   r:   r   r   r   r   S   s$    



zModelFormMixin.get_form_classc                    s(   t   }t| dr$|d| ji |S )r   r8   instance)r/   r   hasattrr!   r8   r"   r0   r   r   r   p   s    

zModelFormMixin.get_form_kwargsc                 C   sJ   | j r| j jf | jj}n,z| j }W n tk
rD   tdY nX |S )r$   z^No URL to redirect to.  Either provide a url or define a get_absolute_url method on the Model.)r&   formatr8   __dict__Zget_absolute_urlAttributeErrorr   )r   urlr   r   r   r(   w   s    
zModelFormMixin.get_success_urlc                    s   |  | _t |S )z0If the form is valid, save the associated model.)saver8   r/   r+   r)   r0   r   r   r+      s    
zModelFormMixin.form_valid)
r2   r3   r4   r5   r9   r   r   r(   r+   r6   r   r   r0   r   r7   N   s   r7   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ProcessFormViewz.Render a form on GET and processes it on POST.c                 O   s   |  |  S )z=Handle GET requests: instantiate a blank version of the form.r,   r   r   argsr#   r   r   r   get   s    zProcessFormView.getc                 O   s(   |   }| r| |S | |S dS )z
        Handle POST requests: instantiate a form instance with the passed
        POST variables and then check if it's valid.
        N)r   is_validr+   r.   r   r   rF   r#   r*   r   r   r   post   s    
zProcessFormView.postc                 O   s   | j ||S N)rJ   r   rF   r#   r   r   r   put   s    zProcessFormView.putN)r2   r3   r4   r5   rG   rJ   rM   r   r   r   r   rD      s   rD   c                   @   s   e Zd ZdZdS )BaseFormViewz"A base view for displaying a form.Nr2   r3   r4   r5   r   r   r   r   rN      s   rN   c                   @   s   e Zd ZdZdS )FormViewz?A view for displaying a form and rendering a template response.NrO   r   r   r   r   rP      s   rP   c                       s,   e Zd ZdZ fddZ fddZ  ZS )BaseCreateViewz
    Base view for creating a new object instance.

    Using this base class requires subclassing to provide a response mixin.
    c                    s   d | _ t j|f||S rK   )r8   r/   rG   rE   r0   r   r   rG      s    zBaseCreateView.getc                    s   d | _ t j|f||S rK   )r8   r/   rJ   rE   r0   r   r   rJ      s    zBaseCreateView.postr2   r3   r4   r5   rG   rJ   r6   r   r   r0   r   rQ      s   rQ   c                   @   s   e Zd ZdZdZdS )
CreateViewzQ
    View for creating a new object, with a response rendered by a template.
    _formNr2   r3   r4   r5   Ztemplate_name_suffixr   r   r   r   rS      s   rS   c                       s,   e Zd ZdZ fddZ fddZ  ZS )BaseUpdateViewz
    Base view for updating an existing object.

    Using this base class requires subclassing to provide a response mixin.
    c                    s   |   | _t j|f||S rK   )
get_objectr8   r/   rG   rE   r0   r   r   rG      s    
zBaseUpdateView.getc                    s   |   | _t j|f||S rK   )rW   r8   r/   rJ   rE   r0   r   r   rJ      s    
zBaseUpdateView.postrR   r   r   r0   r   rV      s   rV   c                   @   s   e Zd ZdZdZdS )
UpdateViewzDView for updating an object, with a response rendered by a template.rT   NrU   r   r   r   r   rX      s   rX   c                   @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	DeletionMixinz&Provide the ability to delete objects.Nc                 O   s$   |   | _|  }| j  t|S )zn
        Call the delete() method on the fetched object and then redirect to the
        success URL.
        )rW   r8   r(   deleter   )r   r   rF   r#   r&   r   r   r   rZ      s    

zDeletionMixin.deletec                 O   s   | j |f||S rK   )rZ   rE   r   r   r   rJ      s    zDeletionMixin.postc                 C   s$   | j r| j jf | jjS tdd S )Nr%   )r&   r?   r8   r@   r   r   r   r   r   r(      s    zDeletionMixin.get_success_url)r2   r3   r4   r5   r&   rZ   rJ   r(   r   r   r   r   rY      s
   rY   c                   @   s   e Zd ZdS )DeleteViewCustomDeleteWarningN)r2   r3   r4   r   r   r   r   r[      s   r[   c                       s4   e Zd ZdZeZ fddZdd Zdd Z  Z	S )BaseDeleteViewzx
    Base view for deleting an object.

    Using this base class requires subclassing to provide a response mixin.
    c                    s<   | j jtjk	r*tjd| j j dtdd t j|| d S )NzbDeleteView uses FormMixin to handle POST requests. As a consequence, any custom deletion logic in z2.delete() handler should be moved to form_valid().   )
stacklevel)	r1   rZ   rY   warningswarnr2   r[   r/   __init__rL   r0   r   r   ra     s    zBaseDeleteView.__init__c                 O   s2   |   | _|  }| r$| |S | |S d S rK   )rW   r8   r   rH   r+   r.   rI   r   r   r   rJ     s
    

zBaseDeleteView.postc                 C   s   |   }| j  t|S rK   )r(   r8   rZ   r   )r   r*   r&   r   r   r   r+     s    
zBaseDeleteView.form_valid)
r2   r3   r4   r5   r   r   ra   rJ   r+   r6   r   r   r0   r   r\      s
   r\   c                   @   s   e Zd ZdZdZdS )
DeleteViewzs
    View for deleting an object retrieved with self.get_object(), with a
    response rendered by a template.
    Z_confirm_deleteNrU   r   r   r   r   rb      s   rb   )r_   Zdjango.core.exceptionsr   Zdjango.formsr   r   r<   Zdjango.httpr   Zdjango.views.generic.baser   r   r   Zdjango.views.generic.detailr	   r
   r   r   r7   rD   rN   rP   rQ   rS   rV   rX   rY   Warningr[   r\   rb   r   r   r   r   <module>   s&   ?=(