136 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from calendar import month_name, day_abbr
 | |
| from calendar import Calendar
 | |
| from membership.models import Calendar as CalendarModel
 | |
| import datetime
 | |
| 
 | |
| now = datetime.datetime.now()
 | |
| 
 | |
| 
 | |
| class CustomCalendar(Calendar):
 | |
|     def __init__(self):
 | |
|         super(CustomCalendar, self).__init__(firstweekday=0)
 | |
| 
 | |
|     def itermonthdays(self, year, month):
 | |
|         """
 | |
|         Like itermonthdates(), but will yield day numbers. For days outside
 | |
|         the specified month the day number.
 | |
|         """
 | |
|         for date in self.itermonthdates(year, month):
 | |
|             yield date.day
 | |
| 
 | |
|     def itermonthdays2(self, year, month):
 | |
|         """
 | |
|         Like itermonthdates(), but will yield (day number, weekday number)
 | |
|         tuples. For days outside the specified month the day number is 0.
 | |
|         """
 | |
|         for date in self.itermonthdates(year, month):
 | |
|             yield (date.day, date.weekday(), date.month)
 | |
| 
 | |
| 
 | |
| class CustomHTMLCalendar(CustomCalendar):
 | |
|     """
 | |
|     This calendar returns complete HTML pages.
 | |
|     """
 | |
| 
 | |
|     # CSS classes for the day <td>s
 | |
| 
 | |
|     def __init__(self, requested_month):
 | |
|         self.requested_month = requested_month
 | |
|         super(CustomHTMLCalendar, self).__init__()
 | |
| 
 | |
|     def formatday(self, day, weekday, month=None,year=None):
 | |
|         """
 | |
|         Return a day as a table cell.
 | |
|         """
 | |
| 
 | |
|         booked = CalendarModel.objects.filter(user_id=self.user.id)
 | |
|         is_booked= booked.filter(datebooked=datetime.date(day=day,month=month,year=year))
 | |
| 
 | |
|         if month < int(self.requested_month):
 | |
|             return '<td class="prev-month %s">%d</td>' % ("selected" if is_booked else "",day)
 | |
|         elif month > int(self.requested_month):
 | |
|             return '<td class="next-month %s">%d</td>' % ("selected" if is_booked else "",day)
 | |
|         else:
 | |
|             return '<td class="%s">%d</td>' % ("selected" if is_booked else "",day)
 | |
| 
 | |
|     def formatweek(self, theweek,year):
 | |
|         """
 | |
|         Return a complete week as a table row.
 | |
|         """
 | |
|         s = ''.join(self.formatday(d, wd, month,year) for (d, wd, month) in theweek)
 | |
|         return '<tr>%s</tr>' % s
 | |
| 
 | |
|     def formatmonthname(self, theyear, themonth, withyear=True):
 | |
|         """
 | |
|         Return a month name as a table row.
 | |
|         """
 | |
|         if withyear:
 | |
|             s = '%s %s' % (month_name[themonth], theyear)
 | |
|         else:
 | |
|             s = '%s' % month_name[themonth]
 | |
|         return '<tr><th colspan="7" class="month">%s</th></tr>' % s
 | |
| 
 | |
|     def add_before(self):
 | |
|         return '<a class="btn-prev fa fa-angle-left" href="#"></a>'
 | |
| 
 | |
|     def add_after(self):
 | |
|         return '<a class="btn-next fa fa-angle-right" href="#"></a>'
 | |
| 
 | |
|     def formatmonth(self, theyear, themonth, withyear=True):
 | |
|         """
 | |
|         Return a formatted month as a table.
 | |
|         """
 | |
|         v = []
 | |
|         a = v.append
 | |
|         a('<table border="0" cellpadding="0" cellspacing="0" class="month">')
 | |
|         a('\n')
 | |
|         a(self.add_before())
 | |
|         a('\n')
 | |
|         a(self.formatmonthname(theyear, themonth, withyear=withyear))
 | |
|         a('\n')
 | |
|         a(self.add_after())
 | |
|         a('\n')
 | |
|         a(self.formatweekheader())
 | |
|         a('\n')
 | |
|         for week in self.monthdays2calendar(theyear, themonth):
 | |
|             a(self.formatweek(week,theyear))
 | |
|             a('\n')
 | |
|         a('</table>')
 | |
|         a('\n')
 | |
|         a('<span id="datesbooked"></span>')
 | |
|         return ''.join(v)
 | |
| 
 | |
| 
 | |
| class BookCalendar(CustomHTMLCalendar):
 | |
|     def __init__(self, user,requested_month):
 | |
|         self.user=user
 | |
|         super(BookCalendar, self).__init__(requested_month)
 | |
| 
 | |
|     def formatmonth(self, year, month):
 | |
|         self.year, self.month = year, month
 | |
|         return super(BookCalendar, self).formatmonth(year, month)
 | |
| 
 | |
|     def day_cell(self, cssclass, body):
 | |
|         return '<td>%s</td>' %  body
 | |
| 
 | |
|     def formatmonthname(self, theyear, themonth, withyear):
 | |
|         """
 | |
|         Return a month name as a table row.
 | |
|         """
 | |
|         s = '%s' % month_name[themonth]
 | |
|         return '<span id="monthtitle">%s</span>' % s
 | |
| 
 | |
|     def formatweekday(self, day):
 | |
|         """
 | |
|         Return a weekday name as a table header.
 | |
|         """
 | |
| 
 | |
|         ret = '<td>%s</td>' % day_abbr[day][0:2]
 | |
|         return ret
 | |
| 
 | |
|     def formatweekheader(self):
 | |
|         """
 | |
|         Return a header for a week as a table row.
 | |
|         """
 | |
|         s = ''.join(self.formatweekday(i) for i in self.iterweekdays())
 | |
|         return '<thead>%s</thead>' % s
 |