o
    ^h3                     @   s@  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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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% G dd deZ&G dd dej'Z(G dd de
Z)G dd de
Z*G dd deZ+G dd dej'Z,dS )    N)models)slugify)timezone)forms)Page	Orderable)StreamFieldRichTextField)Image)ImageChooserBlock)
FieldPanelMultiFieldPanelInlinePanel)blocks)RichTextBlock	TextBlockStructBlock	CharBlock)TaggedItemBase)ParentalKey)ClusterTaggableManager)ClusterableModelc                   @   s4   e Zd ZeddddZedddZG dd dZd	S )
	CodeBlockTzProgramming languagepython)required	help_textdefaultzCode snippet)r   r   c                   @      e Zd ZdZdZdZdS )zCodeBlock.Metazblocks/code_block.htmlcodeCodeN)__name__
__module____qualname__templateiconlabel r&   r&   */var/www/html/ndineBlogger/blogs/models.pyMeta       r(   N)r    r!   r"   r   languager   r   r(   r&   r&   r&   r'   r      s    r   c                       sr   e Zd ZejddZejddddZejdddZ	e
de
d	e
d
gZ fddZdd ZG dd dZ  ZS )BlogCategoryd   
max_lengthTz>URL-friendly name, auto-generated from the title if left blank)uniquer.   r   z%Optional description of this categoryblankr   nameslugdescriptionc                    s(   | j s	t| j| _ t j|i | d S N)r3   r   r2   supersaveselfargskwargs	__class__r&   r'   r7   (   s   zBlogCategory.savec                 C   s   | j S r5   )r2   r9   r&   r&   r'   __str__-   s   zBlogCategory.__str__c                   @   s   e Zd ZdZdZdgZdS )zBlogCategory.MetaBlog CategoryBlog Categoriesr2   N)r    r!   r"   verbose_nameverbose_name_pluralorderingr&   r&   r&   r'   r(   0   s    
r(   )r    r!   r"   r   	CharFieldr2   	SlugFieldr3   	TextFieldr4   r   panelsr7   r?   r(   __classcell__r&   r&   r<   r'   r+      s    r+   c                       sL   e Zd ZejddZejdddZej	e
de
dg Z	 fddZ  ZS )	BlogIndexPageT)r1      )r.   r1   introsubtitlec                    s   t  j|g|R i |}tj d}|jd}|r#|j|d}ddl	m
}m}m}	 ||d}
|jd}z|
|}W n |	yM   |
d}Y n |y[   |
|
j}Y nw ||d	< tj |d
< |S )N-published_datecategory)categories__category__slugr   )	Paginator	EmptyPagePageNotAnInteger   page   
blog_posts
categories)r6   get_contextBlogPostPageobjectsliveorder_byGETgetfilterdjango.core.paginatorrQ   rR   rS   rU   	num_pagesr+   all)r9   requestr:   r;   contextrW   rO   rQ   rR   rS   	paginatorrU   r<   r&   r'   rY   >   s$   
zBlogIndexPage.get_context)r    r!   r"   r   rG   rL   rE   rM   r   content_panelsr   rY   rI   r&   r&   r<   r'   rJ   5   s    rJ   c                       s\  e Zd ZejddZejdddejddZejddZ	ejdddejdd	d
Z
edZedejddfde fde fde fgddZedddZejddZejddZejdddZejdddZg dZejdedddd Zej e!d!e!d"e!d#e!d$e!d%e"d&d'd(e!d)e!d*e!d+e!d,e#e!d-e!d.gd/d0g Z  fd1d2Z$  Z%S )3rZ   rK   r-   zwagtailimages.ImageTblog_thumbnails)nullr1   	on_deleterelated_namer,   blog_author_avatarszVAuthor profile picture. If not set, the profile image from the home page will be used.)ri   r1   rj   rk   r   z	Post dateheadingz
full title)	classname	paragraphimager   )use_json_fieldzblogs.BlogPageTag)throughr1   rV   )r   r   z"Show table of contents on the side)r   r   zDURL to a social media post where readers can comment on this articler0   ))twitterz	Twitter/X)linkedinLinkedIn)facebookFacebook)githubGitHub)redditReddit)otherzOther Platform   rs   z1Select the social media platform for the post URL)r.   choicesr   r1   r   rL   	thumbnailauthorauthor_avatarpublished_daterX   
Categories)r%   bodytagsestimated_reading_timeshow_table_of_contentssocial_post_urlsocial_platformzSocial Media Comments)rm   c              
      s  t  j|g|R i |}z%|  jd7  _|   | js1ddlm} |j }|r1|j	r1|j	|d< W n% t
yW } zdd l}|t}	|	dt|  W Y d }~nd }~ww | jrg }
d}tdtj}tdtj}td	tj}td
tj}tdtj}| jD ]}|jdkrd}t|j}t|dd}t|tr|drz
t|dd  }W n ttfy   d}Y nw |
|j||d q|jdkrt|j}||D ]}d}t dd|!d" }t|}|
||dd q||D ]}d}t dd|!d" }t|}|
||dd q||D ]}d}t dd|!d" }t|}|
||dd q||D ]}d}t dd|!d" }t|}|
||dd qA||D ]}d}t dd|!d" }t|}|
||dd qeq|
|d< d|d< ||d< |sddddddddd d!ddg|d"< |
s|d" |d< t#j$ j%| j&d#}| j'( r|j)| j'( d$* d d }n	|+d%d d }||d&< |S )'NrV   r   )HomePagedefault_author_avatarz#Error in BlogPostPage.get_context: Fz<h2[^>]*>(.*?)</h2>z<h3[^>]*>(.*?)</h3>z<h4[^>]*>(.*?)</h4>z<h5[^>]*>(.*?)</h5>z<h6[^>]*>(.*?)</h6>rm   Theading_level   h)titler3   levelro   z<.*?>          rT   table_of_contentsshow_tochas_headingsIntroductionintroductionzMain Contentzmain-content
Conclusion
conclusiondefault_toc)id)tags__inrN   related_posts),r6   rY   views_countr7   r   home.modelsr   r[   firstprofile_image	Exceptionlogging	getLoggerr    errorstrr   recompileDOTALLr   
block_typer   valuegetattr
isinstance
startswithint
ValueError
IndexErrorappendfinditersubgroupstriprZ   r\   excluder   r   rc   r`   distinctr]   )r9   rd   r:   r;   re   r   	home_pageer   loggertocr   
h2_pattern
h3_pattern
h4_pattern
h5_pattern
h6_patternblockr3   r   paragraph_htmlmatchheading_textr   r<   r&   r'   rY      s   



 









 zBlogPostPage.get_context)&r    r!   r"   r   rE   rL   
ForeignKeySET_NULLr   r   r   	DateFieldr   r   r   r   r   r   r   r   r   r   PositiveIntegerFieldr   r   BooleanFieldr   URLFieldr   SOCIAL_PLATFORM_CHOICESr   r   rg   r   r   r   rY   rI   r&   r&   r<   r'   rZ   ^   sv    


rZ   c                   @   s   e Zd ZeddejdZdS )BlogPageTagrZ   tagged_items)rk   rj   N)r    r!   r"   r   r   CASCADEcontent_objectr&   r&   r&   r'   r   *  s    
r   c                       s^   e Zd ZedejddZejdejddZe	dgZ
G dd dZ fd	d
Zdd Z  ZS )BlogPageCategoryrZ   rX   )rj   rk   r+   
blog_pagesrO   c                   @   r   )zBlogPageCategory.MetarU   rO   r@   rA   N)r    r!   r"   unique_togetherrB   rC   r&   r&   r&   r'   r(   ;  r)   r(   c                    s8   | j stjj| j| jd rd S t j|i | d S )Nr   )	pkr   r[   r`   rU   rO   existsr6   r7   r8   r<   r&   r'   r7   @  s   zBlogPageCategory.savec                 C   s   | j j d| jj S )Nz on )rO   r2   rU   r   r>   r&   r&   r'   r?   G  s   zBlogPageCategory.__str__)r    r!   r"   r   r   r   rU   r   rO   r   rH   r(   r7   r?   rI   r&   r&   r<   r'   r   /  s    r   )-r   	django.dbr   django.utils.textr   django.utilsr   djangor   wagtail.modelsr   r   wagtail.fieldsr   r	   wagtail.images.modelsr
   wagtail.images.blocksr   wagtail.admin.panelsr   r   r   wagtailr   wagtail.blocksr   r   r   r   taggit.modelsr   modelcluster.fieldsr   modelcluster.tagsr   modelcluster.modelsr   r   Modelr+   rJ   rZ   r   r   r&   r&   r&   r'   <module>   s.    	) M