196 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
{# vim: set ft=htmljinja
 | 
						|
#}
 | 
						|
<!doctype html>
 | 
						|
<html lang="en">
 | 
						|
<head>
 | 
						|
  <meta charset="utf-8">
 | 
						|
  <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
						|
  <title>Agenda</title>
 | 
						|
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
 | 
						|
  <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>📅</text></svg>">
 | 
						|
 | 
						|
    <script type='importmap'>
 | 
						|
      {
 | 
						|
        "imports": {
 | 
						|
          "@fullcalendar/core": "https://cdn.skypack.dev/@fullcalendar/core@6.1.9",
 | 
						|
          "@fullcalendar/daygrid": "https://cdn.skypack.dev/@fullcalendar/daygrid@6.1.9",
 | 
						|
          "@fullcalendar/timegrid": "https://cdn.skypack.dev/@fullcalendar/timegrid@6.1.9",
 | 
						|
          "@fullcalendar/list": "https://cdn.skypack.dev/@fullcalendar/list@6.1.9",
 | 
						|
          "@fullcalendar/core/locales/en-gb": "https://cdn.skypack.dev/@fullcalendar/core@6.1.9/locales/en-gb"
 | 
						|
        }
 | 
						|
      }
 | 
						|
    </script>
 | 
						|
    <script type='module'>
 | 
						|
      import { Calendar } from '@fullcalendar/core'
 | 
						|
      import dayGridPlugin from '@fullcalendar/daygrid'
 | 
						|
      import timeGridPlugin from '@fullcalendar/timegrid'
 | 
						|
      import listPlugin from '@fullcalendar/list'
 | 
						|
      import gbLocale from '@fullcalendar/core/locales/en-gb';
 | 
						|
 | 
						|
      document.addEventListener('DOMContentLoaded', function() {
 | 
						|
        const calendarEl = document.getElementById('calendar')
 | 
						|
        const calendar = new Calendar(calendarEl, {
 | 
						|
          locale: gbLocale,
 | 
						|
          plugins: [dayGridPlugin, timeGridPlugin, listPlugin ],
 | 
						|
          themeSystem: 'bootstrap5',
 | 
						|
          firstDay: 1,
 | 
						|
          initialView: 'dayGridMonth',
 | 
						|
          headerToolbar: {
 | 
						|
            left: 'prev,next today',
 | 
						|
            center: 'title',
 | 
						|
            right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
 | 
						|
          },
 | 
						|
          nowIndicator: true,
 | 
						|
          weekNumbers: true,
 | 
						|
          eventTimeFormat: {
 | 
						|
            hour: '2-digit',
 | 
						|
            minute: '2-digit',
 | 
						|
            hour12: false,
 | 
						|
          },
 | 
						|
          events: {{ fullcalendar_events | tojson(indent=2) }},
 | 
						|
          eventDidMount: function(info) {
 | 
						|
            info.el.title = info.event.title;
 | 
						|
          },
 | 
						|
        })
 | 
						|
        calendar.render()
 | 
						|
      })
 | 
						|
    </script>
 | 
						|
 | 
						|
</head>
 | 
						|
 | 
						|
{% set event_labels = {
 | 
						|
  "economist": "📰 The Economist",
 | 
						|
  "mothers_day": "Mothers' day",
 | 
						|
  "fathers_day": "Fathers' day",
 | 
						|
  "uk_financial_year_end": "End of financial year",
 | 
						|
  "bank_holiday": "UK bank holiday",
 | 
						|
  "us_holiday": "US holiday",
 | 
						|
  "uk_clock_change": "UK clock change",
 | 
						|
  "us_clock_change": "US clock change",
 | 
						|
  "us_presidential_election": "US pres. election",
 | 
						|
  "xmas_last_second": "Christmas last posting 2nd class",
 | 
						|
  "xmas_last_first": "Christmas last posting 1st class",
 | 
						|
  "up_series": "Up documentary",
 | 
						|
  "waste_schedule": "Waste schedule",
 | 
						|
  "gwr_advance_tickets": "GWR advance tickets",
 | 
						|
  "critical_mass": "Critical Mass",
 | 
						|
}
 | 
						|
%}
 | 
						|
 | 
						|
{%set class_map = {
 | 
						|
  "bank_holiday": "bg-success-subtle",
 | 
						|
  "conference": "bg-primary-subtle",
 | 
						|
  "us_holiday": "bg-secondary-subtle",
 | 
						|
  "birthday": "bg-info-subtle",
 | 
						|
  "waste_schedule": "bg-danger-subtle",
 | 
						|
} %}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
<body>
 | 
						|
 | 
						|
  <div class="container-fluid mt-2">
 | 
						|
    <h1>Agenda</h1>
 | 
						|
    <p>
 | 
						|
      <a href="/tools">← personal tools</a>
 | 
						|
      |
 | 
						|
      <a href="{{ url_for("travel_list") }}">travel</a>
 | 
						|
      |
 | 
						|
      <a href="{{ url_for("conference_list") }}">conference</a>
 | 
						|
    </p>
 | 
						|
 | 
						|
    <ul>
 | 
						|
    <li>Today is {{now.strftime("%A, %-d %b %Y")}}</li>
 | 
						|
    {% if gbpusd %}
 | 
						|
      <li>GBPUSD: {{"{:,.3f}".format(gbpusd)}}</li>
 | 
						|
    {% endif %}
 | 
						|
    <li>GWR advance ticket furthest date:
 | 
						|
      {% if gwr_advance_tickets %}
 | 
						|
        {{ gwr_advance_tickets.strftime("%A, %-d %b %Y") }}
 | 
						|
      {% else %}
 | 
						|
        unknown
 | 
						|
      {% endif %}
 | 
						|
    </li>
 | 
						|
    <li>Bristol Sunrise: {{ sunrise.strftime("%H:%M:%S") }} /
 | 
						|
    Sunset: {{ sunset.strftime("%H:%M:%S") }}</li>
 | 
						|
    </ul>
 | 
						|
 | 
						|
  <h3>Stock markets</h3>
 | 
						|
  {% for market in stock_markets %}
 | 
						|
    <p>{{ market }}</p>
 | 
						|
  {% endfor %}
 | 
						|
 | 
						|
  <div class="mb-3" id="calendar"></div>
 | 
						|
 | 
						|
  <h3>Agenda</h3>
 | 
						|
 | 
						|
  {% for event in events if event.as_date >= two_weeks_ago %}
 | 
						|
  {% if loop.first or event.date.year != loop.previtem.date.year %}
 | 
						|
  <div class="row mt-2">
 | 
						|
    <div class="col">
 | 
						|
      <h5>{{ event.date.year }}</h5>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
  {% endif %}
 | 
						|
  <div class="row border border-1 {% if event.name in class_map %} {{ class_map[event.name]}}{% endif %}">
 | 
						|
    <div class="col-md-3">
 | 
						|
      {{event.as_date.strftime("%a, %d, %b")}}
 | 
						|
       
 | 
						|
       
 | 
						|
      {{event.display_time or ""}}
 | 
						|
       
 | 
						|
       
 | 
						|
      {{event.display_timezone or ""}}
 | 
						|
    </div>
 | 
						|
 | 
						|
    <div class="col-md-8 text-start">
 | 
						|
      {% if event.url %}<a href="{{ event.url }}">{% endif %}
 | 
						|
    {{ event_labels.get(event.name) or event.name }}
 | 
						|
    {%- if event.title -%}: {{ event.title }}{% endif %}
 | 
						|
    {% if event.url %}</a>{% endif %}
 | 
						|
    </div>
 | 
						|
    <div class="col-md-1">
 | 
						|
    {{ event.delta_days(today) }}
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
  {% endfor %}
 | 
						|
 | 
						|
  <h3>Space launches</h3>
 | 
						|
  {% for launch in rockets %}
 | 
						|
    <div class="row">
 | 
						|
      <div class="col-md-1 text-nowrap text-md-end">{{ launch.t0_date }}
 | 
						|
 | 
						|
        {% if launch.t0_time %}<br class="d-none d-md-block"/>{{ launch.t0_time }}{% endif %}</div>
 | 
						|
      <div class="col-md-1 text-md-nowrap">
 | 
						|
        <span class="d-md-none">launch status:</span>
 | 
						|
        <abbr title="{{ launch.status.name }}">{{ launch.status.abbrev }}</abbr>
 | 
						|
      </div>
 | 
						|
      <div class="col">{{ launch.rocket }}
 | 
						|
        –
 | 
						|
        <strong>{{launch.mission.name }}</strong>
 | 
						|
        –
 | 
						|
 | 
						|
        {% if launch.launch_provider_abbrev %}
 | 
						|
        <abbr title="{{ launch.launch_provider }}">{{ launch.launch_provider_abbrev }}</abbr>
 | 
						|
        {% else %}
 | 
						|
        {{ launch.launch_provider }}
 | 
						|
        {% endif %}
 | 
						|
        ({{ launch.launch_provider_type }})
 | 
						|
        —
 | 
						|
        {{ launch.orbit.name }} ({{ launch.orbit.abbrev }})
 | 
						|
        <br/>
 | 
						|
        <a href="{{ launch.pad_wikipedia_url }}">{{ launch.pad_name }}</a>
 | 
						|
        — {{ launch.location }}<br/>
 | 
						|
 | 
						|
        {% for line in launch.mission.description.splitlines() %}
 | 
						|
          <p>{{ line }}</p>
 | 
						|
        {% endfor %}
 | 
						|
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  {% endfor %}
 | 
						|
  </div>
 | 
						|
 | 
						|
</body>
 | 
						|
</html>
 |