o
    $h                     @   s  d dl mZ d dlm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 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	 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 d dl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mZmZm Z m!Z!m"Z"m#Z#m$Z$ G dd dejZ%d dl mZ d dlmZ d
dlmZm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+ee ee+d
ddZ,G d d! d!ejZ-G d"d# d#ejZ.G d$d% d%ej/Z0G d&d' d'ejZ1G d(d) d)ejZ2G d*d+ d+ejZ3G d,d- d-ejZ4G d.d/ d/ejZ5G d0d1 d1ej/Z6G d2d3 d3ejZ7d dl mZ d d4l8m9Z9 d
d5lm$Z$ e9 Z:G d6d7 d7ejZ;dS )8    )forms)ValidationError)	ModelFormModelMultipleChoiceFieldinlineformset_factory)timezone)gettext_lazy)CKEditorWidget)BytesIO)Image)InMemoryUploadedFile   )Issue	IssueItemBlog)QN)
Authorr   BlogCategoryContactOptionPoll
Subscriber
TeamMemberTopicsTaskc                       s  e Zd ZejdejdddddddZejed	d
dddddZej	e
j ejddiddddZej	ej ejddiddddZeej ejddiddddZeej ejddiddddZejejejddiddddZejejddddddddZejejddiddddZej ej!ddidddd d!Z"G d"d# d#Z# fd$d%Z$d&d' Z% fd(d)Z&d*d+ Z'd,d- Z(d0 fd.d/	Z)  Z*S )1BlogForm   z}w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500zEnter blog post titleclassplaceholderattrsTz0The title of your blog post (max 200 characters))
max_lengthwidgetrequired	help_textzw-full
   r   rowsz"The main content of your blog post)r#   r$   r%   r   zSelect a category for this post)querysetr#   r$   r%   zSelect a topic for this posthiddenzSelect one or more authorsFz Select related topics (optional)zSet the status of this post)choicesr#   r$   r%   zdatetime-local)r   type%Y-%m-%dT%H:%M)r!   formatz:Set the publication date and time (leave blank for drafts)zkrelative cursor-pointer rounded-md font-medium hover:cursor-pointer text-blue-600 focus-within:outline-nonez-Upload an image for this blog post (optional)zEh-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 roundedz&Feature this blog post on the homepage)r#   r$   initialr%   c                   @      e Zd ZeZg dZdS )zBlogForm.Meta)
titlecontentcategorytopicauthorsrelated_topicsstatuspublished_timefeature_this
meta_imageN)__name__
__module____qualname__r   modelfields r@   r@   ;/var/www/html/mimamsha/mimansha/apps/mimansha_main/forms.pyMeta       rB   c                    s   t  j|i | | jjr| jjr| jjd| jd< | jjr2| jjr2tj	j
| jjjd| jd _nd| jv rEtj	j
| jd d| jd _| jjrWdd | jj D | jd< | j D ]\}}|| jv ro|jjd  d	7  < q\d S )
Nr-   r8   idr6   r4   c                 S   s   g | ]}|j qS r@   pk).0tr@   r@   rA   
<listcomp>   s    z%BlogForm.__init__.<locals>.<listcomp>r   z border-red-500)super__init__instancerG   r8   strftimer/   r4   r   objectsexcluderE   r?   r)   r6   allitemserrorsr#   r!   selfargskwargs
field_namefield	__class__r@   rA   rL      s   

zBlogForm.__init__c                 C   sT   | j d}| j d}|dkr|st }|r(|t tjdd kr(td|S )Nr7   r8   	published   )daysz;Publication time cannot be more than 30 days in the future.)cleaned_datagetr   now	timedeltar   )rU   r7   r8   r@   r@   rA   clean_published_time   s   zBlogForm.clean_published_timec                    sV   t   }|d}|d}|dkr|st | jd< |d}|s)tddi|S )Nr7   r8   r\   r5   z%At least one author must be selected.)rK   cleanr`   r   ra   r_   r   )rU   r_   r7   r8   r5   rZ   r@   rA   rd      s   



zBlogForm.cleanc                 C   sP   | j d}|r&tjjdd}| jjr|j| jjd}| dkr&t	
d|S )Nr9   T)r9   rF      z/Only four blog posts can be featured at a time.)r_   r`   r   rO   filterrM   rG   rP   countr   r   )rU   featureqsr@   r@   rA   clean_feature_this   s   
zBlogForm.clean_feature_thisc                 C   *   | j jr| j jst| j ddrtddS )Nspecial_flagFzDThis blog post cannot be deleted because it is referenced elsewhere.TrM   rG   is_protectedgetattrr   rU   r@   r@   rA   clean_delete      zBlogForm.clean_deletec                    st   t  jdd}|jdkr|jst |_|  |   d| jv r*|j	| jd  d| jv r8|j
	| jd  |S )NFcommitr\   r6   r5   )rK   saver7   r8   r   ra   save_m2mr_   r6   setr5   )rU   rt   rM   rZ   r@   rA   ru      s   


zBlogForm.saveT)+r;   r<   r=   r   	CharField	TextInputr1   r	   r2   ModelChoiceFieldr   rO   rQ   Selectr3   r   r4   r   r   SelectMultipler5   r6   ChoiceFieldr   Statusr7   DateTimeFieldDateTimeInputr8   
ImageField	FileInputr:   BooleanFieldCheckboxInputr9   rB   rL   rc   rd   rj   rq   ru   __classcell__r@   r@   rZ   rA   r   -   s    
								r   )r   r   c                       2   e Zd ZG dd dZ fddZdd Z  ZS )
AuthorFormc                
   @   s   e Zd ZeZg dZejddidejddddej	dd	d
ddej
d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AuthorForm.Meta)r7   nameimagedescription
affilationphoneemailr   zw-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all appearance-none bg-whiter    zxw-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-allzDr. Jane Smithr   r*   image/*id_image)r   acceptrE   zw-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all min-h-[120px]zBrief bio about the author...re   )r   r   r(   zUniversity of Examplez+1 (555) 123-4567zauthor@example.comN)r;   r<   r=   r   r>   r?   r   r|   rz   ClearableFileInputTextarea
EmailInputwidgetsr@   r@   r@   rA   rB      sB    
rB   c                       t   }|S NrK   rd   rU   r_   rZ   r@   rA   rd        
zAuthorForm.cleanc                 C   (   | j jrtjj| j d rtddS )N)r5   zRThis author cannot be deleted because they are assigned to one or more blog posts.TrM   rG   r   rO   rf   existsr   rp   r@   r@   rA   rq     s   zAuthorForm.clean_delete)r;   r<   r=   rB   rd   rq   r   r@   r@   rZ   rA   r      s    #r   c                   @   s@   e Zd ZG dd dZejdejdddddd	Zd
d ZdS )
TopicsFormc                   @      e Zd ZeZdgZdS )zTopicsForm.Metar1   N)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB   "      
rB   i+  vblock w-full px-4 py-3 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-gray-400zEnter topic titler   r    zTopic Title)r"   r#   labelc                 C   s<   | j jrtjj| j d stjj| j d rtddS )N)r4   )r6   zJThis topic cannot be deleted because it is used in one or more blog posts.Tr   rp   r@   r@   rA   rq   0  s   (zTopicsForm.clean_deleteN	r;   r<   r=   rB   r   ry   rz   r1   rq   r@   r@   r@   rA   r   !  s    
r   c                   @   s<   e Zd ZG dd dZejejdddddZdd	 Zd
S )BlogCategoryFormc                   @   r   )zBlogCategoryForm.Metar1   N)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB   9  r   rB   r   zEnter Category Titler   r    r#   c                 C   r   )N)r3   zMThis category cannot be deleted because it is used in one or more blog posts.Tr   rp   r@   r@   rA   rq   E  s   zBlogCategoryForm.clean_deleteNr   r@   r@   r@   rA   r   8  s    r   c                	       s   e Zd ZG dd dZejdejddddddd	d
Zejej	ddddddd	dZ
ejdejddddddd	d
Zejejdddddddd	dZd fdd	Zdd Z  ZS )ContactFormc                   @   r0   )zContactForm.Meta)r   mailr   messageN)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB   N  rC   rB   d   r   zw-full p-4 border border-black rounded-lg focus:outline-none focus:ring-2 focus:ring-red-950 bg-white shadow-sm transition duration-200Your full nameT)rE   r   r   r   r$   r    )r"   r#   r   zyour.email@example.comr      r   z+977 9812345678r      zw-full p-4 border border-black rounded-lg focus:outline-none focus:ring-2 focus:ring-red-950 bg-white shadow-sm transition duration-200 resize-nonezHow can we help you?)rE   r   r(   r   r   r$   c              
      sT   t  jdd}|r(z|  |  W |S  ty' } zt|j|d }~ww |S )NFrs   )rK   ru   
full_cleanr   r   message_dict)rU   rt   contact_instanceerZ   r@   rA   ru     s   
zContactForm.savec                 C   sB   t | dd }|rz
tjj|d}W dS  tjy   tdw dS )N
contact_idrD   TzContact does not exist.F)ro   r   rO   r`   DoesNotExistr   )rU   r   contactr@   r@   rA   rq     s   zContactForm.clean_deleterx   )r;   r<   r=   rB   r   ry   rz   r   
EmailFieldr   r   r   r   r   ru   rq   r   r@   r@   rZ   rA   r   M  sV    
r   c                   @   "   e Zd ZG dd dZdd ZdS )PollFormc                   @   r   )zPollForm.MetaquestionN)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB     r   rB   c                 C   rk   )Nspecial_statusFz>This poll cannot be deleted because it has a protected status.Trm   rp   r@   r@   rA   rq     rr   zPollForm.clean_deleteNr;   r<   r=   rB   rq   r@   r@   r@   rA   r         r   c                   @   r   )
OptionFormc                   @   r   )zOptionForm.Metaoption_textN)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB     r   rB   c                 C   s0   | j jrt| j dr| j j dkrtddS )Nvotesr   z3This option cannot be deleted because it has votes.T)rM   rG   hasattrr   rg   r   rp   r@   r@   rA   rq     s   zOptionForm.clean_deleteNr   r@   r@   r@   rA   r     r   r   T)formextra
can_deletec                   @   r   )SubscriberFormc                   @   sF   e Zd ZeZddgZejddddddejddddddd	Z	d
S )zSubscriberForm.Metar   r   zEnter your namezblock w-full max-w-xs p-2 text-center rounded-md border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-smT)rE   r   r   r$   r    zEnter your email)r   r   N)
r;   r<   r=   r   r>   r?   r   rz   r   r   r@   r@   r@   rA   rB     s$    

rB   c                 C   s"   | j jrt| j ddrtddS )Nis_vipFz?This subscriber cannot be deleted because they have VIP status.TrM   rG   ro   r   rp   r@   r@   rA   rq     s   zSubscriberForm.clean_deleteNr   r@   r@   r@   rA   r     s    r   c                       r   )TeamMemberFormc                
   @   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i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TeamMemberForm.Meta)r   roler   facebook_link
insta_linktwitter_linkr   zform-input mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-200 focus:ring-opacity-50z
Enter namer   r    z
Enter roler   zblock w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100zFacebook URLzInstagram URLzTwitter URLzEmail addressN)r;   r<   r=   r   r>   r?   r   rz   r   URLInputr   r   r@   r@   r@   rA   rB     s>    

rB   c                    r   r   r   r   rZ   r@   rA   rd     r   zTeamMemberForm.cleanc                 C   s0   | j jrt| j ddst| j ddrtddS )z/Method to be called from the view when deleting
is_founderFis_key_memberzQThis team member cannot be deleted as they are marked as a key member or founder.Tr   rp   r@   r@   rA   validate_deletion  s   z TeamMemberForm.validate_deletion)r;   r<   r=   rB   rd   r   r   r@   r@   rZ   rA   r     s    )r   c                   @   s0   e Zd ZejdejdddddZdd Zd	S )
AuthorLookupFormzRegistered Phone NumberYw-full px-4 py-3 rounded-lg border-2 focus:ring-2 focus:ring-red-900 focus:border-red-300z"Enter your registered phone numberr   r    )r   r#   c                 C   s   dS )NTr@   rp   r@   r@   rA   rq   "  s   zAuthorLookupForm.clean_deleteN)r;   r<   r=   r   ry   rz   r   rq   r@   r@   r@   rA   r     s    r   c                   @   r   )BlogSubmitFormc                   @   s<   e Zd ZeZddgZejddddeddd	dd
Z	dS )zBlogSubmitForm.Metar1   r2   r   zEnter your article titler   r    z'prose max-w-none django-ckeditor-widgetr&   r'   )r1   r2   N)
r;   r<   r=   r   r>   r?   r   rz   r	   r   r@   r@   r@   rA   rB   *  s    
rB   c                 C   s    | j jr| j jdkrtddS )Ndraftz7Only draft blog posts can be deleted through this form.T)rM   rG   r7   r   rp   r@   r@   rA   rq   8  s   zBlogSubmitForm.clean_deleteNr   r@   r@   r@   rA   r   )  s    r   c                   @   r   )AuthorSubmitFormc                	   @   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ej	dd	d
ddej
ddiddZdS )zAuthorSubmitForm.Meta)r   r   r   r   r   r   r   r   r   r    zYour email addresszYour phone numberz Your organization or institution   zBrief bio or description)r   r(   r   r   zw-full px-4 py-3 rounded-lg border-2 file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-red-50 file:text-red-900 hover:file:bg-red-100N)r;   r<   r=   r   r>   r?   r   rz   r   r   r   r   r@   r@   r@   rA   rB   A  s8    
rB   c                 C   s*   | j jrtjj| j dd rtddS )Nr\   )r5   r7   zMThis author profile cannot be deleted because they have published blog posts.Tr   rp   r@   r@   rA   rq   _  s   zAuthorSubmitForm.clean_deleteNr   r@   r@   r@   rA   r   @  s    r   c                       sF   e Zd ZG dd dZ fddZ fddZdd Zd	d
 Z  ZS )	IssueFormc                   @   s|   e Zd ZeZg dZejde	 
dddejddidejdd	idejd
ddddZedededdZdS )zIssueForm.Meta)r   issue_numberr   publication_datecover_imager7   date%Y-%m-%d)r,   minr    r(   re   onchangeztogglePublicationDate()r   zfile-upload-input)r   r   )r   r   r7   r   z*Required for published or scheduled issuesz8Changing status may affect publication date requirementsz,Upload a high-quality cover image (JPEG/PNG))r   r7   r   N)r;   r<   r=   r   r>   r?   r   	DateInputr   ra   rN   r   r|   r   r   _
help_textsr@   r@   r@   rA   rB   h  s(    
rB   c                    s   t  j|i | | jjst d| jd jj	d< | jd jj	
tdddd | jd	 jj	
d
d
d td| jd _td| jd _d S )Nr   r   r   r   ze.g., Summer Edition 20233100)r   	minlength	maxlengthr   1)r   stepzCover Imager   z"Recommended size: 1200x1600 pixels)rK   rL   rM   rG   r   ra   rN   r?   r#   r!   updater   r   r%   )rU   rV   rW   rZ   r@   rA   rL     s   zIssueForm.__init__c                    s   t   }|d}|d}|r|tjjkr|S |tjjtjjfv r4|s4| dt	t
dd|idd |rst  }t|drE| n|}|tjjkr]||k r]| dt	t
ddd	 |tjjkrs||krs| dt	t
d
dd	 |S )Nr7   r   z/%(status)s issues must have a publication date.r$   )paramscoder   z5Scheduled issues must have a future publication date.invalid_date)r   z7Published issues cannot have a future publication date.)rK   rd   r`   r   r   DRAFT	PUBLISHED	SCHEDULED	add_errorr   r   r   ra   r   r   )rU   r_   r7   r   todaypub_daterZ   r@   rA   rd     sD   


	zIssueForm.cleanc              	   C   sZ   | j d}|d ur+zt|}|dk rttd|W S  ttfy*   ttdw |S )Nr   r   zIssue number must be positivezPlease enter a valid number)r_   r`   intr   r   
ValueError	TypeError)rU   r   r@   r@   rA   clean_issue_number  s   zIssueForm.clean_issue_numberc                 C   sd   | j d}|s
|S d}|j|krttdg d}tj|jd 	 }||vr0ttd|S )Nr   i  P zImage file too large (max 5MB))z.jpgz.jpegz.pngz.webpr   zBUnsupported file format. Please upload a JPEG, PNG, or WebP image.)
r_   r`   sizer   r   ospathsplitextr   lower)rU   r   max_sizevalid_extensions	extensionr@   r@   rA   clean_cover_image  s   
zIssueForm.clean_cover_image)	r;   r<   r=   rB   rL   rd   r   r   r   r@   r@   rZ   rA   r   g  s    1r   c                       s*   e Zd ZG dd dZ fddZ  ZS )IssueItemFormc                   @   ,   e Zd ZeZg dZdejddidiZdS )zIssueItemForm.Meta)blogorderfeaturednotesr  r(      r    N	r;   r<   r=   r   r>   r?   r   r   r   r@   r@   r@   rA   rB     
    rB   c                    sZ   | dd | _t j|i | | jr+| jj }tjj|j	dddd| j
d _d S d S )NissuerE   T)flat)id__inr   )popr  rK   rL   blogsrQ   r   rO   rP   values_listr?   r)   )rU   rV   rW   existing_blogsrZ   r@   rA   rL     s   zIssueItemForm.__init__)r;   r<   r=   rB   rL   r   r@   r@   rZ   rA   r     s    r   c                   @   s   e Zd ZG dd dZdS )IssueItemUpdateFormc                   @   r   )zIssueItemUpdateForm.Meta)r   r   r  r  r(   r  r    Nr  r@   r@   r@   rA   rB     r  rB   N)r;   r<   r=   rB   r@   r@   r@   rA   r    s    r  c                       s<   e Zd Zejejjejj	dej
ddZ fddZ  ZS )AddBlogsToIssueForm)r7   F)r)   r#   r$   c                    sD   | dd }t j|i | tjjdtjjdd| j	d _
d S )Nr  T)issues__isnullr7   z-created_atr	  )r  rK   rL   r   rO   rf   r   r   order_byr?   r)   )rU   rV   rW   r  rZ   r@   rA   rL     s   zAddBlogsToIssueForm.__init__)r;   r<   r=   r   r   r   rO   rf   r   r   CheckboxSelectMultipler	  rL   r   r@   r@   rZ   rA   r    s    r  c                   @   r   )IssueStatusUpdateFormc                   @   r   )zIssueStatusUpdateForm.Metar7   N)r;   r<   r=   r   r>   r?   r@   r@   r@   rA   rB     r   rB   c                 C   s\   | j d}| j}|tjjkr,|jsttd|j	
 s#ttd|js,ttd|S )Nr7   z.Cannot publish an issue without a cover image.z*Cannot publish an issue without any blogs.z3Cannot publish an issue without a publication date.)r_   r`   rM   r   r   r   r   r   r   r	  r   r   )rU   r7   rM   r@   r@   rA   clean_status  s   
z"IssueStatusUpdateForm.clean_statusN)r;   r<   r=   rB   r  r@   r@   r@   rA   r    r   r  )get_user_model)r   c                       s2   e Zd Z fddZG dd dZdd Z  ZS )TaskFormc                    s   t  j|i | tjtj dddtjddidd| j	d< | j	
 D ]\}}|dkr=d	|jjd< |jr=d
|jjd
< q&| j	d jjddd | j	d jjdddd | j	d jjddd | j	d jjddi | j	d jjddi d S )N
first_namezAssigned ToFr   zpblock w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm py-2 px-3r    )r)   r   r$   r#   assigned_tozfblock w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-smr$   r1   zEnter task title)r   r   r   re   zEnter task description...)r(   r   r   due_datezvblock w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm py-2 pl-3 pr-10zSelect a dater   priorityr7   )rK   rL   r   r{   UserrO   rQ   r  r|   r?   rR   r#   r!   r$   r   rT   rZ   r@   rA   rL   0  sD   

zTaskForm.__init__c                   @   s2   e Zd ZeZg dZejddide dZ	dS )zTaskForm.Meta)r1   r   r  r  r7   r  r,   r   r    )r  r   N)
r;   r<   r=   r   r>   r?   r   r   r   r   r@   r@   r@   rA   rB   ]  s    	
rB   c                 C   s$   |r|  p|j d|j dS dS )Nz () )get_full_nameusernamer   )rU   objr@   r@   rA   label_from_instancel  s   $zTaskForm.label_from_instance)r;   r<   r=   rL   rB   r  r   r@   r@   rZ   rA   r  /  s    -r  )<djangor   django.core.exceptionsr   django.formsr   r   r   django.utilsr   django.utils.translationr   r   ckeditor.widgetsr	   ior
   PILr   django.core.files.uploadedfiler   modelsr   r   r   django.db.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   OptionFormSetr   r   Formr   r   r   r   r   r  r  r  django.contrib.authr  r  r  r@   r@   r@   rA   <module>   sn    0 ?2P
$7' 