o
    ѷ6i9                     @   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
 d dl	mZ d dlmZ d d	lmZ d d
lmZ i add ZdedefddZG dd dejZeee
g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ZdS )    N)ContentType)ValidationError)models)Q)post_delete)	post_save)receiver)gettext_lazy)app_settingsc                 C   s   t tt| |S )a  
    Matches a glob pattern with a string. This is apparently not something that's available in Python's stdlib.

    Examples::

        _glob_matches_path("admin/*", "admin/user/new") == False
        _glob_matches_path("admin/**", "admin/user/new") == True
    )boolrecompile_glob_to_rematch)glob_patternpath r   V/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_nyt/models.py_glob_matches_path   s   	r   patreturnc           	      C   s  dt | }}d}||k r	| | }|d }|dkr4|}||k r/| | dkr/|d }|d }n|d }n|dkr=|d }n|d	kr|}||k rQ| | d
krQ|d }||k r_| | dkr_|d }||k rw| | dkrw|d }||k rw| | dksi||kr|d }n| || }d|vr|dd}nBg }| | d
kr|d n|d }	 | d||}|dk rn|| ||  |d }|d }q|| ||  ddd |D }tdd|}|d }|d d
krd|dd  }n
|d dv rd| }d||f }n|t| }||k sd| S )zuTranslate a shell PATTERN to a regular expression.

    Copied from: https://stackoverflow.com/a/72400344/405682
    r       *z.*z[^/]*?z[^/][!]z\[z--\\\   T-   c                 s   s$    | ]}| d d ddV  qdS )r   r   r!   z\-N)replace).0sr   r   r   	<genexpr>R   s    
z_glob_to_re.<locals>.<genexpr>z([&~|])z\\\1z^/N)^r   z%s[%s]z	(?s:%s)\Z)lenr#   findappendjoinr   subescape)	r   inrescjstuffchunkskr   r   r   r      sf   





=r   c                   @   s   e Zd ZdZejddedddZejdeddddZej	e
ddejdZd	d
 ZG dd dZedddZdd Zdd ZdS )NotificationTypezb
    Notification types are added on-the-fly by the
    applications adding new notifications
       Tz
unique key)
max_lengthprimary_keyverbose_nameuniquezoptional label)r8   r:   blanknull)r<   r=   	on_deletec                 C   s   | j S Nkeyselfr   r   r   __str__x   s   zNotificationType.__str__c                   @   &   e Zd Zejd ZedZedZdS )zNotificationType.Meta_notificationtypetypetypesN	__name__
__module____qualname__r
   NYT_DB_TABLE_PREFIXdb_table_r:   verbose_name_pluralr   r   r   r   Meta{       
rQ   Nc                 C   sT   |t v rt | S z	| jj|d}W n | jy#   | jj||d}Y nw |t |< |S )Nr@   )rA   content_type)_notification_type_cacheobjectsgetDoesNotExistcreate)clsrA   rS   ntr   r   r   
get_by_key   s   zNotificationType.get_by_keyc                 C   .   t j D ]\}}t|| jr|  S qt jS r?   )r
   NYT_EMAIL_TEMPLATE_NAMESitemsr   rA   NYT_EMAIL_TEMPLATE_DEFAULTrC   key_globtemplate_namer   r   r   get_email_template_name   s
   z(NotificationType.get_email_template_namec                 C   r\   r?   )r
    NYT_EMAIL_SUBJECT_TEMPLATE_NAMESr^   r   rA   "NYT_EMAIL_SUBJECT_TEMPLATE_DEFAULTr`   r   r   r   get_email_subject_template_name   s   z0NotificationType.get_email_subject_template_namer?   )rJ   rK   rL   __doc__r   	CharFieldrO   rA   label
ForeignKeyr   SET_NULLrS   rD   rQ   classmethodr[   rc   rf   r   r   r   r   r6   e   s"    
r6   )senderc                  O   s   i a d S r?   )rT   )argskwargsr   r   r   clear_notification_type_cache   s   rp   c                       s   e Zd ZdZejejeje	dddZ
ejeje	de	dejdZejde	d	d
Zejde	ddZejde	ddZdd ZG dd dZdd Z fddZedd ZeZ  ZS )Settingsz5
    Reusable settings object for a subscription
    usernyt_settings)r>   r:   related_nameintervalz8interval in minutes (0=instant, 60=notify once per hour))choicesr:   	help_textdefaultFzDefault for new subscriptionsrx   r:   Tcreatedauto_now_addr:   modifiedauto_nowr:   c                 C   s   t dt| j| jj }|S )NzSettings for %s)rO   getattrrr   USERNAME_FIELDrC   obj_namer   r   r   rD      s   zSettings.__str__c                   @   s&   e Zd Zejd ZedZedZdS )zSettings.Meta	_settingssettingsNrI   r   r   r   r   rQ      rR   rQ   c                 C   sR   | j s!| jr#| jr%tjj| jddj| jd}| s'tt	dd S d S d S d S )NTrr   
is_defaultpkz6At minimum one default setting must exist for the user)
r   r   rr   rq   rU   filterexcludeexistsr   rO   )rC   default_settingsr   r   r   clean   s   zSettings.cleanc                    s   t jj| jddj| jd}| jr|jdd n&| s>t jj| jddj| jd}| r:d|d _|d 	  nt
dtt | j	|i | d S )NTr   r   F)r   r   z*A user must have a default settings object)rq   rU   r   rr   r   r   r   updater   save
ValueErrorsuper)rC   rn   ro   r   non_default_settings	__class__r   r   r      s(   
zSettings.savec                 C   s   | j j|ddd S )NTr   r   )rU   get_or_create)rY   rr   r   r   r   get_default_settings   s   zSettings.get_default_settings)rJ   rK   rL   rg   r   rj   r
   NYT_USER_MODELCASCADErO   rr   SmallIntegerFieldNYT_INTERVALSNYT_INTERVALS_DEFAULTru   BooleanFieldr   DateTimeFieldrz   r}   rD   rQ   r   r   rl   r   get_default_setting__classcell__r   r   r   r   rq      sB    
rq   c                   @   s   e Zd ZejeedejdZeje	edejdZ
ejdddededdZejded	d
ZejddddedejdZejdeddZejdeddZejddeddZdd ZG dd dZdS )Subscriptionr   )r:   r>   znotification type@   Tz3Leave this blank to subscribe to any kind of objectz	object ID)r8   r=   r<   rw   r:   zsend emailsry   Notification
latest_forzlatest notification)r=   r<   rt   r:   r>   rz   r{   r}   r~   z	last sent)r=   r<   r:   c                 C   s    t dt| jj| jjj }|S )NzSubscription for: %s)rO   r   r   rr   r   r   r   r   r   rD   +  s   zSubscription.__str__c                   @   rE   )zSubscription.Meta_subscriptionsubscriptionsubscriptionsNrI   r   r   r   r   rQ   1  rR   rQ   N)rJ   rK   rL   r   rj   rq   rO   r   r   r6   notification_typerh   	object_idr   send_emailslatestr   rz   r}   	last_sentrD   rQ   r   r   r   r   r      sV    	r   c                       s   e Zd ZejeddejeddZeje	j
ddejedddZe Zejeddddd	Zejd
eddZejd
eddZejdeddZejdeddZejdededdZ fddZe				dddZdd ZG dd dZ  ZS ) r   Tr   )r=   r<   r>   r:   rr   nyt_notifications)r=   r<   r>   r:   rt   zlink for notificationi  )r:   r<   r=   r8   Fznotification viewedry   z	mail sentrz   r{   r}   r~   r   occurrenceszTIf the same notification was fired multiple times with no intermediate notifications)rx   r:   rw   c                    s<   | j s| jsJ | j s| jjj | _ tt| j|i | d S r?   )rr   r   r   r   r   r   )rC   rn   ro   r   r   r   r   t  s   zNotification.saveNc                 K   sL  |rt |tstd|du ri }g }tjj|djdi |}|r/|t|dtddB }|r7|j|d}|dd}|	d}i }	|D ]]}
|	
|
jjg  ||	|
jj v rYqF|	|
jj | |
j}|r|j|d	dkr|j|d
dkr|jdu r|jd |_d|_|  qF| jjdd|
i|}|| ||
_|
  qF|S )z
        Creates notifications directly in database -- do not call directly,
        use django_nyt.notify(...)

        This is now an internal interface.
        z'No notification key (string) specified.N)notification_type__key)r   )settings__user__inr   r   settings__usermessageurlFr   r   r   )
isinstancestrKeyErrorr   rU   r   r   r   prefetch_relatedorder_by
setdefaultr   idr*   r   r   rV   r   	is_viewedr   
is_emailedr   rX   )rY   rA   r   rS   filter_excluderecipient_usersro   objects_createdr   seen_key_for_settingsr   r   new_objr   r   r   create_notificationsz  sJ   





z!Notification.create_notificationsc                 C   s   d| j | jf S )Nz%s: %s)rr   r   rB   r   r   r   rD     s   zNotification.__str__c                   @   s*   e Zd Zejd ZedZedZdZ	dS )zNotification.Meta_notificationnotificationnotifications)z-idN)
rJ   rK   rL   r
   rM   rN   rO   r:   rP   orderingr   r   r   r   rQ     s
    
rQ   )NNNN)rJ   rK   rL   r   rj   r   rk   rO   r   r
   r   r   rr   	TextFieldr   rh   r   r   r   r   r   rz   r}   PositiveIntegerFieldr   r   rl   r   rD   rQ   r   r   r   r   r   r   7  sn    
		Or   )r   "django.contrib.contenttypes.modelsr   django.core.exceptionsr   	django.dbr   django.db.modelsr   django.db.models.signalsr   r   django.dispatchr   django.utils.translationr	   rO   django_nyt.confr
   rT   r   r   r   Modelr6   rp   rq   r   r   r   r   r   r   <module>   s&    H8
U?