a
    xdXS                     @   s  d Z ddlmZ ddlZddlmZ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 ddlmZmZ ddlmZ ddlmZmZ ddlmZ dZ dZ!dZ"dZ#dZ$e edfe!edfe"edfe#edfe$edffZ%e edfe!edfe"edfe#edfe$edffZ&ded fd!ed"fd#ed$fd%ed&fd'ed(fd)ed*fd+ed,fd-ed.fd/ed0fg	Z'd1d2 Z(d3d4 Z)G d5d6 d6ej*Z+G d7d8 d8ej*Z,G d9d: d:ej*Z-G d;d< d<ej*Z.G d=d> d>ej*Z/G d?d@ d@ej*Z0ej1j2e/j3e0dA ej4j2e/j3e0dA ej1j2e/j5e,dA ej6j2e/j5e,dA ej7j2e/j5e.dA ej6j2e/j5e.dA ej7j2e/j5e+dA ej6j2e/j5e+dA ej7j2e/j5e-dA ej6j2e/j5e-dA dS )BzDatabase models.    )	timedeltaN)	schedulescurrent_app)settings)MultipleObjectsReturnedValidationError)MaxValueValidatorMinValueValidator)models)signals)gettext_lazy   )managers
validators)TzAwareCrontab
make_awarenow)clockeddayshoursminutessecondsmicrosecondsZDaysZHoursZMinutesZSecondsZMicrosecondsZDayZHourZMinuteZSecondZMicrosecondZdawn_astronomicalzAstronomical dawnZ
dawn_civilz
Civil dawnZdawn_nauticalzNautical dawnZdusk_astronomicalzAstronomical duskZ
dusk_civilz
Civil duskZdusk_nauticalzNautical duskZ
solar_noonz
Solar noonZsunriseZSunriseZsunsetZSunsetc                 C   s   | rt | ddpdS )z"Representation of cron expression.  *)strreplace)field r    Q/var/www/html/Ranjet/env/lib/python3.9/site-packages/django_celery_beat/models.pycronexp6   s    r"   c                  C   sH   zt tdtj } W n ty(   Y dS 0 | dd tjjD v rD| S dS )zReturn timezone string from Django settings `CELERY_TIMEZONE` variable.

    If is not defined or is not a valid timezone, return `"UTC"` instead.
    z%s_TIMEZONEUTCc                 S   s   g | ]}|d  j qS )r   )zone).0choicer    r    r!   
<listcomp>E   s   z4crontab_schedule_celery_timezone.<locals>.<listcomp>)getattrr   r   	namespaceAttributeErrortimezone_fieldTimeZoneFieldZdefault_choices)ZCELERY_TIMEZONEr    r    r!    crontab_schedule_celery_timezone;   s    
r-   c                   @   s   e Zd ZdZejdeededdZej	ddeded	e
d
edgdZej	ddedede
dedgdZG dd dZedd Zedd Zdd ZdS )SolarSchedulezSchedule following astronomical patterns.

    Example: to run every sunrise in New York City:
    event='sunrise', latitude=40.7128, longitude=74.0060
       zSolar Eventz/The type of solar event when the job should run
max_lengthchoicesverbose_name	help_text	      ZLatitudez4Run the task when the event happens at this latitudeiZ   )Z
max_digitsZdecimal_placesr3   r4   r   Z	Longitudez5Run the task when the event happens at this longitudeiL   c                   @   s(   e Zd ZdZedZedZdZdZdS )zSolarSchedule.MetaTable information.zsolar eventzsolar eventseventlatitude	longitudeN)	__name__
__module____qualname____doc___r3   verbose_name_pluralorderingZunique_togetherr    r    r    r!   Metad   s
   rE   c                 C   s   t j| j| j| jdd dS )Nc                   S   s
   t t S Nr   r    r    r    r!   <lambda>q       z(SolarSchedule.schedule.<locals>.<lambda>Znowfun)r   solarr;   r<   r=   selfr    r    r!   schedulel   s
    zSolarSchedule.schedulec                 C   sN   |j |j|jd}z| jjf i |W S  | jyH   | f i | Y S 0 d S )Nr:   )r;   ZlatZlonobjectsgetDoesNotExistclsrM   specr    r    r!   from_schedules   s    zSolarSchedule.from_schedulec                 C   s   d |  | j| jS )Nz{0} ({1}, {2}))formatZget_event_displayr<   r=   rK   r    r    r!   __str__   s
    zSolarSchedule.__str__N)r>   r?   r@   rA   r
   	CharFieldSOLAR_SCHEDULESrB   r;   ZDecimalFieldr	   r   r<   r=   rE   propertyrM   classmethodrT   rV   r    r    r    r!   r.   K   s0   

r.   c                   @   s   e Zd ZdZeZeZeZeZeZe	Z	e
jdedededgdZe
jde	eded	d
ZG dd dZedd ZeefddZdd Zedd ZdS )IntervalSchedulezjSchedule executing on a regular interval.

    Example: execute every 2 days
    every=2, period=DAYS
    FzNumber of Periodsz@Number of interval periods to wait before running the task againr   )nullr3   r4   r   r/   zInterval Periodz4The type of period between task runs (Example: days)r0   c                   @   s(   e Zd ZdZedZedZddgZdS )zIntervalSchedule.Metar9   intervalZ	intervalsperiodeveryNr>   r?   r@   rA   rB   r3   rC   rD   r    r    r    r!   rE      s   rE   c                 C   s$   t jtf i | j| jidd dS )Nc                   S   s
   t t S rF   r   r    r    r    r!   rG      rH   z+IntervalSchedule.schedule.<locals>.<lambda>rI   )r   rM   r   r^   r_   rK   r    r    r!   rM      s    zIntervalSchedule.schedulec                 C   sl   t |j d}z| jj||dW S  | jyB   | ||d Y S  tyf   | jj||d  Y S 0 d S )Nr   )r_   r^   )	maxZ	run_everytotal_secondsrN   rO   rP   r   filterfirst)rR   rM   r^   r_   r    r    r!   rT      s    zIntervalSchedule.from_schedulec                 C   sv   d }| j dkr@tD ]\}}|| jkr| } q2qtd|S tD ]\}}|| jkrD| } qdqDtd| j |S )Nr   zevery {}zevery {} {})r_   SINGULAR_PERIODSr^   lowerrB   rU   PERIOD_CHOICES)rL   Zreadable_periodr^   Z_readable_periodr    r    r!   rV      s    


zIntervalSchedule.__str__c                 C   s   | j d d S )N)r^   rK   r    r    r!   period_singular   s    z IntervalSchedule.period_singularN)r>   r?   r@   rA   DAYSHOURSMINUTESSECONDSMICROSECONDSrg   r
   ZIntegerFieldrB   r	   r_   rW   r^   rE   rY   rM   rZ   rT   rV   ri   r    r    r    r!   r[      s4   
	r[   c                   @   sT   e Zd ZdZejededdZG dd dZdd Z	e
d	d
 Zedd ZdS )ClockedSchedulezclocked schedule.z
Clock TimezRun the task at clocked time)r3   r4   c                   @   s&   e Zd ZdZedZedZdgZdS )zClockedSchedule.Metar9   r   clocked_timeNr`   r    r    r    r!   rE      s   rE   c                 C   s   d | jS )N{})rU   rp   rK   r    r    r!   rV      s    zClockedSchedule.__str__c                 C   s   t | jd}|S )N)rp   )r   rp   )rL   cr    r    r!   rM      s    zClockedSchedule.schedulec                 C   sl   d|j i}z| jjf i |W S  | jy@   | f i | Y S  tyf   | jjf i |  Y S 0 d S )Nrp   )rp   rN   rO   rP   r   rc   rd   rQ   r    r    r!   rT      s    
zClockedSchedule.from_scheduleN)r>   r?   r@   rA   r
   DateTimeFieldrB   rp   rE   rV   rY   rM   rZ   rT   r    r    r    r!   ro      s   
ro   c                   @   s   e Zd ZdZejddededejgdZ	ejddeded	ej
gdZejd
dededejgdZejddededejgdZejd
dededejgdZejeededdZG dd dZdd Zedd Zedd ZdS )CrontabSchedulezTimezone Aware Crontab-like schedule.

    Example:  Run every hour at 0 minutes for days of month 10-15
    minute="0", hour="*", day_of_week="*",
    day_of_month="10-15", month_of_year="*"
       r   z	Minute(s)z9Cron Minutes to Run. Use "*" for "all". (Example: "0,30"))r1   defaultr3   r4   r   `   zHour(s)z7Cron Hours to Run. Use "*" for "all". (Example: "8,20")@   zDay(s) Of The WeekzACron Days Of The Week to Run. Use "*" for "all". (Example: "0,5")|   zDay(s) Of The MonthzCCron Days Of The Month to Run. Use "*" for "all". (Example: "1,15")zMonth(s) Of The YearzCCron Months Of The Year to Run. Use "*" for "all". (Example: "0,6")zCron Timezonez5Timezone to Run the Cron Schedule on. Default is UTC.rv   r3   r4   c                   @   s(   e Zd ZdZedZedZg dZdS )zCrontabSchedule.Metar9   crontabZcrontabs)month_of_yearday_of_monthday_of_weekhourminutetimezoneNr`   r    r    r    r!   rE   .  s   rE   c              	   C   s8   d t| jt| jt| jt| jt| jt| jS )Nz%{0} {1} {2} {3} {4} (m/h/dM/MY/d) {5})	rU   r"   r   r   r}   r|   r~   r   r   rK   r    r    r!   rV   6  s
    zCrontabSchedule.__str__c                 C   sN   t j| j| j| j| j| jd}ttddrJt	| j| j| j| j| j| j
d}|S )N)r   r   r~   r}   r|   ZDJANGO_CELERY_BEAT_TZ_AWARET)r   r   r~   r}   r|   tz)r   r{   r   r   r~   r}   r|   r(   r   r   r   )rL   r{   r    r    r!   rM   =  s"    zCrontabSchedule.schedulec                 C   s   |j |j|j|j|j|jd}z| jjf i |W S  | jyT   | f i | Y S  t	yz   | jj
f i |  Y S 0 d S )N)r   r   r~   r}   r|   r   )Z_orig_minuteZ
_orig_hourZ_orig_day_of_weekZ_orig_day_of_monthZ_orig_month_of_yearr   rN   rO   rP   r   rc   rd   rQ   r    r    r!   rT   Q  s    zCrontabSchedule.from_scheduleN)r>   r?   r@   rA   r
   rW   rB   r   Zminute_validatorr   Zhour_validatorr   Zday_of_week_validatorr~   Zday_of_month_validatorr}   Zmonth_of_year_validatorr|   r+   r,   r-   r   rE   rV   rY   rM   rZ   rT   r    r    r    r!   rt      sl   	
rt   c                   @   sX   e Zd ZdZejddddZejddZe	
 Zedd Zed	d
 Zedd ZdS )PeriodicTasksaI  Helper table for tracking updates to periodic tasks.

    This stores a single row with ident=1.  last_update is updated
    via django signals whenever anything is changed in the PeriodicTask model.
    Basically this acts like a DB data audit trigger.
    Doing this so we also track deletions, and not just insert/update.
    r   T)rv   Zprimary_keyuniqueF)r\   c                 K   s   |j s|   d S rF   )
no_changesupdate_changed)rR   instancekwargsr    r    r!   changedp  s    zPeriodicTasks.changedc                 K   s   | j jddt id d S )Nr   last_update)identdefaults)rN   Zupdate_or_creater   )rR   r   r    r    r!   r   u  s    zPeriodicTasks.update_changedc                 C   s,   z| j jddjW S  | jy&   Y n0 d S )Nr   )r   )rN   rO   r   rP   )rR   r    r    r!   last_changey  s    zPeriodicTasks.last_changeN)r>   r?   r@   rA   r
   ZSmallIntegerFieldr   rs   r   r   ZExtendedManagerrN   rZ   r   r   r   r    r    r    r!   r   b  s   

r   c                	       s  e Zd ZdZejddededdZejddedd	Zej	e
ejdded
eddZej	eejddededdZej	eejddededdZej	eejddededdZejddededdZejddededdZejddddededdZejddddededdZejdddded ed!dZejdded"ed#dZejded$gdded%ed&d'Zejdded(ed)d*Zejdded+ed,d*Zej d-ed.ed/d0Z!ejdded1ed2d*Z"ej ded3ed4d0Z#ejd-d-d-dded5ed6d7Z$ejd8d-ed9ed:d;Z%ejded<ed=d>Z&ejded?ed@dAZ'e() Z*d-Z+G dBdC dCZ, fdDdEZ- fdFdGZ.dHdI Z/e0dJdK Z1dLdM Z2e0dNdO Z3  Z4S )PPeriodicTaskz#Model representing a periodic task.   TNamezShort Description For This Task)r1   r   r3   r4   z	Task NamezXThe Name of the Celery Task that Should be Run.  (Example: "proj.tasks.import_contacts"))r1   r3   r4   zInterval SchedulezYInterval Schedule to run the task on.  Set only one schedule type, leave the others null.)Z	on_deleter\   blankr3   r4   zCrontab SchedulezXCrontab Schedule to run the task on.  Set only one schedule type, leave the others null.zSolar SchedulezVSolar Schedule to run the task on.  Set only one schedule type, leave the others null.zClocked SchedulezXClocked Schedule to run the task on.  Set only one schedule type, leave the others null.z[]zPositional Argumentsz=JSON encoded positional arguments (Example: ["arg1", "arg2"]))r   rv   r3   r4   rq   zKeyword Argumentsz?JSON encoded keyword arguments (Example: {"argument": "value"})NzQueue OverridezDQueue defined in CELERY_TASK_QUEUES. Leave None for default queuing.)r1   r   r\   rv   r3   r4   ZExchangez,Override Exchange for low-level AMQP routingzRouting Keyz/Override Routing Key for low-level AMQP routingzAMQP Message Headersz2JSON encoded message headers for the AMQP message.   ZPriorityzcPriority Number between 0 and 255. Supported by: RabbitMQ, Redis (priority reversed, 0 is highest).)rv   r   r   r\   r3   r4   zExpires DatetimezHDatetime after which the schedule will no longer trigger the task to run)r   r\   r3   r4   zExpires timedelta with secondszPTimedelta with seconds which the schedule will no longer trigger the task to runFzOne-off Taskz:If True, the schedule will only run the task a single timerz   zStart DatetimezBDatetime when the schedule should begin triggering the task to runZEnabledz$Set to False to disable the schedulezLast Run DatetimezdDatetime that the schedule last triggered the task to run. Reset to None if enabled is set to False.)auto_nowZauto_now_addeditabler   r\   r3   r4   r   zTotal Run CountzCRunning count of how many times the schedule has triggered the task)rv   r   r3   r4   zLast Modifiedz1Datetime that this PeriodicTask was last modified)r   r3   r4   Descriptionz<Detailed description about the details of this Periodic Task)r   r3   r4   c                   @   s    e Zd ZdZedZedZdS )zPeriodicTask.Metar9   zperiodic taskzperiodic tasksN)r>   r?   r@   rA   rB   r3   rC   r    r    r    r!   rE     s   rE   c                    s   t  j|i | g d} fdd|D }t|dkr@tdd}t|dkrpi }|D ]}|g||< qXt| jr jsd}t|d S )	N)r]   r{   rJ   r   c                    s   g | ]}t  |r|qS r    )r(   )r%   srK   r    r!   r'   &  s   
z0PeriodicTask.validate_unique.<locals>.<listcomp>r   z8One of clocked, interval, crontab, or solar must be set.z<Only one of clocked, interval, crontab, or solar must be setr   z.clocked must be one off, one_off must set True)supervalidate_uniquelenr   r   one_off)rL   argsr   Zschedule_typesZselected_schedule_typeserr_msg
error_infoZselected_schedule_type	__class__rK   r!   r   "  s     zPeriodicTask.validate_uniquec                    sb   | j pd | _ | jpd | _| jp d | _| jp,d | _| js<d | _|   |   t j	|i | d S rF   )
exchangerouting_keyqueueheadersenabledlast_run_at_clean_expiresr   r   save)rL   r   r   r   r    r!   r   <  s    zPeriodicTask.savec                 C   s    | j d ur| jrttdd S )Nz2Only one can be set, in expires and expire_seconds)expire_secondsexpiresr   rB   rK   r    r    r!   r   G  s    zPeriodicTask._clean_expiresc                 C   s   | j p
| jS rF   )r   r   rK   r    r    r!   expires_M  s    zPeriodicTask.expires_c                 C   s6   d}| j rd}| jrd}| jr"d}| jr,d}|| S )Nz{0.name}: {{no schedule}}z{0.name}: {0.interval}z{0.name}: {0.crontab}z{0.name}: {0.solar}z{0.name}: {0.clocked})r]   r{   rJ   r   rU   )rL   fmtr    r    r!   rV   Q  s    zPeriodicTask.__str__c                 C   s<   | j r| j jS | jr| jjS | jr*| jjS | jr8| jjS d S rF   )r]   rM   r{   rJ   r   rK   r    r    r!   rM   ]  s    zPeriodicTask.schedule)5r>   r?   r@   rA   r
   rW   rB   nameZtaskZ
ForeignKeyr[   ZCASCADEr]   rt   r{   r.   rJ   ro   r   Z	TextFieldr   r   r   r   r   r   ZPositiveIntegerFieldr   priorityrs   r   r   ZBooleanFieldr   
start_timer   r   Ztotal_run_countZdate_changeddescriptionr   ZPeriodicTaskManagerrN   r   rE   r   r   r   rY   r   rV   rM   __classcell__r    r    r   r!   r     s$  	





r   )Zsender)8rA   datetimer   r+   Zceleryr   r   Zdjango.confr   Zdjango.core.exceptionsr   r   Zdjango.core.validatorsr   r	   Z	django.dbr
   Zdjango.db.modelsr   Zdjango.utils.translationr   rB   r   r   r   Z	tzcrontabr   utilsr   r   Zclockedscheduler   rj   rk   rl   rm   rn   rg   re   rX   r"   r-   ZModelr.   r[   ro   rt   r   r   Z
pre_deleteconnectr   Zpre_saver   Z	post_saveZpost_deleter    r    r    r!   <module>   s   




	




	








=G"q i