136 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python3
 | |
| # -*- coding: utf-8 -*-
 | |
| """
 | |
| Agenda module for Inky-Calendar Project
 | |
| Copyright by aceisace
 | |
| """
 | |
| from __future__ import print_function
 | |
| from inkycal_icalendar import upcoming_events
 | |
| from configuration import *
 | |
| from settings import *
 | |
| import arrow
 | |
| 
 | |
| fontsize = 12
 | |
| show_events = True
 | |
| print_events = False
 | |
| style = 'D MMM YY HH:mm'
 | |
| 
 | |
| """Add a border to increase readability"""
 | |
| border_top = int(middle_section_height * 0.02)
 | |
| border_left = int(middle_section_width * 0.02)
 | |
| 
 | |
| """Choose font optimised for the agenda section"""
 | |
| font = ImageFont.truetype(NotoSans+'.ttf', fontsize)
 | |
| line_height = int(font.getsize('hg')[1] * 1.2) + 1
 | |
| line_width = int(middle_section_width - (border_left*2))
 | |
| 
 | |
| """Set some positions for events, dates and times"""
 | |
| date_col_width = int(line_width * 0.20)
 | |
| time_col_width = int(line_width * 0.15)
 | |
| event_col_width = int(line_width - date_col_width - time_col_width)
 | |
| 
 | |
| date_col_start = border_left
 | |
| time_col_start = date_col_start + date_col_width
 | |
| event_col_start = time_col_start + time_col_width
 | |
| 
 | |
| """Find max number of lines that can fit in the middle section and allocate
 | |
| a position for each line"""
 | |
| max_lines = int((middle_section_height - border_top*2) // line_height)
 | |
| line_pos = [(border_left, int(top_section_height + line * line_height))
 | |
|   for line in range(max_lines)]
 | |
| 
 | |
| draw = ImageDraw.Draw(image)
 | |
| 
 | |
| def main():
 | |
|   try:
 | |
|     print('Agenda module: Generating image...', end = '')
 | |
|     now = arrow.now()
 | |
| 
 | |
|     """Create a list of dictionaries containing dates of the next days"""
 | |
|     agenda_events = [{'date':now.replace(days=+_),
 | |
|       'date_str': now.replace(days=+_).format('ddd D MMM',locale=language),
 | |
|       'type':'date'} for _ in range(max_lines)]
 | |
| 
 | |
|     """Copy the list from the icalendar module with some conditions"""
 | |
|     filtered_events = [events for events in upcoming_events if
 | |
|                            events.end.to(get_tz()) > now]
 | |
| 
 | |
|     """Set print_events_to True to print all events in this month"""
 | |
|     if print_events == True and filtered_events:
 | |
|       auto_line_width = max(len(_.name) for _ in filtered_events)
 | |
|       for events in filtered_events:
 | |
|         print('{0} {1} | {2} | {3} | All day ='.format(events.name,
 | |
|           ' '* (auto_line_width - len(events.name)), events.begin.format(style),
 | |
|           events.end.format(style)), events.all_day)
 | |
|     
 | |
|     """Convert the event-timings from utc to the specified locale's time
 | |
|     and create a ready-to-display list for the agenda view"""
 | |
|     for events in filtered_events:
 | |
|       if not events.all_day:
 | |
| 
 | |
|         events.end = events.end.to(get_tz())
 | |
|         events.begin = events.begin.to(get_tz())
 | |
| 
 | |
|         agenda_events.append({'date': events.begin, 'time': events.begin.format(
 | |
|           'HH:mm' if hours == '24' else 'hh:mm a'), 'name':str(events.name),
 | |
|           'type':'timed_event'})
 | |
|       else:
 | |
|         if events.duration.days == 1:
 | |
|           agenda_events.append({'date': events.begin,'time':'All day',
 | |
|                                 'name': events.name,'type':'full_day_event'})
 | |
|         else:
 | |
|           for days in range(events.duration.days):
 | |
|             agenda_events.append({'date': events.begin.replace(days=+_),
 | |
|               'time':'All day','title':events.name, 'type':'full_day_event'})
 | |
| 
 | |
|     """Sort events and dates in chronological order"""
 | |
|     agenda_events = sorted(agenda_events, key = lambda event: event['date'])
 | |
| 
 | |
|     """Crop the agenda_events in case it's too long"""
 | |
|     del agenda_events[max_lines:]
 | |
| 
 | |
|     """Display all events, dates and times on the display"""
 | |
|     if show_events == True:
 | |
|       previous_date = None
 | |
|       for events in range(len(agenda_events)):
 | |
|         if agenda_events[events]['type'] == 'date':
 | |
|           if previous_date == None or previous_date != agenda_events[events][
 | |
|             'date']:
 | |
|             write_text(date_col_width, line_height,
 | |
|               agenda_events[events]['date_str'], line_pos[events], font = font)
 | |
|             
 | |
|           previous_date = agenda_events[events]['date']        
 | |
|           draw.line((date_col_start, line_pos[events][1],
 | |
|             line_width,line_pos[events][1]), fill = 'black')
 | |
| 
 | |
|         elif agenda_events[events]['type'] == 'timed_event':
 | |
|           write_text(time_col_width, line_height, agenda_events[events]['time'],
 | |
|             (time_col_start, line_pos[events][1]), font = font)
 | |
|          
 | |
|           write_text(event_col_width, line_height, ('• '+agenda_events[events][
 | |
|             'name']), (event_col_start, line_pos[events][1]),
 | |
|              alignment = 'left', font = font)
 | |
| 
 | |
|         else:
 | |
|           write_text(time_col_width, line_height, agenda_events[events]['time'],
 | |
|             (time_col_start, line_pos[events][1]), font = font)
 | |
|          
 | |
|           write_text(event_col_width, line_height, ('• '+agenda_events[events]['name']),
 | |
|             (event_col_start, line_pos[events][1]), alignment = 'left', font = font)
 | |
| 
 | |
|     """Crop the image to show only the middle section"""
 | |
|     agenda_image = image.crop((0, top_section_height, display_width,
 | |
|       display_height-bottom_section_height))
 | |
|     agenda_image.save(image_path+'agenda.png')
 | |
|     print('Done')
 | |
| 
 | |
|   except Exception as e:
 | |
|     """If something went wrong, print a Error message on the Terminal"""
 | |
|     print('Failed!')
 | |
|     print('Error in Agenda module!')
 | |
|     print('Reason: ',e)
 | |
|     pass
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|   main()
 |