parent
							
								
									d6ebd86232
								
							
						
					
					
						commit
						73d8f7eb47
					
				| 
						 | 
				
			
			@ -37,7 +37,7 @@ from . import (
 | 
			
		|||
    uk_tz,
 | 
			
		||||
    waste_schedule,
 | 
			
		||||
)
 | 
			
		||||
from .types import Event, StrDict
 | 
			
		||||
from .types import Event, StrDict, Trip
 | 
			
		||||
 | 
			
		||||
here = dateutil.tz.tzlocal()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -144,10 +144,14 @@ def get_yaml_event_end_date_field(item: dict[str, str]) -> str:
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def read_events_yaml(data_dir: str, start: date, end: date) -> list[Event]:
 | 
			
		||||
def read_events_yaml(
 | 
			
		||||
    data_dir: str, start: date, end: date, skip_trips: bool = False
 | 
			
		||||
) -> list[Event]:
 | 
			
		||||
    """Read eventes from YAML file."""
 | 
			
		||||
    events: list[Event] = []
 | 
			
		||||
    for item in yaml.safe_load(open(os.path.join(data_dir, "events.yaml"))):
 | 
			
		||||
        if "trip" in item and skip_trips:
 | 
			
		||||
            continue
 | 
			
		||||
        duration = (
 | 
			
		||||
            isodate.parse_duration(item["duration"]) if "duration" in item else None
 | 
			
		||||
        )
 | 
			
		||||
| 
						 | 
				
			
			@ -247,10 +251,10 @@ def busy_event(e: Event) -> bool:
 | 
			
		|||
        "event",
 | 
			
		||||
        "accommodation",
 | 
			
		||||
        "conference",
 | 
			
		||||
        "dodainville",
 | 
			
		||||
        "transport",
 | 
			
		||||
        "meetup",
 | 
			
		||||
        "party",
 | 
			
		||||
        "trip",
 | 
			
		||||
    }:
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -281,6 +285,40 @@ async def time_function(
 | 
			
		|||
    return name, result, end_time - start_time
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gap_list(
 | 
			
		||||
    today: date, config: flask.config.Config, trips: list[Trip]
 | 
			
		||||
) -> list[StrDict]:
 | 
			
		||||
    last_year = today - timedelta(days=365)
 | 
			
		||||
    next_year = today + timedelta(days=2 * 365)
 | 
			
		||||
 | 
			
		||||
    my_data = config["PERSONAL_DATA"]
 | 
			
		||||
    events = read_events_yaml(my_data, last_year, next_year, skip_trips=True)
 | 
			
		||||
 | 
			
		||||
    for trip in trips:
 | 
			
		||||
        event_type = "trip"
 | 
			
		||||
        if trip.events and not trip.conferences:
 | 
			
		||||
            event_type = trip.events[0]["name"]
 | 
			
		||||
        elif len(trip.conferences) == 1 and trip.conferences[0].get("hackathon"):
 | 
			
		||||
            event_type = "hackathon"
 | 
			
		||||
        events.append(
 | 
			
		||||
            Event(
 | 
			
		||||
                name=event_type,
 | 
			
		||||
                title=trip.title + " " + trip.country_flags,
 | 
			
		||||
                date=trip.start,
 | 
			
		||||
                end_date=trip.end,
 | 
			
		||||
                url=flask.url_for("trip_page", start=trip.start.isoformat()),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    busy_events = [
 | 
			
		||||
        e
 | 
			
		||||
        for e in sorted(events, key=lambda e: e.as_date)
 | 
			
		||||
        if e.as_date > today and e.as_date < next_year and busy_event(e)
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    return find_gaps(busy_events)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def get_data(
 | 
			
		||||
    now: datetime, config: flask.config.Config
 | 
			
		||||
) -> typing.Mapping[str, str | object]:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,11 +17,31 @@
 | 
			
		|||
    <tbody>
 | 
			
		||||
    {% for gap in gaps %}
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td>{% for event in gap.before %}{% if not loop.first %}<br/>{% endif %}<span class="text-nowrap">{{ event.title or event.name }}</span>{% endfor %}</td>
 | 
			
		||||
      <td class="text-start">
 | 
			
		||||
        {% for event in gap.before %}
 | 
			
		||||
          <div class="text-nowrap">
 | 
			
		||||
            {% if event.url %}
 | 
			
		||||
              <a href="{{event.url}}">{{ event.title_with_emoji }}</a>
 | 
			
		||||
            {% else %}
 | 
			
		||||
              {{ event.title_with_emoji }}
 | 
			
		||||
            {% endif %}
 | 
			
		||||
          </div>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
      </td>
 | 
			
		||||
      <td class="text-end text-nowrap">{{ gap.start.strftime("%A, %-d %b %Y") }}</td>
 | 
			
		||||
      <td class="text-end text-nowrap">{{ (gap.end - gap.start).days }} days</td>
 | 
			
		||||
      <td class="text-end text-nowrap">{{ gap.end.strftime("%A, %-d %b %Y") }}</td>
 | 
			
		||||
      <td>{% for event in gap.after %}{% if not loop.first %}<br/>{% endif %}<span class="text-nowrap">{{ event.title or event.name }}</span>{% endfor %}</td>
 | 
			
		||||
      <td class="text-start">
 | 
			
		||||
        {% for event in gap.after %}
 | 
			
		||||
          <div class="text-nowrap">
 | 
			
		||||
            {% if event.url %}
 | 
			
		||||
              <a href="{{event.url}}">{{ event.title_with_emoji }}</a>
 | 
			
		||||
            {% else %}
 | 
			
		||||
              {{ event.title_with_emoji }}
 | 
			
		||||
            {% endif %}
 | 
			
		||||
          </div>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
      </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    </tbody>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,8 +86,9 @@ def launch_list() -> str:
 | 
			
		|||
async def gaps_page() -> str:
 | 
			
		||||
    """List of available gaps."""
 | 
			
		||||
    now = datetime.now()
 | 
			
		||||
    data = await agenda.data.get_data(now, app.config)
 | 
			
		||||
    return flask.render_template("gaps.html", today=now.date(), gaps=data["gaps"])
 | 
			
		||||
    trip_list = agenda.trip.build_trip_list()
 | 
			
		||||
    gaps = agenda.data.gap_list(now.date(), app.config, trip_list)
 | 
			
		||||
    return flask.render_template("gaps.html", today=now.date(), gaps=gaps)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/travel")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue