wbcrm 2.2.4__py2.py3-none-any.whl → 2.2.6__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wbcrm might be problematic. Click here for more details.

@@ -0,0 +1,155 @@
1
+ from datetime import timedelta
2
+
3
+ from django.utils import timezone
4
+ from dynamic_preferences.registries import global_preferences_registry
5
+ from googleapiclient.discovery import Resource
6
+ from psycopg.types.range import TimestamptzRange
7
+ from wbcore.contrib.directory.models import Person
8
+ from wbcrm.models import Activity, ActivityParticipant
9
+
10
+ from ...typing_informations import GoogleEventType
11
+ from ...utils import GoogleSyncUtils
12
+
13
+
14
+ def update_activity_participant(event: GoogleEventType, activity: Activity):
15
+ """
16
+ Used to update the participants in a workbench activity.
17
+
18
+ :param event: The Google event dict with the participant informations.
19
+ :param activity:The corresponding activity.
20
+ """
21
+
22
+ can_sync_external_participants: bool = global_preferences_registry.manager()[
23
+ "wbactivity_sync__sync_external_participants"
24
+ ]
25
+ event_participants = GoogleSyncUtils.get_or_create_participants(event, activity.creator)
26
+
27
+ def update_or_add_participants():
28
+ for event_participant in event_participants:
29
+ if person := Person.objects.filter(id=event_participant["person_id"]).first():
30
+ activity.participants.add(person.id)
31
+ ActivityParticipant.objects.filter(activity=activity, participant=person).update(
32
+ participation_status=event_participant["status"]
33
+ )
34
+
35
+ if can_sync_external_participants or not activity.creator.is_internal: # type: ignore
36
+ update_or_add_participants()
37
+ else:
38
+ internal_activity_participants_set = set(
39
+ activity.participants.filter(id__in=Person.objects.filter_only_internal())
40
+ )
41
+ event_participants_set = set(Person.objects.filter(id__in=[x["person_id"] for x in event_participants]))
42
+ missing_activity_participants = internal_activity_participants_set - event_participants_set
43
+ update_or_add_participants()
44
+ if missing_activity_participants:
45
+ ActivityParticipant.objects.filter(
46
+ participant__in=missing_activity_participants, activity=activity
47
+ ).update(participation_status=ActivityParticipant.ParticipationStatus.CANCELLED)
48
+
49
+
50
+ def update_single_activity(event: GoogleEventType, activity: Activity, change_status=False):
51
+ """
52
+ Updates a single workbench activity based on changes done in a google event.
53
+
54
+ :param event: The google event dict that was updated.
55
+ :param activity: The corresponding workbench activity.
56
+ :param change_status: Information wheter the status of the event was updated or not.
57
+ """
58
+ if activity.external_id is None:
59
+ return
60
+ if activity.status == Activity.Status.REVIEWED or activity.status == Activity.Status.FINISHED:
61
+ metadata = activity.metadata
62
+ metadata["google_backend"] |= {"event": event} if not event.get("recurringEventId") else {"instance": event}
63
+ Activity.objects.filter(id=activity.id).update(
64
+ external_id=event["id"] if "_" in activity.external_id else activity.external_id,
65
+ metadata=metadata,
66
+ )
67
+ return
68
+ event_organizer = event.get("organizer", {})
69
+ event_organizer_mail = event_organizer.get("email", "")
70
+ event_organizer_displayed_name = event_organizer.get("displayName", "")
71
+ organizer = GoogleSyncUtils.get_or_create_person(event_organizer_mail, event_organizer_displayed_name)
72
+ event_start, event_end = GoogleSyncUtils.get_start_and_end(event)
73
+ if event_start == event_end:
74
+ event_end = event_end + timedelta(seconds=1)
75
+ period = TimestamptzRange(event_start, event_end) # type: ignore
76
+ all_day: bool = True if event["start"].get("date") else False
77
+
78
+ metadata = activity.metadata
79
+ metadata["google_backend"] |= {"event": event} if not event.get("recurringEventId") else {"instance": event}
80
+ Activity.objects.filter(id=activity.id).update(
81
+ title=event.get("summary", "(No Subject)"),
82
+ assigned_to=organizer,
83
+ description=event.get("description", ""),
84
+ start=event_start,
85
+ status=Activity.Status.PLANNED if change_status else activity.status,
86
+ end=event_end,
87
+ period=period,
88
+ all_day=all_day,
89
+ location=event.get("location"),
90
+ visibility=GoogleSyncUtils.convert_event_visibility_to_activity_visibility(event.get("visibility")),
91
+ metadata=metadata,
92
+ external_id=event["id"] if "_" in activity.external_id else activity.external_id,
93
+ )
94
+ update_activity_participant(event, activity)
95
+
96
+
97
+ def update_all_activities(activity: Activity, event: GoogleEventType, user_mail: str, service: Resource):
98
+ """
99
+ Updates all workbench activities in a recurrence chain based on changes done in a google event.
100
+
101
+ :param event: The google event dict that was updated.
102
+ :param activity: The corresponding workbench activity.
103
+ :param user_mail: The e-mail address of the current user.
104
+ :param service: The google service to interact with googles resources.
105
+ """
106
+
107
+ activity_instance = activity.metadata["google_backend"].get(
108
+ "instance", activity.metadata["google_backend"].get("event", {})
109
+ )
110
+ event_start, event_end = event["start"], event["end"]
111
+ activity_start, activity_end = activity_instance.get("start"), activity_instance.get("end")
112
+ event_instances: dict = service.events().instances(calendarId=user_mail, eventId=event["id"]).execute()
113
+ instance_items = event_instances["items"]
114
+ connected_activities = Activity.objects.filter(parent_occurrence=activity)
115
+ connected_activities |= Activity.objects.filter(metadata__google_backend__instance__recurringEventId=event["id"])
116
+ connected_activities |= Activity.objects.filter(id=activity.id)
117
+ if event_start != activity_start or event_end != activity_end:
118
+ # If the start/end time of the google event chain changes, google will also change the id of the event instances. That is why we need to handle this case seperatly
119
+ connected_activities = connected_activities.order_by("external_id")
120
+ activity_list = list(connected_activities)
121
+ instance_items.sort(key=lambda x: x["start"].get("date", x["start"]["dateTime"]))
122
+ for instance in instance_items:
123
+ if len(activity_list) == 0:
124
+ break
125
+ activity_instance = activity_list.pop(0)
126
+ update_single_activity(instance, activity_instance)
127
+ activity_instance.refresh_from_db()
128
+ else:
129
+ for instance in instance_items:
130
+ if activity_child := connected_activities.filter(external_id=instance["id"]).first() or (
131
+ activity_child := Activity.objects.filter(
132
+ metadata__google_backend__instance__id=instance["id"]
133
+ ).first()
134
+ ):
135
+ update_single_activity(instance, activity_child)
136
+
137
+
138
+ def update_activities_from_new_parent(event: dict, parent_occurrence: Activity, user_mail: str, service: Resource):
139
+ """
140
+ This methods updates child activities whose parent activity was altered.
141
+
142
+ :param event: The google event dict that was updated.
143
+ :param parent_occurrence: The corresponding workbench parent activity.
144
+ :param user_mail: The e-mail address of the current user.
145
+ :param service: The google service to interact with googles resources.
146
+
147
+ """
148
+ now = timezone.now()
149
+ canceled_child_activities = Activity.objects.filter(
150
+ parent_occurrence=parent_occurrence, period__startswith__gt=now
151
+ )
152
+ event_instances: dict = service.events().instances(calendarId=user_mail, eventId=event["id"]).execute()
153
+ for instance in event_instances["items"]:
154
+ if activity := canceled_child_activities.filter(external_id=instance["id"]).first():
155
+ update_single_activity(instance, activity, True)
@@ -0,0 +1,180 @@
1
+ import re
2
+ import warnings
3
+ from uuid import uuid4
4
+
5
+ from dateutil.rrule import rrule, rrulestr
6
+ from googleapiclient.discovery import Resource
7
+ from wbcrm.models import Activity
8
+
9
+ from ...utils import GoogleSyncUtils
10
+
11
+
12
+ def update_single_event(creator_mail: str, google_service: Resource, internal_activity: Activity, updates: dict):
13
+ """
14
+ Updates a single Google-Event.
15
+
16
+ After the external event has been updated, the metadata field of the internal activity is also updated with the information of the external event.
17
+
18
+ Note: Do not use for recurring events.
19
+
20
+ :param creator_mail: The e-mail address of the activities creator.
21
+ :param google_service: The google service to interact with googles resources.
22
+ :param internal_activity: The internal workbench activity that corresponds to the external google event.
23
+ :param updates: The update information.
24
+ :returns: None
25
+ """
26
+
27
+ updated_external_event = (
28
+ google_service.events()
29
+ .update(calendarId=creator_mail, eventId=internal_activity.external_id, body=updates)
30
+ .execute()
31
+ )
32
+ metadata = internal_activity.metadata | {"google_backend": {"event": updated_external_event}}
33
+ Activity.objects.filter(id=internal_activity.id).update(metadata=metadata)
34
+
35
+
36
+ def update_single_recurring_event(
37
+ creator_mail: str, google_service: Resource, internal_activity: Activity, updates: dict
38
+ ):
39
+ """
40
+ Updates a single recurring Google-Event.
41
+
42
+ After the external event has been updated, the metadata field of the internal activity is also updated with the information of the external event.
43
+
44
+ Note: Do not use for not recurring events.
45
+
46
+ :param creator_mail: The e-mail address of the activities creator.
47
+ :param google_service: The google service to interact with googles resources.
48
+ :param internal_activity: The internal workbench activity that corresponds to the external google event.
49
+ :param updates: The update information.
50
+ :returns: None
51
+ """
52
+ is_parent = Activity.objects.filter(parent_occurrence=internal_activity).exists()
53
+ external_id = (
54
+ internal_activity.metadata["google_backend"]["instance"].get("id")
55
+ if is_parent
56
+ else internal_activity.external_id
57
+ )
58
+ updated_event = google_service.events().patch(calendarId=creator_mail, eventId=external_id, body=updates).execute()
59
+ metadata = internal_activity.metadata
60
+ metadata["google_backend"] |= {"instance": updated_event}
61
+ Activity.objects.filter(id=internal_activity.id).update(metadata=metadata)
62
+
63
+
64
+ def update_all_recurring_events_from_parent(
65
+ creator_mail: str, google_service: Resource, internal_activity: Activity, updates: dict
66
+ ):
67
+ """
68
+ Updates all Google-Event-Instances belonging to the same recurring event chain.
69
+
70
+ After the external event instances have been updated, the metadata fields of the internal activities is also updated with the information of the corresponding external event instance.
71
+
72
+ Note: Do not use when creating a new parent activity from an existing child.
73
+
74
+ :param creator_mail: The e-mail address of the activities creator.
75
+ :param google_service: The google service to interact with googles resources.
76
+ :param internal_activity: The internal workbench parent activity that corresponds to the external google event.
77
+ :param updates: The update information.
78
+ :returns: None
79
+ """
80
+ updated_event = (
81
+ google_service.events()
82
+ .patch(calendarId=creator_mail, eventId=internal_activity.external_id, body=updates)
83
+ .execute()
84
+ )
85
+ metadata = internal_activity.metadata | {"google_backend": {"event": updated_event}}
86
+ instances = google_service.events().instances(calendarId=creator_mail, eventId=updated_event["id"]).execute()
87
+ google_event_items = instances["items"]
88
+ GoogleSyncUtils.add_instance_metadata(internal_activity, google_event_items, metadata)
89
+
90
+
91
+ def update_all_recurring_events_from_new_parent(
92
+ creator_mail: str, google_service: Resource, internal_activity: Activity, updates: dict
93
+ ):
94
+ """
95
+ Updates all Google-Event-Instances belonging to the same parent event.
96
+
97
+ After the external event instances have been updated, the metadata fields of the internal activities is also updated with the information of the corresponding external event instance.
98
+
99
+ Note: Do not use when updating from the original event chain parent.
100
+
101
+ :param creator_mail: The e-mail address of the activities creator.
102
+ :param google_service: The google service to interact with googles resources.
103
+ :param internal_activity: The internal workbench parent activity that corresponds to the external google event.
104
+ :param updates: The update information.
105
+ :returns: None
106
+ """
107
+
108
+ # If the old parent does not exist anymore, we cannot update the child.
109
+ if not (
110
+ current_parent_occurrence := Activity.objects.filter(
111
+ id=internal_activity.metadata.get("old_parent_id")
112
+ ).first()
113
+ ):
114
+ return warnings.warn(
115
+ "Could not update the recurring events on google, because the old parent activity was already deleted."
116
+ )
117
+
118
+ # Get the current parent event from google
119
+ current_google_parent_event: dict = (
120
+ google_service.events().get(calendarId=creator_mail, eventId=current_parent_occurrence.external_id).execute()
121
+ )
122
+
123
+ # Get the current recurrence rules. We need to modify them for both the current parent event and the new parent event.
124
+ current_parent_rrule_str: str = "\n".join(current_google_parent_event["recurrence"])
125
+
126
+ # We need to adjust the rrules to mimic the current status on the workbench. So we replace any until or count value with the current number of child activities.
127
+ current_parent_child_count = Activity.objects.filter(parent_occurrence=current_parent_occurrence).count()
128
+ new_parent_child_count = Activity.objects.filter(parent_occurrence=internal_activity).count()
129
+ current_parent_new_rrule: rrule = rrulestr(current_parent_rrule_str).replace( # type: ignore
130
+ count=current_parent_child_count + 1, until=None
131
+ )
132
+ new_parent_rrule: rrule = rrulestr(current_parent_rrule_str).replace(count=new_parent_child_count + 1, until=None) # type: ignore
133
+
134
+ # Converting the rrule back to str. Since the .__str__() method adds a DTSTART value, we need to remove this by using regex.
135
+ current_parent_new_rrule_str: str = re.sub("[DTSTART].*[\n]", "", current_parent_new_rrule.__str__()).split("T0")[
136
+ 0
137
+ ]
138
+ new_parent_rrule_str: str = re.sub("[DTSTART].*[\n]", "", new_parent_rrule.__str__()).split("T0")[0]
139
+
140
+ # Updating the current parent with the new rrules. This will remove all the child events on google that are not in the scope of the changed rrules anymore.
141
+ current_google_parent_event |= {"recurrence": [current_parent_new_rrule_str]}
142
+ updated_current_parent_event: dict = (
143
+ google_service.events()
144
+ .update(calendarId=creator_mail, eventId=current_google_parent_event["id"], body=current_google_parent_event)
145
+ .execute()
146
+ )
147
+
148
+ # Updating the corresponding metadata
149
+ current_parent_metadata = current_parent_occurrence.metadata | {
150
+ "google_backend": {"event": updated_current_parent_event}
151
+ }
152
+ Activity.objects.filter(id=current_parent_occurrence.id).update(metadata=current_parent_metadata)
153
+ current_instances = (
154
+ google_service.events()
155
+ .instances(calendarId=creator_mail, eventId=updated_current_parent_event["id"])
156
+ .execute()
157
+ )
158
+ current_instances_google_event_items = current_instances["items"]
159
+ current_parent_occurrence.refresh_from_db()
160
+ GoogleSyncUtils.add_instance_metadata(
161
+ current_parent_occurrence, current_instances_google_event_items, current_parent_metadata
162
+ )
163
+
164
+ # Updating the new parent with the created rrules. This will create the child events in google which are in the scope of the newly created rrules.
165
+
166
+ internal_activity_query = Activity.objects.filter(id=internal_activity.id)
167
+ external_id = uuid4().hex
168
+ updates |= {"recurrence": [new_parent_rrule_str], "id": external_id}
169
+ internal_activity_query.update(external_id=external_id)
170
+ new_parent_event: dict = google_service.events().insert(calendarId=creator_mail, body=updates).execute()
171
+
172
+ # Updating the corresponding metadata
173
+ metadata = internal_activity.metadata | {"google_backend": {"event": new_parent_event}, "old_parent_id": None}
174
+ internal_activity_query.update(metadata=metadata)
175
+ new_instances = (
176
+ google_service.events().instances(calendarId=creator_mail, eventId=new_parent_event["id"]).execute()
177
+ )
178
+ new_google_event_items = new_instances["items"]
179
+ internal_activity.refresh_from_db()
180
+ GoogleSyncUtils.add_instance_metadata(internal_activity, new_google_event_items, metadata, True)
@@ -0,0 +1,98 @@
1
+ {% load tz %}
2
+ {% load i18n %}
3
+ <table style="width: 100%; border-collapse: collapse; table-layout: fixed;">
4
+ <tr>
5
+ <p style="text-align: center;">{% translate "This is a reminder for an upcoming " %} {{type}}</p>
6
+ </tr>
7
+ <colgroup>
8
+ <col style="width: 50px;">
9
+ <col style="width: 450px;">
10
+ <col style="width: 80px;">
11
+ <col style="width: 95px;">
12
+ <col style="width: 25px;">
13
+ </colgroup>
14
+ <tr>
15
+
16
+ {% if type == 'Call' %}
17
+ <td
18
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #ff0000; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGwtcnVsZTpldmVub2RkO308L3N0eWxlPjwvZGVmcz48dGl0bGU+UGhvbmU8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTY2LjI2LDBjNS4zMSwyLjM3LDcuNDgsNy40LDEwLjA5LDEyLDgsMTQuMDcsMTUuODMsMjguMjMsMjMuODIsNDIuMywxLjkzLDMuMzgsNC4zNiw2LjQ4LDYuMzUsOS44NCw0LjgxLDguMTEsMi42LDEyLjM3LTIsMTdDOTguNTcsODcsOTIsOTIuMjYsODUuODIsOTcuODhjLTQuMjksMy45MS04LjQ1LDgtMTIuNTQsMTIuMDZDNzAsMTEzLjIzLDcwLjA2LDExNy4yOCw3MiwxMjFjMy41NCw2Ljg2LDcuNDQsMTMuNTQsMTEuMjksMjAuMjRBMjA3Ljg3LDIwNy44NywwLDAsMCwxMDUuODMsMTczYTE2My4yNSwxNjMuMjUsMCwwLDAsMjUsMjQuMjVjNy43NCw1Ljg2LDE1LjU1LDExLjY4LDIzLjcsMTYuOTUsNy42OSw1LDE1Ljc5LDkuMywyMy44NCwxMy42Nyw1LjI4LDIuODYsMTAuMTEsMS41MywxNC0yLjg1LDYuMTItNi45MiwxMi0xNC4wOCwxOC4xNi0yMC45M2ExMjMuMzksMTIzLjM5LDAsMCwxLDExLTEwLjU2YzQuMTktMy42LDguOTMtMy4xNiwxMy4zOC0uNTQsNiwzLjU2LDExLjc2LDcuNjUsMTcuODQsMTEuMTIsMTEuNzcsNi43MiwyMy43NCwxMy4wOSwzNS41MywxOS43NmE4NC45LDg0LjksMCwwLDEsOS42LDYuNjNjMSwuNzYsMS40NywyLjIxLDIuMTgsMy4zNXY2LjcxYTUuODYsNS44NiwwLDAsMC0uMzUuODdjLTEuMjMsNS44NC0yLjI5LDExLjczLTMuNzMsMTcuNTJzLTMuNTUsMTEuNTYtOC4zMiwxNS41OGExNjYuNzcsMTY2Ljc3LDAsMCwxLTE0LjQxLDExLDg0LjMzLDg0LjMzLDAsMCwxLTI4LjU2LDEyLjM4Yy0zLjU2LjgxLTcuMTcsMS40LTEwLjc2LDIuMDlIMjIxYTExLjE0LDExLjE0LDAsMCwwLTEuMS0uNGMtNy43NS0xLjgtMTUuNzItMy0yMy4yMi01LjUycS0yMC41OC03LTQwLjY4LTE1LjM4YTE1OC4xNCwxNTguMTQsMCwwLDEtMjEuNTMtMTEuMzhBMjE2LjIzLDIxNi4yMywwLDAsMSwxMDQuMDgsMjQ1Yy04LjQzLTcuNDMtMTYuODktMTQuODQtMjQuODktMjIuNzJBMzMyLjQ5LDMzMi40OSwwLDAsMSw0NCwxODJjLTcuNzktMTAuNjItMTUuMTctMjEuNTItMjAuNTQtMzMuNTctNC41NC0xMC4xOC04LjYyLTIwLjU4LTEyLjUtMzEtMy04LjIxLTUuNjYtMTYuNTktOC4xMy0yNUMxLjU0LDg4LDEsODMuNS4xMyw3OS4wNlY2Ni4xMmE2LjY1LDYuNjUsMCwwLDAsLjQzLTEuMzNDMi4zOCw0OC4zNCw5LjI5LDM0LDE4LjU5LDIwLjU3LDI0LjUsMTIsMzEuODcsNS44Myw0Mi4zLDMuNzMsNDguMDYsMi41Nyw1My44LDEuMjUsNTkuNTUsMFoiLz48L3N2Zz4=)">
19
+ </td>
20
+ {% elif type == 'Meeting' %}
21
+ <td
22
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #fffb00; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+UGVvcGxlIC0gQ1JNIC0gTWVldGluZzwvdGl0bGU+PHBhdGggZD0iTTIzNS44NywyNTEuNjJjMCwxOS4xMi0xNy4zNywzOS4yNy0zOC44LDM5LjI3SDEwNy42M2MtMjEuNDIsMC0zOC44LTIwLjE1LTM4LjgtMzkuMjdsMTYuNzEtNzEuMjRjNC4yNi0xOS43MiwxNy4zNy0zNiwzOC44LTM2aDU2YzIxLjQzLDAsMzQuNjIsMTYuNjYsMzguOCwzNloiLz48cGF0aCBkPSJNMTk5LjI0LDU4LjA4YTQ5LDQ5LDAsMSwxLTQ5LTQ5QTQ5LDQ5LDAsMCwxLDE5OS4yNCw1OC4wOFoiLz48cGF0aCBkPSJNNTYuMzUsMTczLjM2YTY5LDY5LDAsMCwxLDkuNzktMjMuNThINDIuNzNjLTE2LjQ4LDAtMjYuNTgsMTEuNDQtMjkuODUsMjYuNjRMMCwyMzAuMTVjMCwxNC43MSwxMy4zOCwyNi42MiwyOS44OCwyNi42Mkg0MS4wNUM0MC4zOSwyNTMuNiw1Ni4zNSwxNzMuMzYsNTYuMzUsMTczLjM2WiIvPjxwYXRoIGQ9Ik03MS42OCw1OC4wOGE2Ny42MSw2Ny42MSwwLDAsMSwuNjQtOC45MiwzOC4yNCwzOC4yNCwwLDAsMC05LjYzLTEuMjhBMzcuNywzNy43LDAsMSwwLDkzLDEwNy45LDY4Ljc4LDY4Ljc4LDAsMCwxLDcxLjY4LDU4LjA4WiIvPjxwYXRoIGQ9Ik0yODcuOSwxNzYuNDJjLTMuMjItMTQuOTQtMTMuMzgtMjYuNjQtMjkuODYtMjYuNjRIMjM4Ljc5YTY4LjQ3LDY4LjQ3LDAsMCwxLDkuODIsMjMuNThsMTYuOTEsNjkuOSwxLDEuODRWMjQ3YTQ1LjI0LDQ1LjI0LDAsMCwxLTEuMSw5Ljc4aDUuNTJjMTYuNDksMCwyOS44Ny0xMS45MSwyOS44Ny0yNi42MloiLz48cGF0aCBkPSJNMjA1LjcxLDEwOS41MWEzNy43MSwzNy43MSwwLDEsMCwyOS4xNi02MS42MywzOS41NCwzOS41NCwwLDAsMC02Ljc3LjYyLDcwLjYsNzAuNiwwLDAsMSwuNzQsOS41OEE2OC44LDY4LjgsMCwwLDEsMjA1LjcxLDEwOS41MVoiLz48L3N2Zz4=)">
23
+ </td>
24
+ {% elif type == 'Encounter' %}
25
+ <td
26
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #f7c145; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Y2hhdDwvdGl0bGU+PHBhdGggZD0iTTIyMS41NCwyMzEuMTFBMTE5LjM4LDExOS4zOCwwLDEsMCwxNTAsMjU0LjkyYzEuMDksMCwyLjE4LDAsMy4yNiwwYTkyLjExLDkyLjExLDAsMCwwLDExMi4xLDE3LjIxQzIzOC4yMSwyNjYuNjgsMjIzLjk0LDI1OC42OCwyMjEuNTQsMjMxLjExWm0tMTkuNjEtNTcuMzRIOTUuNDZjLTcuNDcsMC0xMy41Mi01LjYzLTEzLjUyLTEzLjExYTEzLjE3LDEzLjE3LDAsMCwxLDEzLjUyLTEzLjEySDIwMS45M2M3LjQ4LDAsMTMuNTMsNS42MywxMy41MywxMy4xMlMyMDkuNDEsMTczLjc3LDIwMS45MywxNzMuNzdabTAtNTBIOTUuNDZhMTMuNDMsMTMuNDMsMCwxLDEsMC0yNi44NUgyMDEuOTNhMTMuNDMsMTMuNDMsMCwxLDEsMCwyNi44NVoiLz48L3N2Zz4=)">
27
+ </td>
28
+ {% elif type == 'Task' %}
29
+ <td
30
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #51ff00; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Tm90ZXMgLSBUYXNrPC90aXRsZT48cG9seWdvbiBwb2ludHM9IjI1MS45NyA1NC4wMyAxOTguMDUgMCAxOTguMDUgMzEuMjYgMTk4LjA1IDU0LjAzIDIyMy41OSA1NC4wMyAyNTEuOTcgNTQuMDMiLz48cGF0aCBkPSJNMjcwLjA1LDI3My4xMVYxMDUuNzljMC0yMy4zLTIzLTIyLjExLTIzLTIyLjExSDE2OC4zM1YyM2MwLTIzLjM0LTI1LjI2LTIzLTI1LjI2LTIzSDU0LjEzUzMwLS43NiwzMCwyMS42NlYyNzIuMDhjMCwyNywyNy42MiwyNy45MiwyNy42MiwyNy45MkgyNDQuMzNDMjY5LjU4LDMwMCwyNzAuMDUsMjczLjExLDI3MC4wNSwyNzMuMTFaTTY2LDQzLjUzaDYzLjNWODMuNjhINjZabTE2OC4wOCwyMTNINjZWMjI4LjFIMjM0LjA1Wm0wLTU3LjU0SDY2VjE3MC41N0gyMzQuMDVabTAtNTcuMDdINjZWMTEzLjRIMjM0LjA1WiIvPjwvc3ZnPg==)">
31
+ </td>
32
+ {% elif type == 'Email' %}
33
+ <td
34
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #00ffd5; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+TWFpbDwvdGl0bGU+PHBhdGggZD0iTTI2Ny45Miw2NS40N0gzMC4wOWMtMi4zMiwwLTkuNDIsMS43MS05LjQyLDEzLjkydjE0MC4yYzAsMy45NCwxLjExLDgsMy44NiwxMC44M2ExMy40OCwxMy40OCwwLDAsMCwxMC4zOCw0LjExSDI2NC41NmMxLjYxLDAsNi44NC0uMTMsMTAuMjEtNC4wNSwyLjI2LTEuNzksNC41Ni00Ljg4LDQuNTYtMTAuODlWNzkuMzlDMjc5LjMzLDY2LjE0LDI3Mi4xMiw2NS40NywyNjcuOTIsNjUuNDdaTTI0Myw4NS42OWwtLjA4LjA4LjA1LS4wOFptLTE2Ny45MiwwSDI0MS43NnYxLjIzbC05MS41NSw4OS4yMUw3NS4xLDEwMy41LDU2LjczLDg1LjY5Wk0zOS40NSw5Ni42bDE2LjgyLDE2LjY3LDQ0LjM5LDQzLjIyTDM5LjQ1LDIwNC45MlpNNTYuNjcsMjE1Ljc1bDU3Ljg1LTQ1LjI4LDI4LDI3LjQzYTQuNDcsNC40NywwLDAsMCwuNDEuMzUsMTAuNiwxMC42LDAsMCwwLDMuNDUsMS44Miw5LjQ2LDkuNDYsMCwwLDAsOS4zNy0xLjc5bDIuMjktMi4yMiwyNi41OC0yNS45NCw1Ny45NSw0NS42M1ptMjAzLjg4LTExLjQyLTYxLjM5LTQ3Ljg2LDYxLjM5LTU5Ljg1WiIvPjwvc3ZnPg==)">
35
+ </td>
36
+ {% elif type == 'Event' %}
37
+ <td
38
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #0026ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+UGVvcGxlIC0gQ1JNIC0gTWVldGluZzwvdGl0bGU+PHBhdGggZD0iTTIzNS44NywyNTEuNjJjMCwxOS4xMi0xNy4zNywzOS4yNy0zOC44LDM5LjI3SDEwNy42M2MtMjEuNDIsMC0zOC44LTIwLjE1LTM4LjgtMzkuMjdsMTYuNzEtNzEuMjRjNC4yNi0xOS43MiwxNy4zNy0zNiwzOC44LTM2aDU2YzIxLjQzLDAsMzQuNjIsMTYuNjYsMzguOCwzNloiLz48cGF0aCBkPSJNMTk5LjI0LDU4LjA4YTQ5LDQ5LDAsMSwxLTQ5LTQ5QTQ5LDQ5LDAsMCwxLDE5OS4yNCw1OC4wOFoiLz48cGF0aCBkPSJNNTYuMzUsMTczLjM2YTY5LDY5LDAsMCwxLDkuNzktMjMuNThINDIuNzNjLTE2LjQ4LDAtMjYuNTgsMTEuNDQtMjkuODUsMjYuNjRMMCwyMzAuMTVjMCwxNC43MSwxMy4zOCwyNi42MiwyOS44OCwyNi42Mkg0MS4wNUM0MC4zOSwyNTMuNiw1Ni4zNSwxNzMuMzYsNTYuMzUsMTczLjM2WiIvPjxwYXRoIGQ9Ik03MS42OCw1OC4wOGE2Ny42MSw2Ny42MSwwLDAsMSwuNjQtOC45MiwzOC4yNCwzOC4yNCwwLDAsMC05LjYzLTEuMjhBMzcuNywzNy43LDAsMSwwLDkzLDEwNy45LDY4Ljc4LDY4Ljc4LDAsMCwxLDcxLjY4LDU4LjA4WiIvPjxwYXRoIGQ9Ik0yODcuOSwxNzYuNDJjLTMuMjItMTQuOTQtMTMuMzgtMjYuNjQtMjkuODYtMjYuNjRIMjM4Ljc5YTY4LjQ3LDY4LjQ3LDAsMCwxLDkuODIsMjMuNThsMTYuOTEsNjkuOSwxLDEuODRWMjQ3YTQ1LjI0LDQ1LjI0LDAsMCwxLTEuMSw5Ljc4aDUuNTJjMTYuNDksMCwyOS44Ny0xMS45MSwyOS44Ny0yNi42MloiLz48cGF0aCBkPSJNMjA1LjcxLDEwOS41MWEzNy43MSwzNy43MSwwLDEsMCwyOS4xNi02MS42MywzOS41NCwzOS41NCwwLDAsMC02Ljc3LjYyLDcwLjYsNzAuNiwwLDAsMSwuNzQsOS41OEE2OC44LDY4LjgsMCwwLDEsMjA1LjcxLDEwOS41MVoiLz48L3N2Zz4=)">
39
+ </td>
40
+ {% elif type == 'Business Travel' %}
41
+ <td
42
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #8c00ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Q29tcGFueSAtIEJ1c2luZXNzIHRyaXA8L3RpdGxlPjxwYXRoIGQ9Ik0tLjA2LDI1MS41NEEyNi40NywyNi40NywwLDAsMCwyNi40MSwyNzhIMjczLjU5YTI2LjQ3LDI2LjQ3LDAsMCwwLDI2LjQ3LTI2LjQ3di0yOEgtLjA2WiIvPjxwYXRoIGQ9Ik0yNzMuNTksODEuNTVoLTYyLjVBNjEuMDksNjEuMDksMCwwLDAsODksODEuNTVIMjYuNDFBMjYuNDgsMjYuNDgsMCwwLDAtLjA2LDEwOHY4Ny43NEgzMDAuMDZWMTA4QTI2LjQ4LDI2LjQ4LDAsMCwwLDI3My41OSw4MS41NVptLTE2MC41MSwwYTM3LDM3LDAsMCwxLDczLjg4LDBaIi8+PC9zdmc+)">
43
+ </td>
44
+ {% elif type == 'Holiday' %}
45
+ <td
46
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #f700ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+V2ViPC90aXRsZT48cGF0aCBkPSJNMzAwLDE1MGExNDkuNzgsMTQ5Ljc4LDAsMCwwLTM1LjY1LTk3LjA2bC4yNi0uMjdMMjQ5LjQ4LDM3LjJsLS4yOS4yOWExNTAsMTUwLDAsMCwwLTE5OC4zOSwwbC0uMjgtLjI5TDM1LjM4LDUyLjY3bC4yNy4yN2ExNDkuOTQsMTQ5Ljk0LDAsMCwwLS40MSwxOTMuNjNsLS4yNi4yN0w1MCwyNjIuMzhsLjI5LS4zQTE0OS4zOCwxNDkuMzgsMCwwLDAsMTQ5LjksMzAwaC4yYTE0OS4zOCwxNDkuMzgsMCwwLDAsOTkuNTctMzcuOTJsLjI5LjNMMjY1LDI0Ni44NGwtLjI2LS4yN0ExNDkuODEsMTQ5LjgxLDAsMCwwLDMwMCwxNTBaTTE1MCwyODB2MGgwbC0uMDYtMS42M2MtMTguODYsMC0zNi45NS0yMC00OC41Ny01My41N2wuODItLjMzLDEuMTgtLjQ3LDEuNzEtLjY0LDEuMTYtLjQzLDEuNzctLjYzLDEuMTEtLjM4LDEuOTMtLjYyLDEtLjMxYy43Ny0uMjQsMS41NC0uNDcsMi4zMi0uNjlsLjYxLS4xOGMxLS4yOCwyLS41NSwzLS44bC42LS4xNWMuNzktLjIsMS41OC0uMzksMi4zOC0uNTdsMS0uMjNjLjY1LS4xNCwxLjMtLjI5LDItLjQybDEuMTktLjI0LDEuODMtLjM0LDEtLjE4LjIzLDAsMS43OC0uMjksMS4zLS4yLDEuNzctLjI0LDEuMzItLjE2Yy42LS4wOCwxLjE5LS4xNCwxLjc4LS4ybDEuMzItLjE0LDEuODItLjE2LDEuMjktLjFjLjYzLS4wNSwxLjI2LS4wOCwxLjktLjEybDEuMjItLjA3LDIuMTEtLjA4LDEsMHEzLjE1LS4wNyw2LjMsMGwxLDAsMi4xMS4wOCwxLjIyLjA3Yy42NCwwLDEuMjcuMDcsMS45LjEybDEuMjkuMSwxLjgyLjE2LDEuMzEuMTRjLjYuMDYsMS4xOS4xMiwxLjc5LjJsMS4zMi4xNiwxLjc2LjI0LDEuMzEuMiwxLjc4LjI5LjIzLDAsMSwuMTgsMS44NC4zNCwxLjE5LjI0Yy42Ni4xMywxLjMxLjI4LDIsLjQybDEsLjIzYy43OS4xOCwxLjU5LjM3LDIuMzguNTdsLjYuMTVjMSwuMjUsMiwuNTIsMywuOGwuNjEuMThjLjc3LjIyLDEuNTUuNDUsMi4zMi42OWwxLC4zMSwxLjkyLjYyLDEuMTIuMzgsMS43Ny42MywxLjE2LjQzLDEuNzEuNjQsMS4xNy40Ny44My4zM0MxODcsMjU4LjMzLDE2OC45MiwyNzguMzIsMTUwLDI3OC4zNlYyODBabTgxLjYzLTE0NC42MWEyNTUuMTYsMjU1LjE2LDAsMCwwLTcuMjUtNDkuNzFsLjU5LS4zMywxLjczLTEsLjYyLS4zN2MuMjQtLjE0LjQ4LS4yOC43MS0uNDMsMS0uNjEsMi0xLjIzLDMtMS44N2wuNzYtLjUxYy43NS0uNDgsMS40OC0xLDIuMjItMS40N2wuNzYtLjUyLjM5LS4yOCwxLjgtMS4yNS45MS0uNjcuMzEtLjIzYy41Ni0uNCwxLjEyLS44MSwxLjY3LTEuMjMuMzctLjI3LjczLS41NSwxLjA5LS44M2wuMTctLjEzLDEuNi0xLjI0LDEuMjYtMUwyNDUuNTIsNzFsMS4yNS0xLDEuNTItMS4zLjU4LS41MWExMjcuMTcsMTI3LjE3LDAsMCwxLDI4LjY3LDY3LjI0Wm0uODktODEuNzItLjc5LjY2LS4yMS4xNy0xLjM4LDEuMTMtMSwuODMtMS4zOSwxLjA4LTEuMDYuOC0xLjQyLDEtMS4wNi43Ny0xLjU1LDEuMDgtMSwuNjctMS41NCwxLTEsLjY2LTEuMzEuODNhMTQ3LjYzLDE0Ny42MywwLDAsMC0xNi4yNy0zMi4wNSwxMjcuMTUsMTI3LjE1LDAsMCwxLDMyLjE2LDIwLjMyWk0yMTguMDksMjM0LjhjLjQ5LjMsMSwuNjEsMS40NS45MmwxLC42M2MuNTQuMzUsMS4wOC43MSwxLjYxLDEuMDhsMSwuNywxLjUyLDEuMDYsMSwuNzYsMS40NiwxLjA4LDEsLjc5LDEuNDMsMS4xMiwxLC44MSwxLjUsMS4yNC45Ljc1LDEuMjcsMS4xYTEyNy4xMiwxMjcuMTIsMCwwLDEtMzIuNzQsMjAuODJBMTQ4LDE0OCwwLDAsMCwyMTguMDksMjM0LjhabTE3LjY0LTE0LjI2LS41NS0uMzgtLjcyLS41Yy0uNzYtLjUyLTEuNTItMS0yLjI5LTEuNTNsLS43LS40N2MtMS0uNjUtMi0xLjI5LTMtMS45MWwtMS0uNmMtLjY5LS40Mi0xLjM4LS44NC0yLjA3LTEuMjRsLS43Ny0uNDRBMjYxLjEzLDI2MS4xMywwLDAsMCwyMzEuOTMsMTU3aDQ2LjI0YTEyNi43MSwxMjYuNzEsMCwwLDEtMjguODMsNzQuMjhsLS41NS0uNDhoMGMtLjUyLS40Ni0xLS45MS0xLjU2LTEuMzVsLTEuMjItMS0xLjU4LTEuMy0xLjI1LTEtMS42Ni0xLjMtMS4yLS45My0xLjctMS4yNi0uMzktLjI5LS44Mi0uNlpNODIuMiw2NC4zOWMtLjQ0LS4yNy0uODgtLjU0LTEuMzEtLjgybC0xLS42Ni0xLjU1LTEtMS0uNjYtLjA5LS4wNmMtLjUtLjM0LTEtLjY4LTEuNDgtMWwtMS0uNzUtMS40NC0xLjA2LTEtLjc5LTEuNDEtMS4wOS0xLS44MS0xLjQxLTEuMTUtLjA5LS4wOC0uODktLjczLTEuMTYtMUExMjcuMTUsMTI3LjE1LDAsMCwxLDk4LjQ3LDMyLjM1LDE0Ny43NywxNDcuNzcsMCwwLDAsODIuMiw2NC4zOVpNNTQuNDcsNzEsNTYsNzIuMjhsLjEzLjEsMS4xMi45LDEuNjEsMS4yNS4zMi4yNS45My43Yy40OC4zNiwxLC43MiwxLjQ1LDEuMDdsLjU3LjQyLjg3LjY0LDEuNjEsMS4xMy41OS40Ljc1LjUyYy43NS41MSwxLjUsMSwyLjI2LDEuNWwuNzIuNDhjMSwuNjQsMiwxLjI2LDMsMS44OGwuNzEuNDIuNDYuMjdMNzUsODUuMzRsLjU5LjMzYTI1NS44MSwyNTUuODEsMCwwLDAtNy4yNiw0OS43MUgyMi40NkExMjcuMTcsMTI3LjE3LDAsMCwxLDUxLjEzLDY4LjE0bC41Ny41TDUzLjI0LDcwWm0xMy42LDg2YTI2MC41MSwyNjAuNTEsMCwwLDAsNy4zMiw1Ni40NmwtLjc3LjQzLTIuMDcsMS4yNS0xLC42Yy0xLC42Mi0yLDEuMjYtMywxLjkxbC0uNy40N2MtLjc3LjUtMS41MywxLTIuMywxLjUzbC0xLjM3LDEtMS41NywxLjExLS44Mi42LS4zOS4yOWgwYy0uNTcuNDItMS4xNC44NC0xLjcsMS4yNy0uNDEuMy0uODEuNjEtMS4yNCwxbC0xLjYzLDEuMjctMS4yNCwxTDU0LDIyOC40MmwtMS4yMywxYy0uNTIuNDQtMSwuODktMS41NSwxLjM1bC0uNTUuNDhBMTI2Ljc4LDEyNi43OCwwLDAsMSwyMS44MiwxNTdaTTY3LDI0NS43NGwxLS44MiwxLjQyLTEuMTcsMS0uODFjLjQ3LS4zOCwxLS43NSwxLjQzLTEuMTJsMS0uNzlMNzQuMzQsMjQwbDEtLjc1LDEuNTItMS4wOCwxLS42OWMuNTMtLjM3LDEuMDctLjczLDEuNjEtMS4wOWwuMy0uMTkuNjUtLjQzYy40OC0uMzEsMS0uNjIsMS40NS0uOTJhMTQ4LDE0OCwwLDAsMCwxNi41NywzMi44NiwxMjcuMTIsMTI3LjEyLDAsMCwxLTMyLjc0LTIwLjgyQzY2LjE2LDI0Ni40Nyw2Ni41OCwyNDYuMSw2NywyNDUuNzRabTEyOC4xMy00NS4yLS42OC0uMjFjLTEuMTMtLjM1LTIuMjctLjY5LTMuNDEtMWwtLjg3LS4yNGMtLjg2LS4yMy0xLjczLS40Ny0yLjYtLjY5bC0uODctLjIyLS42My0uMTVjLS42Ni0uMTctMS4zMi0uMzMtMi0uNDhsLTEtLjIzLS40Ni0uMS0yLjA1LS40NC0xLjMzLS4yNi0uMjEsMC0yLS4zOGMtLjUzLS4xLTEuMDUtLjE5LTEuNTgtLjI3cy0xLjMzLS4yMy0yLS4zM2wtMS41OS0uMjQtMi0uMjgtMS41OS0uMi0yLS4yMy0uMjgsMC0xLjI5LS4xMy0yLjEtLjE4LS40LDAtMS4xNC0uMDktMi4yMS0uMTMtLjQyLDAtMS0uMDYtMi40NC0uMDktMS4yMywwYy0xLjIyLDAtMi40NSwwLTMuNjgsMHMtMi40NiwwLTMuNjgsMGwtMS4yMiwwLTIuNDUuMDktMSwuMDYtLjQyLDAtMi4yMi4xMy0xLjExLjA5LS40MiwwLTIuMS4xOC0xLjI5LjEzLS4yOSwwLTIsLjIzLTEuNTkuMi0yLC4yOC0xLjU4LjI0LTIsLjMyLTEuNTguMjgtMiwuMzgtLjIxLDAtMS4zMy4yNi0yLjA1LjQ0LS40NC4xLTEsLjIzLTIuMTYuNTItLjQ2LjExLS44Ny4yMmMtLjg3LjIyLTEuNzQuNDYtMi42LjY5bC0uODcuMjRjLTEuMTQuMzItMi4yOC42Ni0zLjQxLDFsLS42OC4yMS0uNDEuMTQtMi4zMS43NC0xLC4zNC0uNDkuMTctMS45Mi42Ny0xLjEuNDEtLjM1LjEzLTEuODcuNzFBMjQyLjIyLDI0Mi4yMiwwLDAsMSw4OS43MiwxNTdIMjEwLjI4YTI0Mi4yMiwyNDIuMjIsMCwwLDEtNS43Miw0Ni44NGwtMS44Ny0uNzEtLjM1LS4xMy0xLjEtLjQxLTItLjctLjQxLS4xNC0xLS4zNC0yLjMxLS43NFpNOTAsMTM1LjM4YTIzOC4zMSwyMzguMzEsMCwwLDEsNS42Mi00MC4xNGwuMSwwYy42MS4yNCwxLjIyLjQ2LDEuODQuNjlsLjQxLjE2LDEuMDcuMzksMS43My42MS43LjI0LjkzLjMyLDIuMjIuNzEuNDQuMTQuNzMuMjNjMS4xMi4zNSwyLjI0LjY4LDMuMzcsMWwxLC4yN2MuODIuMjIsMS42NC40NSwyLjQ2LjY1bC45My4yMy42MS4xNWMuNjQuMTYsMS4yOS4zMiwxLjkzLjQ2LjM2LjA5LjcyLjE3LDEuMDkuMjRsLjQuMDljLjY3LjE1LDEuMzQuMywyLC40M2wxLjM0LjI3LjIxLDAsMiwuMzcsMS41Ny4yNywyLC4zMiwxLjU5LjI0LDIsLjI3LDEuNTkuMiwyLjEzLjI0LDEuNDcuMTUsMi4wOC4xOC4zNSwwLDEuMTguMDksMi4xOS4xNC40NywwLDEsLjA2Yy44MSwwLDEuNjMuMDYsMi40NC4wOWwxLjIsMGMyLjQzLjA2LDQuODkuMDYsNy4zMiwwbDEuMiwwYy44MSwwLDEuNjMtLjA1LDIuNDQtLjA5bDEtLjA2LjQ3LDAsMi4xOS0uMTQsMS4xOC0uMDkuMzUsMCwyLjA4LS4xOCwxLjQ1LS4xNWguMTJsMi0uMjMsMS41OS0uMiwyLS4yNywxLjU5LS4yNCwyLS4zMiwxLjU3LS4yNywyLS4zNy4zNS0uMDcsMS4yLS4yNGMuNjctLjEzLDEuMzQtLjI4LDItLjQzbC4zNS0uMDcsMS4xNC0uMjUsMS45NC0uNDcuNjEtLjE1LjkyLS4yMmMuODItLjIxLDEuNjQtLjQ0LDIuNDYtLjY2bDEtLjI3YzEuMTMtLjMxLDIuMjUtLjY0LDMuMzgtMWwxLjE5LS4zOCwyLjE5LS43LjkxLS4zMS42Ny0uMjRjLjYtLjIsMS4xOS0uNCwxLjc4LS42MmwxLjExLS40MS41MS0uMTksMS43MS0uNjQuMDksMEEyMzkuMzMsMjM5LjMzLDAsMCwxLDIxMCwxMzUuMzhabTEwNy40Ni02MC43LTEuMTcuNDZjLS41Ni4yMi0xLjEyLjQzLTEuNjkuNjNsLTEuMTYuNDMtMS43NS42MS0uMzEuMTEtLjgxLjI3Yy0uNjIuMjEtMS4yNC40MS0xLjg3LjZsLTEsLjMzLTIuMTguNjQtLjczLjIxYy0xLC4yOC0yLC41NC0zLC43OWwtLjQuMWMtLjg1LjIxLTEuNzEuNDItMi41Ni42MWwtMSwuMjItMiwuNDMtMS4xNi4yMi0xLjg0LjM1LTEuMTQuMTktLjExLDAtMS43OC4yOS0xLjI4LjE5cS0uODguMTQtMS43Ny4yNGwtMS4zLjE3LTEuNzguMTktMS4zLjE0LTEuOC4xNS0xLjI5LjEtMS44OC4xMi0xLjIyLjA3LTIuMDguMDgtMSwwYy0yLjA4LDAtNC4xNywwLTYuMjQsMGwtMSwwLTIuMDgtLjA4LTEuMjItLjA3Yy0uNjMsMC0xLjI1LS4wNy0xLjg4LS4xMmwtMS4yOS0uMS0xLjgtLjE1TDEzNi40LDgzbC0uMTIsMC0xLjc4LS4xOS0xLjMtLjE3Yy0uNTktLjA3LTEuMTgtLjE1LTEuNzYtLjI0bC0xLjI5LS4xOS0xLjc4LS4yOS0xLjI2LS4yMS0xLjgyLS4zNS0xLjE4LS4yMi0yLS40My0xLS4yMmMtLjg1LS4xOS0xLjctLjQtMi41NS0uNjFsLS40MS0uMWMtMS0uMjUtMi0uNTEtMy0uNzlsLS43My0uMjEtMi4xOC0uNjQtMS0uMzNxLS45My0uMjktMS44Ni0uNmwtMS4xMi0uMzgtMS43NS0uNjEtMS4xNi0uNDNjLS41Ny0uMi0xLjEzLS40MS0xLjY5LS42M2wtMS4xNy0uNDYtLjg0LS4zNGMxMS42NC0zMywyOS42NC01Mi43LDQ4LjMzLTUyLjdzMzYuNjksMTkuNjYsNDguMzMsNTIuN1oiLz48L3N2Zz4=)">
47
+ </td>
48
+ {% elif type == 'Lunch' %}
49
+ <td
50
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #00ccff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+THVuY2g8L3RpdGxlPjxwYXRoIGQ9Ik0yMzMuNjEsMTM4LjYyYzEyLjg4LTEyLjg5LDMxLjg3LTUzLjgzLDE5LTY2LjcybC0uMDgtLjA3LS4wNS0uMDYtLjM1LS4zMi0uMTktLjE2YTEyLjUxLDEyLjUxLDAsMCwwLTUuMi0yLjc5Yy0xNi44Ni01LjM1LTUxLjEyLDkuNDYtNjIuNDUsMjAuNzktMTAuMzcsMTAuMzctMTUuODQsMjYuNjItOC42NCw0MS41MWwtMjAuNzcsMjAuNzctMjEuMzktMjEuMzljNC42OS0xMi4zNi4xMS0yNi42NS0xMy40Mi00MC4xOUw4OCw1OGE2LjI5LDYuMjksMCwwLDAtOC44OSw4Ljg5bDMyLDMyLC44OC45LTkuNTksOS41OUw2OS41Myw3Ni40N2E2LjI5LDYuMjksMCwwLDAtOC44OSw4LjlsMzIuOTEsMzIuOTFMODQsMTI3Ljg3bC0uOS0uODhMNTEsOTVhNi4yOSw2LjI5LDAsMSwwLTguOSw4LjlsMzIsMzJjMTQuMjMsMTQuMjMsMjkuMjgsMTguNTUsNDIuMDcsMTIuNjNsMjAuODUsMjAuODQtNTMsNTNhMTIuNTgsMTIuNTgsMCwxLDAsMTcuOCwxNy43OWw1My01Myw1Mi42Miw1Mi42MUExMi41OCwxMi41OCwwLDAsMCwyMjUuMjgsMjIybC01Mi42Mi01Mi42MiwyMS40NS0yMS40NUMyMDcuMTcsMTUyLjMxLDIyMy43OSwxNDguNDMsMjMzLjYxLDEzOC42MlptLTEyOS4yMS0uMDYuOTQtLjk0LjgyLjgzQTE0LjcyLDE0LjcyLDAsMCwxLDEwNC40LDEzOC41NloiLz48L3N2Zz4=)">
51
+ </td>
52
+ {% else %}
53
+ <td style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #51ff00;"></td>
54
+ {% endif %}
55
+ <td style="background-color: #eaf2ff; padding: 15px 10px; text-align: left; font-size: 14px;"><strong>{{ title }}</strong></td>
56
+ <td style="background-color: #eaf2ff; padding: 10px 0px; text-align: center; font-size: 12px; white-space: nowrap;">{{ start|date:'d.m.Y' }}</td>
57
+ <td style="background-color: #eaf2ff; padding: 10px 0px; text-align: center; font-size: 12px; line-height: 10px;">{{ start|date:'H:i' }} - {{ end|date:'H:i' }}</td>
58
+ <td style="background-color: #eaf2ff; border-top-right-radius: 25px; border-bottom-right-radius: 25px; line-height: 50px;"></td>
59
+ </tr>
60
+ <tr>
61
+ <td colspan="1">
62
+ <div style="padding-top: 30px;"></div>
63
+ </td>
64
+ {% if description %}
65
+ <td colspan="4">
66
+ <div style="padding-top: 30px; text-align: left;"><strong>{% translate "Description" %}:</strong>{{description|safe}}</div>
67
+ </td>
68
+ {% endif %}
69
+ <td colspan="1">
70
+ <div style="padding-top: 30px;"></div>
71
+ </td>
72
+ </tr>
73
+ {% if participants.all.count > 0 %}
74
+ <tr>
75
+ <td colspan="1">
76
+ <div style="padding-top: 10px;"></div>
77
+ </td>
78
+ <td colspan="4">
79
+ <div style="padding-top: 10px; text-align: left;">
80
+ <strong>{% translate "Participants" %}:</strong>
81
+ <ul style="padding-left: 15px;">
82
+ {% for participant in participants.all %}
83
+ <li style="padding:0;">{{ participant }}</li>
84
+ {% endfor %}
85
+ </ul>
86
+ </div>
87
+ </td>
88
+ <td colspan="1">
89
+ <div style="padding-top: 10px;"></div>
90
+ </td>
91
+ </tr>
92
+ {% endif %}
93
+ <tr>
94
+ <td colspan="6">
95
+ <div style="padding: 4px;"></div>
96
+ </td>
97
+ </tr>
98
+ </table>
@@ -0,0 +1,6 @@
1
+ {% extends "notifications/email_template.html" %}
2
+ {% load i18n %}
3
+ {% block body %}
4
+ <p style="font-size: 20px; color: #313952; text-align: center;"><strong>{% translate "Dear " %}{{profile.first_name}} {{profile.last_name}}</strong></p>
5
+ <p style="text-align: center;">{% translate "Attached you will find the requested Excel activity report for" %} {{employee.search_name}}</p>
6
+ {% endblock %}
@@ -0,0 +1,72 @@
1
+ {% load i18n %}
2
+ <table style="width: 100%; border-collapse: collapse; table-layout: fixed;">
3
+ <tr>
4
+ <p style="text-align: center;">{% translate "You have" %} {{ activities|length }} {% translate "Activities today" %}:</p>
5
+ </tr>
6
+ <colgroup>
7
+ <col style="width: 50px;">
8
+ <col style="width: 470px;">
9
+ <col style="width: 80px;">
10
+ <col style="width: 45px;">
11
+ <col style="width: 50px;">
12
+ </colgroup>
13
+ {% for activity in activities %}
14
+ <tr>
15
+ {% if activity.type == 'Call' %}
16
+ <td
17
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #ff0000; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGwtcnVsZTpldmVub2RkO308L3N0eWxlPjwvZGVmcz48dGl0bGU+UGhvbmU8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTY2LjI2LDBjNS4zMSwyLjM3LDcuNDgsNy40LDEwLjA5LDEyLDgsMTQuMDcsMTUuODMsMjguMjMsMjMuODIsNDIuMywxLjkzLDMuMzgsNC4zNiw2LjQ4LDYuMzUsOS44NCw0LjgxLDguMTEsMi42LDEyLjM3LTIsMTdDOTguNTcsODcsOTIsOTIuMjYsODUuODIsOTcuODhjLTQuMjksMy45MS04LjQ1LDgtMTIuNTQsMTIuMDZDNzAsMTEzLjIzLDcwLjA2LDExNy4yOCw3MiwxMjFjMy41NCw2Ljg2LDcuNDQsMTMuNTQsMTEuMjksMjAuMjRBMjA3Ljg3LDIwNy44NywwLDAsMCwxMDUuODMsMTczYTE2My4yNSwxNjMuMjUsMCwwLDAsMjUsMjQuMjVjNy43NCw1Ljg2LDE1LjU1LDExLjY4LDIzLjcsMTYuOTUsNy42OSw1LDE1Ljc5LDkuMywyMy44NCwxMy42Nyw1LjI4LDIuODYsMTAuMTEsMS41MywxNC0yLjg1LDYuMTItNi45MiwxMi0xNC4wOCwxOC4xNi0yMC45M2ExMjMuMzksMTIzLjM5LDAsMCwxLDExLTEwLjU2YzQuMTktMy42LDguOTMtMy4xNiwxMy4zOC0uNTQsNiwzLjU2LDExLjc2LDcuNjUsMTcuODQsMTEuMTIsMTEuNzcsNi43MiwyMy43NCwxMy4wOSwzNS41MywxOS43NmE4NC45LDg0LjksMCwwLDEsOS42LDYuNjNjMSwuNzYsMS40NywyLjIxLDIuMTgsMy4zNXY2LjcxYTUuODYsNS44NiwwLDAsMC0uMzUuODdjLTEuMjMsNS44NC0yLjI5LDExLjczLTMuNzMsMTcuNTJzLTMuNTUsMTEuNTYtOC4zMiwxNS41OGExNjYuNzcsMTY2Ljc3LDAsMCwxLTE0LjQxLDExLDg0LjMzLDg0LjMzLDAsMCwxLTI4LjU2LDEyLjM4Yy0zLjU2LjgxLTcuMTcsMS40LTEwLjc2LDIuMDlIMjIxYTExLjE0LDExLjE0LDAsMCwwLTEuMS0uNGMtNy43NS0xLjgtMTUuNzItMy0yMy4yMi01LjUycS0yMC41OC03LTQwLjY4LTE1LjM4YTE1OC4xNCwxNTguMTQsMCwwLDEtMjEuNTMtMTEuMzhBMjE2LjIzLDIxNi4yMywwLDAsMSwxMDQuMDgsMjQ1Yy04LjQzLTcuNDMtMTYuODktMTQuODQtMjQuODktMjIuNzJBMzMyLjQ5LDMzMi40OSwwLDAsMSw0NCwxODJjLTcuNzktMTAuNjItMTUuMTctMjEuNTItMjAuNTQtMzMuNTctNC41NC0xMC4xOC04LjYyLTIwLjU4LTEyLjUtMzEtMy04LjIxLTUuNjYtMTYuNTktOC4xMy0yNUMxLjU0LDg4LDEsODMuNS4xMyw3OS4wNlY2Ni4xMmE2LjY1LDYuNjUsMCwwLDAsLjQzLTEuMzNDMi4zOCw0OC4zNCw5LjI5LDM0LDE4LjU5LDIwLjU3LDI0LjUsMTIsMzEuODcsNS44Myw0Mi4zLDMuNzMsNDguMDYsMi41Nyw1My44LDEuMjUsNTkuNTUsMFoiLz48L3N2Zz4=)">
18
+ </td>
19
+ {% elif activity.type == 'Meeting' %}
20
+ <td
21
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #fffb00; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+UGVvcGxlIC0gQ1JNIC0gTWVldGluZzwvdGl0bGU+PHBhdGggZD0iTTIzNS44NywyNTEuNjJjMCwxOS4xMi0xNy4zNywzOS4yNy0zOC44LDM5LjI3SDEwNy42M2MtMjEuNDIsMC0zOC44LTIwLjE1LTM4LjgtMzkuMjdsMTYuNzEtNzEuMjRjNC4yNi0xOS43MiwxNy4zNy0zNiwzOC44LTM2aDU2YzIxLjQzLDAsMzQuNjIsMTYuNjYsMzguOCwzNloiLz48cGF0aCBkPSJNMTk5LjI0LDU4LjA4YTQ5LDQ5LDAsMSwxLTQ5LTQ5QTQ5LDQ5LDAsMCwxLDE5OS4yNCw1OC4wOFoiLz48cGF0aCBkPSJNNTYuMzUsMTczLjM2YTY5LDY5LDAsMCwxLDkuNzktMjMuNThINDIuNzNjLTE2LjQ4LDAtMjYuNTgsMTEuNDQtMjkuODUsMjYuNjRMMCwyMzAuMTVjMCwxNC43MSwxMy4zOCwyNi42MiwyOS44OCwyNi42Mkg0MS4wNUM0MC4zOSwyNTMuNiw1Ni4zNSwxNzMuMzYsNTYuMzUsMTczLjM2WiIvPjxwYXRoIGQ9Ik03MS42OCw1OC4wOGE2Ny42MSw2Ny42MSwwLDAsMSwuNjQtOC45MiwzOC4yNCwzOC4yNCwwLDAsMC05LjYzLTEuMjhBMzcuNywzNy43LDAsMSwwLDkzLDEwNy45LDY4Ljc4LDY4Ljc4LDAsMCwxLDcxLjY4LDU4LjA4WiIvPjxwYXRoIGQ9Ik0yODcuOSwxNzYuNDJjLTMuMjItMTQuOTQtMTMuMzgtMjYuNjQtMjkuODYtMjYuNjRIMjM4Ljc5YTY4LjQ3LDY4LjQ3LDAsMCwxLDkuODIsMjMuNThsMTYuOTEsNjkuOSwxLDEuODRWMjQ3YTQ1LjI0LDQ1LjI0LDAsMCwxLTEuMSw5Ljc4aDUuNTJjMTYuNDksMCwyOS44Ny0xMS45MSwyOS44Ny0yNi42MloiLz48cGF0aCBkPSJNMjA1LjcxLDEwOS41MWEzNy43MSwzNy43MSwwLDEsMCwyOS4xNi02MS42MywzOS41NCwzOS41NCwwLDAsMC02Ljc3LjYyLDcwLjYsNzAuNiwwLDAsMSwuNzQsOS41OEE2OC44LDY4LjgsMCwwLDEsMjA1LjcxLDEwOS41MVoiLz48L3N2Zz4=)">
22
+ </td>
23
+ {% elif activity.type == 'Encounter' %}
24
+ <td
25
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #f7c145; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Y2hhdDwvdGl0bGU+PHBhdGggZD0iTTIyMS41NCwyMzEuMTFBMTE5LjM4LDExOS4zOCwwLDEsMCwxNTAsMjU0LjkyYzEuMDksMCwyLjE4LDAsMy4yNiwwYTkyLjExLDkyLjExLDAsMCwwLDExMi4xLDE3LjIxQzIzOC4yMSwyNjYuNjgsMjIzLjk0LDI1OC42OCwyMjEuNTQsMjMxLjExWm0tMTkuNjEtNTcuMzRIOTUuNDZjLTcuNDcsMC0xMy41Mi01LjYzLTEzLjUyLTEzLjExYTEzLjE3LDEzLjE3LDAsMCwxLDEzLjUyLTEzLjEySDIwMS45M2M3LjQ4LDAsMTMuNTMsNS42MywxMy41MywxMy4xMlMyMDkuNDEsMTczLjc3LDIwMS45MywxNzMuNzdabTAtNTBIOTUuNDZhMTMuNDMsMTMuNDMsMCwxLDEsMC0yNi44NUgyMDEuOTNhMTMuNDMsMTMuNDMsMCwxLDEsMCwyNi44NVoiLz48L3N2Zz4=)">
26
+ </td>
27
+ {% elif activity.type == 'Task' %}
28
+ <td
29
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #51ff00; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Tm90ZXMgLSBUYXNrPC90aXRsZT48cG9seWdvbiBwb2ludHM9IjI1MS45NyA1NC4wMyAxOTguMDUgMCAxOTguMDUgMzEuMjYgMTk4LjA1IDU0LjAzIDIyMy41OSA1NC4wMyAyNTEuOTcgNTQuMDMiLz48cGF0aCBkPSJNMjcwLjA1LDI3My4xMVYxMDUuNzljMC0yMy4zLTIzLTIyLjExLTIzLTIyLjExSDE2OC4zM1YyM2MwLTIzLjM0LTI1LjI2LTIzLTI1LjI2LTIzSDU0LjEzUzMwLS43NiwzMCwyMS42NlYyNzIuMDhjMCwyNywyNy42MiwyNy45MiwyNy42MiwyNy45MkgyNDQuMzNDMjY5LjU4LDMwMCwyNzAuMDUsMjczLjExLDI3MC4wNSwyNzMuMTFaTTY2LDQzLjUzaDYzLjNWODMuNjhINjZabTE2OC4wOCwyMTNINjZWMjI4LjFIMjM0LjA1Wm0wLTU3LjU0SDY2VjE3MC41N0gyMzQuMDVabTAtNTcuMDdINjZWMTEzLjRIMjM0LjA1WiIvPjwvc3ZnPg==)">
30
+ </td>
31
+ {% elif activity.type == 'Email' %}
32
+ <td
33
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #00ffd5; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+TWFpbDwvdGl0bGU+PHBhdGggZD0iTTI2Ny45Miw2NS40N0gzMC4wOWMtMi4zMiwwLTkuNDIsMS43MS05LjQyLDEzLjkydjE0MC4yYzAsMy45NCwxLjExLDgsMy44NiwxMC44M2ExMy40OCwxMy40OCwwLDAsMCwxMC4zOCw0LjExSDI2NC41NmMxLjYxLDAsNi44NC0uMTMsMTAuMjEtNC4wNSwyLjI2LTEuNzksNC41Ni00Ljg4LDQuNTYtMTAuODlWNzkuMzlDMjc5LjMzLDY2LjE0LDI3Mi4xMiw2NS40NywyNjcuOTIsNjUuNDdaTTI0Myw4NS42OWwtLjA4LjA4LjA1LS4wOFptLTE2Ny45MiwwSDI0MS43NnYxLjIzbC05MS41NSw4OS4yMUw3NS4xLDEwMy41LDU2LjczLDg1LjY5Wk0zOS40NSw5Ni42bDE2LjgyLDE2LjY3LDQ0LjM5LDQzLjIyTDM5LjQ1LDIwNC45MlpNNTYuNjcsMjE1Ljc1bDU3Ljg1LTQ1LjI4LDI4LDI3LjQzYTQuNDcsNC40NywwLDAsMCwuNDEuMzUsMTAuNiwxMC42LDAsMCwwLDMuNDUsMS44Miw5LjQ2LDkuNDYsMCwwLDAsOS4zNy0xLjc5bDIuMjktMi4yMiwyNi41OC0yNS45NCw1Ny45NSw0NS42M1ptMjAzLjg4LTExLjQyLTYxLjM5LTQ3Ljg2LDYxLjM5LTU5Ljg1WiIvPjwvc3ZnPg==)">
34
+ </td>
35
+ {% elif activity.type == 'Event' %}
36
+ <td
37
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #0026ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+UGVvcGxlIC0gQ1JNIC0gTWVldGluZzwvdGl0bGU+PHBhdGggZD0iTTIzNS44NywyNTEuNjJjMCwxOS4xMi0xNy4zNywzOS4yNy0zOC44LDM5LjI3SDEwNy42M2MtMjEuNDIsMC0zOC44LTIwLjE1LTM4LjgtMzkuMjdsMTYuNzEtNzEuMjRjNC4yNi0xOS43MiwxNy4zNy0zNiwzOC44LTM2aDU2YzIxLjQzLDAsMzQuNjIsMTYuNjYsMzguOCwzNloiLz48cGF0aCBkPSJNMTk5LjI0LDU4LjA4YTQ5LDQ5LDAsMSwxLTQ5LTQ5QTQ5LDQ5LDAsMCwxLDE5OS4yNCw1OC4wOFoiLz48cGF0aCBkPSJNNTYuMzUsMTczLjM2YTY5LDY5LDAsMCwxLDkuNzktMjMuNThINDIuNzNjLTE2LjQ4LDAtMjYuNTgsMTEuNDQtMjkuODUsMjYuNjRMMCwyMzAuMTVjMCwxNC43MSwxMy4zOCwyNi42MiwyOS44OCwyNi42Mkg0MS4wNUM0MC4zOSwyNTMuNiw1Ni4zNSwxNzMuMzYsNTYuMzUsMTczLjM2WiIvPjxwYXRoIGQ9Ik03MS42OCw1OC4wOGE2Ny42MSw2Ny42MSwwLDAsMSwuNjQtOC45MiwzOC4yNCwzOC4yNCwwLDAsMC05LjYzLTEuMjhBMzcuNywzNy43LDAsMSwwLDkzLDEwNy45LDY4Ljc4LDY4Ljc4LDAsMCwxLDcxLjY4LDU4LjA4WiIvPjxwYXRoIGQ9Ik0yODcuOSwxNzYuNDJjLTMuMjItMTQuOTQtMTMuMzgtMjYuNjQtMjkuODYtMjYuNjRIMjM4Ljc5YTY4LjQ3LDY4LjQ3LDAsMCwxLDkuODIsMjMuNThsMTYuOTEsNjkuOSwxLDEuODRWMjQ3YTQ1LjI0LDQ1LjI0LDAsMCwxLTEuMSw5Ljc4aDUuNTJjMTYuNDksMCwyOS44Ny0xMS45MSwyOS44Ny0yNi42MloiLz48cGF0aCBkPSJNMjA1LjcxLDEwOS41MWEzNy43MSwzNy43MSwwLDEsMCwyOS4xNi02MS42MywzOS41NCwzOS41NCwwLDAsMC02Ljc3LjYyLDcwLjYsNzAuNiwwLDAsMSwuNzQsOS41OEE2OC44LDY4LjgsMCwwLDEsMjA1LjcxLDEwOS41MVoiLz48L3N2Zz4=)">
38
+ </td>
39
+ {% elif activity.type == 'Business Travel' %}
40
+ <td
41
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #8c00ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+Q29tcGFueSAtIEJ1c2luZXNzIHRyaXA8L3RpdGxlPjxwYXRoIGQ9Ik0tLjA2LDI1MS41NEEyNi40NywyNi40NywwLDAsMCwyNi40MSwyNzhIMjczLjU5YTI2LjQ3LDI2LjQ3LDAsMCwwLDI2LjQ3LTI2LjQ3di0yOEgtLjA2WiIvPjxwYXRoIGQ9Ik0yNzMuNTksODEuNTVoLTYyLjVBNjEuMDksNjEuMDksMCwwLDAsODksODEuNTVIMjYuNDFBMjYuNDgsMjYuNDgsMCwwLDAtLjA2LDEwOHY4Ny43NEgzMDAuMDZWMTA4QTI2LjQ4LDI2LjQ4LDAsMCwwLDI3My41OSw4MS41NVptLTE2MC41MSwwYTM3LDM3LDAsMCwxLDczLjg4LDBaIi8+PC9zdmc+)">
42
+ </td>
43
+ {% elif activity.type == 'Holiday' %}
44
+ <td
45
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #f700ff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+V2ViPC90aXRsZT48cGF0aCBkPSJNMzAwLDE1MGExNDkuNzgsMTQ5Ljc4LDAsMCwwLTM1LjY1LTk3LjA2bC4yNi0uMjdMMjQ5LjQ4LDM3LjJsLS4yOS4yOWExNTAsMTUwLDAsMCwwLTE5OC4zOSwwbC0uMjgtLjI5TDM1LjM4LDUyLjY3bC4yNy4yN2ExNDkuOTQsMTQ5Ljk0LDAsMCwwLS40MSwxOTMuNjNsLS4yNi4yN0w1MCwyNjIuMzhsLjI5LS4zQTE0OS4zOCwxNDkuMzgsMCwwLDAsMTQ5LjksMzAwaC4yYTE0OS4zOCwxNDkuMzgsMCwwLDAsOTkuNTctMzcuOTJsLjI5LjNMMjY1LDI0Ni44NGwtLjI2LS4yN0ExNDkuODEsMTQ5LjgxLDAsMCwwLDMwMCwxNTBaTTE1MCwyODB2MGgwbC0uMDYtMS42M2MtMTguODYsMC0zNi45NS0yMC00OC41Ny01My41N2wuODItLjMzLDEuMTgtLjQ3LDEuNzEtLjY0LDEuMTYtLjQzLDEuNzctLjYzLDEuMTEtLjM4LDEuOTMtLjYyLDEtLjMxYy43Ny0uMjQsMS41NC0uNDcsMi4zMi0uNjlsLjYxLS4xOGMxLS4yOCwyLS41NSwzLS44bC42LS4xNWMuNzktLjIsMS41OC0uMzksMi4zOC0uNTdsMS0uMjNjLjY1LS4xNCwxLjMtLjI5LDItLjQybDEuMTktLjI0LDEuODMtLjM0LDEtLjE4LjIzLDAsMS43OC0uMjksMS4zLS4yLDEuNzctLjI0LDEuMzItLjE2Yy42LS4wOCwxLjE5LS4xNCwxLjc4LS4ybDEuMzItLjE0LDEuODItLjE2LDEuMjktLjFjLjYzLS4wNSwxLjI2LS4wOCwxLjktLjEybDEuMjItLjA3LDIuMTEtLjA4LDEsMHEzLjE1LS4wNyw2LjMsMGwxLDAsMi4xMS4wOCwxLjIyLjA3Yy42NCwwLDEuMjcuMDcsMS45LjEybDEuMjkuMSwxLjgyLjE2LDEuMzEuMTRjLjYuMDYsMS4xOS4xMiwxLjc5LjJsMS4zMi4xNiwxLjc2LjI0LDEuMzEuMiwxLjc4LjI5LjIzLDAsMSwuMTgsMS44NC4zNCwxLjE5LjI0Yy42Ni4xMywxLjMxLjI4LDIsLjQybDEsLjIzYy43OS4xOCwxLjU5LjM3LDIuMzguNTdsLjYuMTVjMSwuMjUsMiwuNTIsMywuOGwuNjEuMThjLjc3LjIyLDEuNTUuNDUsMi4zMi42OWwxLC4zMSwxLjkyLjYyLDEuMTIuMzgsMS43Ny42MywxLjE2LjQzLDEuNzEuNjQsMS4xNy40Ny44My4zM0MxODcsMjU4LjMzLDE2OC45MiwyNzguMzIsMTUwLDI3OC4zNlYyODBabTgxLjYzLTE0NC42MWEyNTUuMTYsMjU1LjE2LDAsMCwwLTcuMjUtNDkuNzFsLjU5LS4zMywxLjczLTEsLjYyLS4zN2MuMjQtLjE0LjQ4LS4yOC43MS0uNDMsMS0uNjEsMi0xLjIzLDMtMS44N2wuNzYtLjUxYy43NS0uNDgsMS40OC0xLDIuMjItMS40N2wuNzYtLjUyLjM5LS4yOCwxLjgtMS4yNS45MS0uNjcuMzEtLjIzYy41Ni0uNCwxLjEyLS44MSwxLjY3LTEuMjMuMzctLjI3LjczLS41NSwxLjA5LS44M2wuMTctLjEzLDEuNi0xLjI0LDEuMjYtMUwyNDUuNTIsNzFsMS4yNS0xLDEuNTItMS4zLjU4LS41MWExMjcuMTcsMTI3LjE3LDAsMCwxLDI4LjY3LDY3LjI0Wm0uODktODEuNzItLjc5LjY2LS4yMS4xNy0xLjM4LDEuMTMtMSwuODMtMS4zOSwxLjA4LTEuMDYuOC0xLjQyLDEtMS4wNi43Ny0xLjU1LDEuMDgtMSwuNjctMS41NCwxLTEsLjY2LTEuMzEuODNhMTQ3LjYzLDE0Ny42MywwLDAsMC0xNi4yNy0zMi4wNSwxMjcuMTUsMTI3LjE1LDAsMCwxLDMyLjE2LDIwLjMyWk0yMTguMDksMjM0LjhjLjQ5LjMsMSwuNjEsMS40NS45MmwxLC42M2MuNTQuMzUsMS4wOC43MSwxLjYxLDEuMDhsMSwuNywxLjUyLDEuMDYsMSwuNzYsMS40NiwxLjA4LDEsLjc5LDEuNDMsMS4xMiwxLC44MSwxLjUsMS4yNC45Ljc1LDEuMjcsMS4xYTEyNy4xMiwxMjcuMTIsMCwwLDEtMzIuNzQsMjAuODJBMTQ4LDE0OCwwLDAsMCwyMTguMDksMjM0LjhabTE3LjY0LTE0LjI2LS41NS0uMzgtLjcyLS41Yy0uNzYtLjUyLTEuNTItMS0yLjI5LTEuNTNsLS43LS40N2MtMS0uNjUtMi0xLjI5LTMtMS45MWwtMS0uNmMtLjY5LS40Mi0xLjM4LS44NC0yLjA3LTEuMjRsLS43Ny0uNDRBMjYxLjEzLDI2MS4xMywwLDAsMCwyMzEuOTMsMTU3aDQ2LjI0YTEyNi43MSwxMjYuNzEsMCwwLDEtMjguODMsNzQuMjhsLS41NS0uNDhoMGMtLjUyLS40Ni0xLS45MS0xLjU2LTEuMzVsLTEuMjItMS0xLjU4LTEuMy0xLjI1LTEtMS42Ni0xLjMtMS4yLS45My0xLjctMS4yNi0uMzktLjI5LS44Mi0uNlpNODIuMiw2NC4zOWMtLjQ0LS4yNy0uODgtLjU0LTEuMzEtLjgybC0xLS42Ni0xLjU1LTEtMS0uNjYtLjA5LS4wNmMtLjUtLjM0LTEtLjY4LTEuNDgtMWwtMS0uNzUtMS40NC0xLjA2LTEtLjc5LTEuNDEtMS4wOS0xLS44MS0xLjQxLTEuMTUtLjA5LS4wOC0uODktLjczLTEuMTYtMUExMjcuMTUsMTI3LjE1LDAsMCwxLDk4LjQ3LDMyLjM1LDE0Ny43NywxNDcuNzcsMCwwLDAsODIuMiw2NC4zOVpNNTQuNDcsNzEsNTYsNzIuMjhsLjEzLjEsMS4xMi45LDEuNjEsMS4yNS4zMi4yNS45My43Yy40OC4zNiwxLC43MiwxLjQ1LDEuMDdsLjU3LjQyLjg3LjY0LDEuNjEsMS4xMy41OS40Ljc1LjUyYy43NS41MSwxLjUsMSwyLjI2LDEuNWwuNzIuNDhjMSwuNjQsMiwxLjI2LDMsMS44OGwuNzEuNDIuNDYuMjdMNzUsODUuMzRsLjU5LjMzYTI1NS44MSwyNTUuODEsMCwwLDAtNy4yNiw0OS43MUgyMi40NkExMjcuMTcsMTI3LjE3LDAsMCwxLDUxLjEzLDY4LjE0bC41Ny41TDUzLjI0LDcwWm0xMy42LDg2YTI2MC41MSwyNjAuNTEsMCwwLDAsNy4zMiw1Ni40NmwtLjc3LjQzLTIuMDcsMS4yNS0xLC42Yy0xLC42Mi0yLDEuMjYtMywxLjkxbC0uNy40N2MtLjc3LjUtMS41MywxLTIuMywxLjUzbC0xLjM3LDEtMS41NywxLjExLS44Mi42LS4zOS4yOWgwYy0uNTcuNDItMS4xNC44NC0xLjcsMS4yNy0uNDEuMy0uODEuNjEtMS4yNCwxbC0xLjYzLDEuMjctMS4yNCwxTDU0LDIyOC40MmwtMS4yMywxYy0uNTIuNDQtMSwuODktMS41NSwxLjM1bC0uNTUuNDhBMTI2Ljc4LDEyNi43OCwwLDAsMSwyMS44MiwxNTdaTTY3LDI0NS43NGwxLS44MiwxLjQyLTEuMTcsMS0uODFjLjQ3LS4zOCwxLS43NSwxLjQzLTEuMTJsMS0uNzlMNzQuMzQsMjQwbDEtLjc1LDEuNTItMS4wOCwxLS42OWMuNTMtLjM3LDEuMDctLjczLDEuNjEtMS4wOWwuMy0uMTkuNjUtLjQzYy40OC0uMzEsMS0uNjIsMS40NS0uOTJhMTQ4LDE0OCwwLDAsMCwxNi41NywzMi44NiwxMjcuMTIsMTI3LjEyLDAsMCwxLTMyLjc0LTIwLjgyQzY2LjE2LDI0Ni40Nyw2Ni41OCwyNDYuMSw2NywyNDUuNzRabTEyOC4xMy00NS4yLS42OC0uMjFjLTEuMTMtLjM1LTIuMjctLjY5LTMuNDEtMWwtLjg3LS4yNGMtLjg2LS4yMy0xLjczLS40Ny0yLjYtLjY5bC0uODctLjIyLS42My0uMTVjLS42Ni0uMTctMS4zMi0uMzMtMi0uNDhsLTEtLjIzLS40Ni0uMS0yLjA1LS40NC0xLjMzLS4yNi0uMjEsMC0yLS4zOGMtLjUzLS4xLTEuMDUtLjE5LTEuNTgtLjI3cy0xLjMzLS4yMy0yLS4zM2wtMS41OS0uMjQtMi0uMjgtMS41OS0uMi0yLS4yMy0uMjgsMC0xLjI5LS4xMy0yLjEtLjE4LS40LDAtMS4xNC0uMDktMi4yMS0uMTMtLjQyLDAtMS0uMDYtMi40NC0uMDktMS4yMywwYy0xLjIyLDAtMi40NSwwLTMuNjgsMHMtMi40NiwwLTMuNjgsMGwtMS4yMiwwLTIuNDUuMDktMSwuMDYtLjQyLDAtMi4yMi4xMy0xLjExLjA5LS40MiwwLTIuMS4xOC0xLjI5LjEzLS4yOSwwLTIsLjIzLTEuNTkuMi0yLC4yOC0xLjU4LjI0LTIsLjMyLTEuNTguMjgtMiwuMzgtLjIxLDAtMS4zMy4yNi0yLjA1LjQ0LS40NC4xLTEsLjIzLTIuMTYuNTItLjQ2LjExLS44Ny4yMmMtLjg3LjIyLTEuNzQuNDYtMi42LjY5bC0uODcuMjRjLTEuMTQuMzItMi4yOC42Ni0zLjQxLDFsLS42OC4yMS0uNDEuMTQtMi4zMS43NC0xLC4zNC0uNDkuMTctMS45Mi42Ny0xLjEuNDEtLjM1LjEzLTEuODcuNzFBMjQyLjIyLDI0Mi4yMiwwLDAsMSw4OS43MiwxNTdIMjEwLjI4YTI0Mi4yMiwyNDIuMjIsMCwwLDEtNS43Miw0Ni44NGwtMS44Ny0uNzEtLjM1LS4xMy0xLjEtLjQxLTItLjctLjQxLS4xNC0xLS4zNC0yLjMxLS43NFpNOTAsMTM1LjM4YTIzOC4zMSwyMzguMzEsMCwwLDEsNS42Mi00MC4xNGwuMSwwYy42MS4yNCwxLjIyLjQ2LDEuODQuNjlsLjQxLjE2LDEuMDcuMzksMS43My42MS43LjI0LjkzLjMyLDIuMjIuNzEuNDQuMTQuNzMuMjNjMS4xMi4zNSwyLjI0LjY4LDMuMzcsMWwxLC4yN2MuODIuMjIsMS42NC40NSwyLjQ2LjY1bC45My4yMy42MS4xNWMuNjQuMTYsMS4yOS4zMiwxLjkzLjQ2LjM2LjA5LjcyLjE3LDEuMDkuMjRsLjQuMDljLjY3LjE1LDEuMzQuMywyLC40M2wxLjM0LjI3LjIxLDAsMiwuMzcsMS41Ny4yNywyLC4zMiwxLjU5LjI0LDIsLjI3LDEuNTkuMiwyLjEzLjI0LDEuNDcuMTUsMi4wOC4xOC4zNSwwLDEuMTguMDksMi4xOS4xNC40NywwLDEsLjA2Yy44MSwwLDEuNjMuMDYsMi40NC4wOWwxLjIsMGMyLjQzLjA2LDQuODkuMDYsNy4zMiwwbDEuMiwwYy44MSwwLDEuNjMtLjA1LDIuNDQtLjA5bDEtLjA2LjQ3LDAsMi4xOS0uMTQsMS4xOC0uMDkuMzUsMCwyLjA4LS4xOCwxLjQ1LS4xNWguMTJsMi0uMjMsMS41OS0uMiwyLS4yNywxLjU5LS4yNCwyLS4zMiwxLjU3LS4yNywyLS4zNy4zNS0uMDcsMS4yLS4yNGMuNjctLjEzLDEuMzQtLjI4LDItLjQzbC4zNS0uMDcsMS4xNC0uMjUsMS45NC0uNDcuNjEtLjE1LjkyLS4yMmMuODItLjIxLDEuNjQtLjQ0LDIuNDYtLjY2bDEtLjI3YzEuMTMtLjMxLDIuMjUtLjY0LDMuMzgtMWwxLjE5LS4zOCwyLjE5LS43LjkxLS4zMS42Ny0uMjRjLjYtLjIsMS4xOS0uNCwxLjc4LS42MmwxLjExLS40MS41MS0uMTksMS43MS0uNjQuMDksMEEyMzkuMzMsMjM5LjMzLDAsMCwxLDIxMCwxMzUuMzhabTEwNy40Ni02MC43LTEuMTcuNDZjLS41Ni4yMi0xLjEyLjQzLTEuNjkuNjNsLTEuMTYuNDMtMS43NS42MS0uMzEuMTEtLjgxLjI3Yy0uNjIuMjEtMS4yNC40MS0xLjg3LjZsLTEsLjMzLTIuMTguNjQtLjczLjIxYy0xLC4yOC0yLC41NC0zLC43OWwtLjQuMWMtLjg1LjIxLTEuNzEuNDItMi41Ni42MWwtMSwuMjItMiwuNDMtMS4xNi4yMi0xLjg0LjM1LTEuMTQuMTktLjExLDAtMS43OC4yOS0xLjI4LjE5cS0uODguMTQtMS43Ny4yNGwtMS4zLjE3LTEuNzguMTktMS4zLjE0LTEuOC4xNS0xLjI5LjEtMS44OC4xMi0xLjIyLjA3LTIuMDguMDgtMSwwYy0yLjA4LDAtNC4xNywwLTYuMjQsMGwtMSwwLTIuMDgtLjA4LTEuMjItLjA3Yy0uNjMsMC0xLjI1LS4wNy0xLjg4LS4xMmwtMS4yOS0uMS0xLjgtLjE1TDEzNi40LDgzbC0uMTIsMC0xLjc4LS4xOS0xLjMtLjE3Yy0uNTktLjA3LTEuMTgtLjE1LTEuNzYtLjI0bC0xLjI5LS4xOS0xLjc4LS4yOS0xLjI2LS4yMS0xLjgyLS4zNS0xLjE4LS4yMi0yLS40My0xLS4yMmMtLjg1LS4xOS0xLjctLjQtMi41NS0uNjFsLS40MS0uMWMtMS0uMjUtMi0uNTEtMy0uNzlsLS43My0uMjEtMi4xOC0uNjQtMS0uMzNxLS45My0uMjktMS44Ni0uNmwtMS4xMi0uMzgtMS43NS0uNjEtMS4xNi0uNDNjLS41Ny0uMi0xLjEzLS40MS0xLjY5LS42M2wtMS4xNy0uNDYtLjg0LS4zNGMxMS42NC0zMywyOS42NC01Mi43LDQ4LjMzLTUyLjdzMzYuNjksMTkuNjYsNDguMzMsNTIuN1oiLz48L3N2Zz4=)">
46
+ </td>
47
+ {% elif activity.type == 'Lunch' %}
48
+ <td
49
+ style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #00ccff; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMDAgMzAwIj48dGl0bGU+THVuY2g8L3RpdGxlPjxwYXRoIGQ9Ik0yMzMuNjEsMTM4LjYyYzEyLjg4LTEyLjg5LDMxLjg3LTUzLjgzLDE5LTY2LjcybC0uMDgtLjA3LS4wNS0uMDYtLjM1LS4zMi0uMTktLjE2YTEyLjUxLDEyLjUxLDAsMCwwLTUuMi0yLjc5Yy0xNi44Ni01LjM1LTUxLjEyLDkuNDYtNjIuNDUsMjAuNzktMTAuMzcsMTAuMzctMTUuODQsMjYuNjItOC42NCw0MS41MWwtMjAuNzcsMjAuNzctMjEuMzktMjEuMzljNC42OS0xMi4zNi4xMS0yNi42NS0xMy40Mi00MC4xOUw4OCw1OGE2LjI5LDYuMjksMCwwLDAtOC44OSw4Ljg5bDMyLDMyLC44OC45LTkuNTksOS41OUw2OS41Myw3Ni40N2E2LjI5LDYuMjksMCwwLDAtOC44OSw4LjlsMzIuOTEsMzIuOTFMODQsMTI3Ljg3bC0uOS0uODhMNTEsOTVhNi4yOSw2LjI5LDAsMSwwLTguOSw4LjlsMzIsMzJjMTQuMjMsMTQuMjMsMjkuMjgsMTguNTUsNDIuMDcsMTIuNjNsMjAuODUsMjAuODQtNTMsNTNhMTIuNTgsMTIuNTgsMCwxLDAsMTcuOCwxNy43OWw1My01Myw1Mi42Miw1Mi42MUExMi41OCwxMi41OCwwLDAsMCwyMjUuMjgsMjIybC01Mi42Mi01Mi42MiwyMS40NS0yMS40NUMyMDcuMTcsMTUyLjMxLDIyMy43OSwxNDguNDMsMjMzLjYxLDEzOC42MlptLTEyOS4yMS0uMDYuOTQtLjk0LjgyLjgzQTE0LjcyLDE0LjcyLDAsMCwxLDEwNC40LDEzOC41NloiLz48L3N2Zz4=)">
50
+ </td>
51
+ {% else %}
52
+ <td style="border-top-left-radius: 25px; border-bottom-left-radius: 25px; background-color: #51ff00;"></td>
53
+ {% endif %}
54
+ <td style="background-color: #eaf2ff; padding: 15px 10px; text-align: left; font-size: 14px;">
55
+ <strong>{{ activity.title }}</strong>
56
+ </td>
57
+ <td
58
+ style="background-color: #eaf2ff; padding: 10px 0px; text-align: center; font-size: 12px; line-height: 10px;">
59
+ <strong>{{ activity.start|date:'H:i' }} - {{ activity.end|date:'H:i' }}</strong>
60
+ </td>
61
+ <td
62
+ style="border-top-right-radius: 25px; border-bottom-right-radius: 25px; background-color: #f7c145; background-repeat: no-repeat; background-position: center; background-size: 40%; background-image: url(data:image/svg+xml;base64,PCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiB2aWV3Qm94PSIwIDAgMzIgMzIiPgo8dGl0bGU+YXJyb3ctcmlnaHQyPC90aXRsZT4KPHBhdGggZD0iTTE5LjQxNCAyNy40MTRsMTAtMTBjMC43ODEtMC43ODEgMC43ODEtMi4wNDcgMC0yLjgyOGwtMTAtMTBjLTAuNzgxLTAuNzgxLTIuMDQ3LTAuNzgxLTIuODI4IDBzLTAuNzgxIDIuMDQ3IDAgMi44MjhsNi41ODYgNi41ODZoLTE5LjE3MmMtMS4xMDUgMC0yIDAuODk1LTIgMnMwLjg5NSAyIDIgMmgxOS4xNzJsLTYuNTg2IDYuNTg2Yy0wLjM5IDAuMzktMC41ODYgMC45MDItMC41ODYgMS40MTRzMC4xOTUgMS4wMjQgMC41ODYgMS40MTRjMC43ODEgMC43ODEgMi4wNDcgMC43ODEgMi44MjggMHoiPjwvcGF0aD4KPC9zdmc+Cg==)">
63
+ <a href="{{ activity.endpoint }}" target="_blank" style="padding: 25px; display: inline-block;">
64
+ </a>
65
+ </td>
66
+ </tr>
67
+ <tr style="margin-bottom: 4px;">
68
+ <td colspan="5">
69
+ </td>
70
+ </tr>
71
+ {% endfor %}
72
+ </table>