| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | #!/usr/bin/python3 | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  | Agenda module for Inky-Calendar Project | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | Copyright by aceisace | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | from __future__ import print_function | 
					
						
							|  |  |  | from inkycal_icalendar import upcoming_events | 
					
						
							|  |  |  | from configuration import * | 
					
						
							|  |  |  | from settings import * | 
					
						
							|  |  |  | import arrow | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Find max number of lines that can fit in the middle section and allocate
 | 
					
						
							|  |  |  | a position for each line"""
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  | 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)] | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  | draw = ImageDraw.Draw(image) | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  | def main(): | 
					
						
							|  |  |  |   try: | 
					
						
							|  |  |  |     print('Agenda module: Generating image...', end = '') | 
					
						
							|  |  |  |     now = arrow.now() | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |     """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)] | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |     """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] | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |     """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), | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  |           events.end.format(style)), events.all_day) | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |      | 
					
						
							|  |  |  |     """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: | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |         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), | 
					
						
							| 
									
										
										
										
											2019-10-21 07:54:19 +02:00
										 |  |  |           'type':'timed_event'}) | 
					
						
							| 
									
										
										
										
											2019-11-25 21:31:08 +01:00
										 |  |  |       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() |