o
    ɻf'A                     @   sR  d dl Z d dlZd dlmZ d dlZd dl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 d d
lmZ d dlmZ ejg ddZdd Zeejej dZ!dZ"dZ#de$f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d Z*G dd dej&Z+G d d! d!e+Z,d"d# Z-dS )$    N)ZoneInfo)models)get_template)MarkdownxField)	mark_safe)FileSystemStoragesettings)CourseFileKind
CourseFile)	get_epoch)CourseRecord)zcode-friendlyzfenced-code-blocks	numberingtables)extrasc                 C   s,   t | }tjdd|tjtjB d}t|S )Nz<pre>(.*?)</pre>z<pre class="latex">\1</pre>flags)
markdownerconvertresubMDOTALLr   )st r   !/var/www/djphys/courses/models.pymd   s   

r   )locationbase_url))lLecture)r
Recitation)bLab)eExam)hHoliday))CzClaremont only)FzPhysics faculty only)1Anyone)LzOnly registered userstxtc                 C   sh   dd }| d }d}|t | k r2|| | r"|| |d  s"|d7 }|| | 7 }|d7 }|t | k s|S )z$Split camel case into separate wordsc                 S   s$   t dt |   kot dkS   S )NAZ)ord)xr   r   r   capC   s   $zdecamel.<locals>.capr       )len)r0   r5   r   nr   r   r   decamel@   s   r:   c                   @   sl   e Zd ZejedejdZejeddejdZ	ej
ddddZdd Zdd	 Zd
d Zdd ZdddZdS )
CourseSiteT)null	on_delete)blankr<   r=   z4Define any CSS styles here you wish used on the site)r<   r>   	help_textc                 C   s   d | jjS )NzCourseSite for {0})formatcoursenumberselfr   r   r   __str__W   s   zCourseSite.__str__c                 C   s   t jj| jdd}| dkrd S | dkr|d S d}g }t| D ]'\}}||j	|j	  t
jj|d dkr@q't|d t|| krN|}q'|| S )NrA   z-yearr   r6   course_record)r   objectsfilterrA   order_bycount	enumerateallappendyearMeetingabs)rD   epochcrsbestdyearr9   cr   r   r   rH   Z   s&   zCourseSite.course_recordc              	   C   sV  t dt j}||}t }|D ]$}t d|}t|d}|d7 }||vr.|g||< q|| | q|	 D ]*\}}	dt
|	 d| d}
|	d d	}|	d d
| |
 |	d |d
  |	d< q:d}||}|d}|d
| |dd||d|d dg}|	 D ]\}}	|	D ]}|| qq|||dd
  d|S )a  Add a column for the week of the semester.
        The source text has a number of <tr> lines that include a field
        week="n". Each time that number changes, we need to include a
        narrow column that spans the appropriate number of rows to show the
        full week on the left. We need to extract what's inside the
        <tr> </tr>, so we can add a multicolumn td on the first row of a
        week.
        z(<tr class=.*?</tr>)zweek="(\d*)"r6   
z<td rowspan="zX" style="width: 16px; padding: 0px; vertical-align: middle;"><div class="rot">Week&nbsp;z</div></td>
r   z<tdNz<table class="calendar table">z</table>z
<tr>
z<td class="week">&nbsp;</td>
z<th>z</tr>z</tr>
 )r   compiler   findalldictsearchintgrouprO   itemsr8   indexjoin)rD   srcpatrowsweeksr#   mweekkv	to_insertwheretable_startn_table_startn_table_endchunksdayr   r   r   	add_weeksk   s<   	
*


	
zCourseSite.add_weeksc              
   C   s   ddl m} ddlm} ddlm} | t|}|sd S tj	j
|d}td}g }t }	||j}
|D ]$}|j}||	vrAd|	|< |	|  d7  < ||||	| ||
d q4td	}||d
}|
ri| |d< ||}| |}t|S )Nr   )
is_faculty)LoadScheduleForm)RequestContextrG   zcourses/meeting.htmlr6   )meetingrB   requesteditablezcourses/calendar.html)meetingsrH   loadform)people.funcsrs   courses.formsrt   django.templateru   rH   r   rQ   rI   rJ   r   r\   usersession_typerO   renderrr   r   )rD   rw   rs   rt   ru   
course_recry   tempmeetscountersrx   rg   stdicrc   
with_weeksr   r   r   calendar   s8   





zCourseSite.calendarrY   c                 C   s   |  \}}dddddd}|| | }tddD ][}	||	 }
|
|v rt|	|  }|dk r1|d	7 }|tj|d
 }||krtg }|
|v rH|d |
|v rQ|d |
|v rZ|d |D ]}tjj|||d q\|tjd	d
7 }||ks=qd S )Nr   TWRr,   )r   r6            r         )daysr!   r#   r%   )rH   r   date)	spanrangeweekdaydatetime	timedeltarO   rQ   rI   create)rD   rH   lecturesrecitationslabsstartfinishdaymap
everythingrq   	dayletterdtdstypesr   r   r   r   make_calendar   s4   


zCourseSite.make_calendarN)rY   rY   rY   )__name__
__module____qualname__r   
ForeignKeyr
   CASCADErA   r   logo	TextFieldstylerE   rH   rr   r   r   r   r   r   r   r;   P   s    .!r;   c                   @   s\   e Zd Ze ZejddZejddZ	ejdddZ
ejdddZdd Zedd	 Zd
S )URLTauto_now_add   )
max_lengthr>   r<   c                 C   s   | j S N)urlrC   r   r   r   rE      s   zURL.__str__c                 C   s:   ddl m} d|j d}td| j d| d| j dS )	Nr   r   z
<img src="zico/link.png" class="icon">	<a href="z" target="_new">z&nbsp;z
</a>&nbsp;)django.confr	   
STATIC_URLr   r   description)rD   r	   icon_urlr   r   r   link   s
   zURL.linkN)r   r   r   r   URLFieldr   DateTimeFielddate_posted	CharFieldr   release_timerelease_untilrE   propertyr   r   r   r   r   r      s    r   c                   @   s*  e Zd ZejeejdZejde	dZ
e ZejddddZejddddZejddddZejddddZedddZejdd	Zejedd
Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zedd Z dd Z!dd Z"edd  Z#ed!d" Z$ed#d$ Z%d%d& Z&G d'd( d(Z'd)S )*rQ   r=   r6   )r   choicesd   Tr   r>   r<   r   F)default)r>   c                 C      | j jS r   )rH   rA   rC   r   r   r   rA         zMeeting.coursec                 C   s^   d | jj| j|  }| jr|d | j7 }| jr"|d | j7 }| jr-|d | j7 }|S )Nz{0} {1} {2}z: {0}z, Reading: {0}z, Homework due: {0})r@   rA   order_fieldr   get_session_type_displaytopicreadinghomework)rD   r   r   r   r   rE      s   

zMeeting.__str__c                 C   s   | j |S r   )r   strftime)rD   fr   r   r   r@        zMeeting.formatc                 C   
   |  dS )Nz%Ar@   rC   r   r   r   DayName     
zMeeting.DayNamec                 C   r   )Nz%ar   rC   r   r   r   Day  r   zMeeting.Dayc                 C   r   )Nz%Br   rC   r   r   r   Month  r   zMeeting.Monthc                 C   r   )Nz%br   rC   r   r   r   month  r   zMeeting.monthc                 C   r   )Nz%Y-%m-%dr   rC   r   r   r   iso     
zMeeting.isoc                 C   s   d | jj| jjS )Nz{0}/{1})r@   r   r   rq   rC   r   r   r   
short_form  s   zMeeting.short_formc                 C   s0   i }dD ]}t | |r| t | |||< q|S )N)r   r   exam)getattr
make_links)rD   r   ri   r   r   r   fields  s   
zMeeting.fieldsc                 C   s
   t | jS r   )r   notesrC   r   r   r   notes_md  r   zMeeting.notes_mdc                 C   r   r   )r   rP   rC   r   r   r   rP   #  r   zMeeting.yearc                 C   s&   | j jj}| j| }d|jd  }|S )zy
        Attempt to determine the number of the week in the semester
        that this meeting's date occurs in.
        r6   r   )rH   rS   start_r   r   )rD   r   rq   rh   r   r   r   rh   '  s   

zMeeting.weekc           	      C   sp  g }d}t d|t jt jB D ]C}||||   |dd}|d dd }d|v r<||dd d  }|d	|d d
 t	| d  |
 }q|||d   d|}g d}}t jd|t jdD ]8}||||   |ddd }d| d}|d	| d
t	|d|d d   d |
 }qo|||d   td|S )Nr   z(https?://)([^ "]*)r   /.-r6   r   z"></a>rY   z\{([A-Z]{2}-[^ }]*)\}r   z#https://saeta.physics.hmc.edu/p064/z.html)r   finditerr   IrO   r   r_   splitra   r:   endrb   r   )	rD   r   r0   ptrg   fldslinktextr   r   r   r   r   r   2  s:   


&
zMeeting.make_linksc                   @   s   e Zd ZdgZdS )zMeeting.Metar   N)r   r   r   orderingr   r   r   r   MetaM  s    
r   N)(r   r   r   r   r   r   r   rH   r   SESSION_TYPEr   	DateFieldr   r   r   r   r   r   r   BooleanFieldhideManyToManyFieldr   urlsr   rA   rE   r@   r   r   r   r   r   r   r   r   rP   rh   r   r   r   r   r   r   rQ      s>    





rQ   c           
      C   sn   t | tr,| jj}|jj}|j}|j}|j}|dkrd}d	|||}t
jd||}nd}t
j||}	|	S )NarY   z	{0}{1}{2}coursesunknown)
isinstanceMeetingFilerv   rH   rA   r   rP   semesterpartr@   ospathrb   )
objfilenamecreccnamerP   r   portionysemfolder	full_pathr   r   r   FileLocationQ  s   
r  c                   @   s   e Zd ZejdddejdZejddZeje	ejdZ
ejeedZejddddZejd	ed
dZejdddZejdddZdd Zdd Zdd Zdd Zedd Zedd Zedd Zdd ZdS )SecureCourseFilez	auth.UserT)r<   r>   r=   r   r   )	upload_tostorage   r   r6   r-   )r   r   r   )r<   r>   c                 C   s.   | j rt| j dkr| j n| j}d| j|S )Nr   z	{0} - {1})r   r8   documentr@   kind)rD   extrar   r   r   rE     s   
zSecureCourseFile.__str__c                 C   s   | j p| jS r   )r   r   rC   r   r   r   
has_window  r   zSecureCourseFile.has_windowc                 C   s<   t j td}| jr|| jk rdS | jr|| jkrdS dS )NUTCFT)r   nowr   r   r   )rD   r  r   r   r   	in_window  s   zSecureCourseFile.in_windowc                 C   s,   |j jrdS | jdkr|jd sdS |  S )NTr+   	ClaremontF)r~   is_authenticatedaccesssessionr  )rD   rw   r   r   r   
has_access  s   

zSecureCourseFile.has_accessc                 C   sp   t jt| jd }|dd   }dddddddddddd	d
dd}z|| }W n   d}Y d|}|S )Nr6   excelwordjpgnbpdfpngtexr0   ipynbr   )xlsxlsxdocdocxr  jpegr  r  r  r  latexr0   r  htmlunkzico/{0}.png)r   r   splitextstrr  lowerr@   )rD   extmappingicoiconr   r   r   r.    s.   
zSecureCourseFile.iconc                 C   s   t jd| jS )Nz/c/private/{0})urllibparsequoter@   r  rC   r   r   r   r     s   zSecureCourseFile.urlc                 C   s,   | j j| j j}}| d| | j d S )Nr   z %H:%M)r   r   rq   r   )rD   rg   r   r   r   r   showrelease  s   zSecureCourseFile.showreleasec                 C   s   | j rt| j dkr| j n| j}|jjrdnd}|  r&||  r#dnd7 }d}|  r;|  s;|dd| j d	}|	| j
|tj| j|}t|S )
Nr   profstudentz	 inwindowz
 outwindowzF<a href="{0}" class="{1}"><img src="{2}{3}" class="icon">&nbsp;{4}</a>r   z (z)</a>)r   r8   r  r~   r  r  r  replacer2  r@   r   r	   r   r.  r   )rD   rw   descklassr   r   r   r   r   r     s   zSecureCourseFile.linkN)r   r   r   r   r   r   uploaded_byr   r   r   r  	FileFieldr  
private_fsr  r   r   ACCESS_CHOICESr  r   r   rE   r  r  r  r   r.  r   r2  r   r   r   r   r   r    s2    



r  c                   @   s   e Zd ZejeejdZdS )r   r   N)r   r   r   r   r   rQ   r   rv   r   r   r   r   r     s    r   c                  C   s@   t jjdd} tjj| dd}tjj| d}|j|ddd d S )	Np117)r   i  )rA   rP   rF   TRr,   )r   r   )r
   rI   getr   r;   r   )r<  r  csiter   r   r   test  s   r@  ).r   r   zoneinfor   urllib.parser/  r   	django.dbr   django.template.loaderr   markdownx.modelsr   	markdown2django.utils.safestringr   django.core.files.storager   r   r	   djphys.modelsr
   r   r   djphys.funcsr   people.modelsr   Markdownr   r   PRIVATE_ROOTPRIVATE_URLr:  r   r;  r)  r:   Modelr;   r   rQ   r  r  r   r@  r   r   r   r   <module>   sB   
	 k5V