o
    wzh6                     @   sP  d dl mZ d dlmZ d dlmZ d dlmZ d dlZddl	m
Z
mZmZmZmZ d dlmZmZ G d	d
 d
ejZG dd deZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd  d ejZG d!d dejZdS )"    )forms)User)AuthenticationForm)ValidationErrorN   )CartShippingAddressOrder	OrderItemShippingMethod)ProductCategoryc                   @   s   e Zd ZejejdddddddZejejddddd	Zejd
dejdddddZ	ejddej
ddddddZG dd dZdd Zdd Zdd Zdd ZdS )CustomerRegistrationFormform-controlzEnter passwordclassplaceholderattrs   +Password must be at least 6 characters long)widget
min_length	help_textzConfirm passwordr      FzPhone number (optional)
max_lengthrequiredr      zAddress (optional)   r   r   rowsc                   @   s^   e Zd ZeZg dZejddddejddddejddddejdddddZ	d	S )
zCustomerRegistrationForm.Metausernameemail
first_name	last_namer   zChoose a usernamer   r   Email address
First name	Last nameN
__name__
__module____qualname__r   modelfieldsr   	TextInput
EmailInputwidgets r4   r4   #/var/www/html/kangema/shop/forms.pyMeta+   (    
r6   c                 C   *   | j d}tjj|d rtd|S )Nr$   )r$   z7Username already exists. Please choose a different one.cleaned_datagetr   objectsfilterexistsr   )selfr$   r4   r4   r5   clean_usernameA      z'CustomerRegistrationForm.clean_usernamec                 C   r8   )Nr%   r%   z7Email already registered. Please use a different email.r9   r?   r%   r4   r4   r5   clean_emailG   rA   z$CustomerRegistrationForm.clean_emailc                 C   s(   | j d}|rtd|std|S )Nphonez^\+?[\d\s\-\(\)]+$z"Please enter a valid phone number.)r:   r;   rematchr   )r?   rE   r4   r4   r5   clean_phoneM   s   z$CustomerRegistrationForm.clean_phonec                 C   4   | j d}| j d}|r|r||krtd|S )Npasswordconfirm_passwordzPasswords do not match.r:   r;   r   )r?   rJ   rK   r4   r4   r5   clean_confirm_passwordS   
   z/CustomerRegistrationForm.clean_confirm_passwordN)r,   r-   r.   r   	CharFieldPasswordInputrJ   rK   r1   rE   Textareaaddressr6   r@   rD   rH   rM   r4   r4   r4   r5   r   
   sJ    
r   c                   @   sH   e Zd ZejejdddddZejejdddddZdd Z	d	S )
CustomerLoginFormr   zUsername or Emailr   r   r   Passwordc                 C   sF   | j d}d|v r!ztjj|d}|jW S  tjy    Y |S w |S )Nr$   @rB   )r:   r;   r   r<   r$   DoesNotExist)r?   r$   userr4   r4   r5   r@   i   s   z CustomerLoginForm.clean_usernameN)
r,   r-   r.   r   rO   r1   r$   rP   rJ   r@   r4   r4   r4   r5   rS   [   s    rS   c                   @   s`   e Zd ZejddejdddddZejddejdd	d
dddZG dd dZ	dd Z
dS )CustomerProfileFormr   Fr   zPhone numberr   r   r   r   Addressr    r!   c                   @   s^   e Zd ZeZg dZejddddejddddejddddejdd	dddZ	d
S )zCustomerProfileForm.Metar#   r   T)r   readonlyr   r(   r   r)   r*   Nr+   r4   r4   r4   r5   r6      r7   r6   c                 C   s6   | j d}tjj|dj| jjd rt	d|S )Nr%   rB   idz)Email already registered by another user.)
r:   r;   r   r<   r=   excludeinstancer\   r>   r   rC   r4   r4   r5   rD      s   zCustomerProfileForm.clean_emailN)r,   r-   r.   r   rO   r1   rE   rQ   rR   r6   rD   r4   r4   r4   r5   rX   u   s(    
rX   c                   @   s   e Zd ZG dd dZdS )CustomerAddressFormc                   @   sn   e Zd ZeZg dZejddddejddddejddddejddddejdd	dddZd
S )zCustomerAddressForm.Metaaddress_line_1address_line_2citypostal_codecountryr   Address Line 1r   r   Address Line 2 (optional)CityPostal CodeCountryN)	r,   r-   r.   r   r/   r0   r   r1   r3   r4   r4   r4   r5   r6      s0    
r6   N)r,   r-   r.   r6   r4   r4   r4   r5   r_      s    r_   c                       s   e Zd ZejejddddddZejejdddddddd	Zejejdd
ddd
dZ fddZ	dd Z
dd Zdd Z  ZS )CustomerPasswordChangeFormr   zCurrent Passwordr   r   )r   labelzNew Passwordr   r   )r   rl   r   r   zConfirm New Passwordc                    s   || _ t j|i | d S )N)rW   super__init__)r?   rW   argskwargs	__class__r4   r5   rn      s   z#CustomerPasswordChangeForm.__init__c                 C   s$   | j d}| j|std|S )Ncurrent_passwordzCurrent password is incorrect.)r:   r;   rW   check_passwordr   )r?   rs   r4   r4   r5   clean_current_password   s   z1CustomerPasswordChangeForm.clean_current_passwordc                 C   rI   )Nnew_password1new_password2zNew passwords do not match.rL   )r?   rv   rw   r4   r4   r5   clean_new_password2   rN   z.CustomerPasswordChangeForm.clean_new_password2c                 C   s"   | j | jd  | j   | j S )Nrv   )rW   set_passwordr:   save)r?   r4   r4   r5   rz      s   
zCustomerPasswordChangeForm.save)r,   r-   r.   r   rO   rP   rs   rv   rw   rn   ru   rx   rz   __classcell__r4   r4   rq   r5   rk      s8    	rk   c                       sL   e Zd ZdZejejdZejddejddddd	Z	 fd
dZ
  ZS )AddToCartFormzV
    Form for adding products to the cart with validation for stock availability.
    r   r   Quantityr   zEnter quantityr   r   )	min_valuerl   r   c                    s`   t   }|d}|d}tjj|d }|std||j	kr.td|j	 d|S )N
product_idquantityr[   z$The selected product does not exist.zOnly z units available.)
rm   cleanr;   r   r<   r=   firstr   r   stock_quantity)r?   r:   r   r   productrq   r4   r5   r     s   




zAddToCartForm.clean)r,   r-   r.   __doc__r   IntegerFieldHiddenInputr   NumberInputr   r   r{   r4   r4   rq   r5   r|      s    r|   c                   @   s6   e Zd ZdZejdejddddddZd	d
 ZdS )GuestCheckoutFormzg
    Form for guest users to provide an email during checkout, with validation for existing users.
    zEmail Addressr   zEnter your emailr   r   T)rl   r   r   c                 C   s*   | j d }tjj|d rtd|S )Nr%   rB   zAThis email is associated with an existing account. Please log in.)r:   r   r<   r=   r>   r   r   rC   r4   r4   r5   rD     s   

zGuestCheckoutForm.clean_emailN)	r,   r-   r.   r   r   
EmailFieldr2   r%   rD   r4   r4   r4   r5   r     s    r   c                   @      e Zd ZdZG dd dZdS )ShippingAddressFormz>
    Form for capturing shipping details during checkout.
    c                   @   sl   e Zd ZeZg dZejddddejddddejddddejddddejd	diddZ	d
S )zShippingAddressForm.Metar`   r   rf   r   r   rg   rh   ri   r   N)
r,   r-   r.   r   r/   r0   r   r1   Selectr3   r4   r4   r4   r5   r6   %  s    
r6   Nr,   r-   r.   r   r6   r4   r4   r4   r5   r   !      r   c                   @   s.   e Zd ZdZejejjddej	dddZ
dS )ShippingMethodFormz?
    Form for selecting a shipping method during checkout.
    T)	is_activezShipping MethodN)querysetr   rl   empty_label)r,   r-   r.   r   r   ModelChoiceFieldr   r<   r=   RadioSelectshipping_methodr4   r4   r4   r5   r   1  s    
r   c                   @   s.   e Zd ZdZG dd dZdd Zdd ZdS )	OrderItemFormzV
    Form for managing items in an order, with validation for quantity and price.
    c                   @   s>   e Zd ZeZg dZejddddejdddddZdS )	zOrderItemForm.Meta)r   r   pricer   r}   r   r   Price)r   r   N)	r,   r-   r.   r
   r/   r0   r   r   r3   r4   r4   r4   r5   r6   B  s    
r6   c                 C   s"   | j d}|dkrtd|S )Nr   r   zQuantity must be at least 1.)r:   r;   r   r   )r?   r   r4   r4   r5   clean_quantityJ  s   
zOrderItemForm.clean_quantityc                 C   s4   | j d}| j d}|r||jkrtd|S )Nr   r   z'Invalid price for the selected product.)r:   r;   selling_pricer   r   )r?   r   r   r4   r4   r5   clean_priceP  s
   
zOrderItemForm.clean_priceN)r,   r-   r.   r   r6   r   r   r4   r4   r4   r5   r   >  s
    r   c                   @   r   )	OrderFormz.
    Form for creating or editing orders.
    c                   @   sH   e Zd ZeZg dZejddidejddidejddiddZdS )zOrderForm.Meta)shipping_addressr   statusr   r   r   N)	r,   r-   r.   r	   r/   r0   r   r   r3   r4   r4   r4   r5   r6   \  s    
r6   Nr   r4   r4   r4   r5   r   X  r   r   c                       s   e Zd ZdZejddejdddddZejd	dg ej	d
diddZ
ejdddejdddddZejdddejdddddZ fddZ fddZ  ZS )
SearchFormz<
    Form for searching products with optional filters.
    SearchFr   zSearch for products...r   r   )rl   r   r   r   r   )rl   r   choicesr   z	Min Pricer   zMinimum price)rl   r   r~   r   z	Max PricezMaximum pricec                    s8   t  j|i | dgdd tj D  | jd _dS )z8
        Dynamically populate category choices.
        ) zAll Categoriesc                 S   s   g | ]}|j |jfqS r4   )r\   name).0categoryr4   r4   r5   
<listcomp>  s    z'SearchForm.__init__.<locals>.<listcomp>r   N)rm   rn   r   r<   allr0   r   )r?   ro   rp   rq   r4   r5   rn     s   
zSearchForm.__init__c                    sD   t   }|d}|d}|d ur |d ur ||kr td|S )N	min_price	max_pricez3Minimum price cannot be greater than maximum price.)rm   r   r;   r   r   )r?   r:   r   r   rq   r4   r5   r     s   



zSearchForm.clean)r,   r-   r.   r   r   rO   r1   queryChoiceFieldr   r   DecimalFieldr   r   r   rn   r   r{   r4   r4   rq   r5   r   g  s6    	r   c                   @   r   )r   z:
    Form for creating and updating shipping methods.
    c                   @   s   e Zd ZeZg dZdS )zShippingMethodForm.Meta)r   descriptioncostr   N)r,   r-   r.   r   r/   r0   r4   r4   r4   r5   r6     s    r6   Nr   r4   r4   r4   r5   r     r   ) djangor   django.contrib.auth.modelsr   django.contrib.auth.formsr   django.core.exceptionsr   rF   modelsr   r   r	   r
   r   inventory.modelsr   r   	ModelFormr   rS   rX   r_   Formrk   r|   r   r   r   r   r   r   r4   r4   r4   r5   <module>   s(    Q140