zeus.ugent.be/lib/helpers/preprocess.rb

150 lines
4.5 KiB
Ruby
Raw Permalink Normal View History

2016-12-11 00:55:11 +01:00
module PreprocessHelper
2018-03-01 16:33:12 +01:00
def required_attrs
{
2020-01-13 14:09:04 +01:00
event: {
time: 'An event item should include the :time attribute, which describes the begin time and date of the event.',
title: 'The event does not include a :title',
location: 'The event should include a :location, a textual description',
},
2020-01-13 09:47:22 +01:00
privacy: {
status: 'A privacy item must include the status of the project'
}
2018-03-01 16:33:12 +01:00
}
end
def predefined_locations
{
'$kelder' => 'Zeus WPI, Gent',
'$s9' => 'S9, Gent',
'$therminal' => 'De Therminal, Gent'
}
end
def allowed_privacy_status
2019-12-10 23:09:15 +01:00
%w(additional general processor development)
end
2018-03-01 16:33:12 +01:00
def check_schema(itemtype, item)
schema = required_attrs[itemtype]
(schema.keys - item.attributes.keys).each do |key|
raise "#{item.identifier}: #{schema[key]}"
end
2019-12-10 23:09:15 +01:00
if itemtype == :privacy && !allowed_privacy_status.include?(item.attributes[:status])
raise "status must be one of #{allowed_privacy_status}, got #{item.attributes[:status]} on #{item[:filename]}"
end
2018-03-01 16:33:12 +01:00
end
def ignore_old_content(*paths)
2018-07-11 20:35:06 +02:00
paths.each do |path|
2018-07-15 18:23:52 +02:00
years_with_content = @items.find_all("/#{path}/**/*").map { |it| it.identifier.to_s.match(%r{/(\d\d-\d\d)/})[1] }
latest_years_with_content = years_with_content.last(2)
2018-07-11 20:35:06 +02:00
2018-07-15 18:23:52 +02:00
latest_years = latest_years_with_content + [@config[:academic_year]]
2018-07-11 20:35:06 +02:00
@items.delete_if do |item|
next unless item.identifier.match?(%r{^/#{path}/})
year = item.identifier.to_s.match(%r{/(\d\d-\d\d)/})[1]
2018-07-15 19:20:36 +02:00
!latest_years.include?(year)
2018-07-11 20:35:06 +02:00
end
2016-12-11 00:55:11 +01:00
end
end
def update_blog_attributes
2018-03-10 11:14:36 +01:00
@items.find_all('/blog/**/*.md').each do |i|
2017-05-03 23:08:15 +02:00
raise "#{i.identifier} doesn't have 'created_at'" unless i[:created_at]
2017-02-09 02:37:43 +01:00
i.update_attributes(
2016-12-11 00:55:11 +01:00
# Tag all posts with article (for Blogging helper)
kind: 'article',
2020-10-12 19:40:15 +02:00
academic_year: i.identifier.to_s[/\d-\d/],
2017-02-09 02:31:56 +01:00
created_at: Date.parse(i[:created_at])
2017-02-09 02:37:43 +01:00
)
2016-12-11 00:55:11 +01:00
end
end
def create_yearly_items(type)
type = type.to_s
years = @items.find_all("/#{type.downcase}/*/*")
.map { |i| i.identifier.to_s[/\d\d-\d\d/] }
.push(@config[:academic_year])
.uniq
years.each do |year|
2016-12-11 00:55:11 +01:00
@items.create(
'',
2020-10-12 19:40:15 +02:00
{ academic_year: year, title: type, is_yearly: true },
"/#{type.downcase}/#{year}.html"
2016-12-11 00:55:11 +01:00
)
end
2017-06-14 09:09:37 +02:00
cur_year_item = @items["/#{type.downcase}/#{@config[:academic_year]}.html"] || @items["/#{type.downcase}/#{years[-1]}.html"]
cur_year_item.update_attributes(
2016-12-11 00:55:11 +01:00
navigable: true,
order: 10
)
end
2020-10-12 19:40:15 +02:00
def create_tagly_items(type)
type = type.to_s
tags = @items.find_all("/#{type.downcase}/*/*")
.flat_map { |i| i[:tags] || [] }
.uniq
tags.each do |tag|
@items.create(
'',
{ tag: tag, title: type, is_yearly: false },
2020-10-13 12:01:47 +02:00
"/#{type.downcase}/#{tag.gsub(' ', '_')}.html"
2020-10-12 19:40:15 +02:00
)
end
end
2016-12-11 00:55:11 +01:00
def convert_event_time_to_timestamps
2017-10-03 14:07:39 +02:00
@items.find_all('/events/*/*.md').each do |event|
# HACK: Strings in a format like "2017-10-05T20:45:00+0200" automatically get converted to Time
event[:time] = event[:time].to_s
2016-12-11 00:55:11 +01:00
event[:time] = DateTime.parse(event[:time])
2017-10-03 14:07:39 +02:00
event[:end] = event[:end].to_s if event[:end]
2017-02-08 17:05:48 +01:00
event[:end] = DateTime.parse(event[:end]) if event[:end]
2016-12-11 00:55:11 +01:00
end
end
2018-02-25 20:29:35 +01:00
def convert_locations
@items.find_all('/events/*/*.md').each do |event|
location_link = event[:locationlink]&.downcase&.strip
if location_link&.start_with?('$') && !predefined_locations.key?(location_link)
raise "unknown location variable #{location_link}, must be one of #{predefined_locations.keys}"
end
event[:locationlink] = predefined_locations.fetch(location_link, event[:locationlink])
end
end
2018-02-25 20:29:35 +01:00
def add_report_metadata
@items.find_all('/about/verslagen/*/*').each do |report|
report[:academic_year] = report.identifier.to_s.split('/')[-2]
report[:date] = Date.strptime(report.identifier.without_ext.split('/').last)
end
end
def update_project_item(projects, project)
id = project.identifier.without_ext.split('/')[-1]
if projects.key?(id.to_sym)
projects[id.to_sym].each do |key, value|
project[key] = value
end
project[:id] = id
end
end
def add_project_metadata
projects = data_from(:projecten)
2019-12-10 21:34:33 +01:00
all_privacy_items.each do |project|
update_project_item(projects, project)
end
2019-12-10 21:34:33 +01:00
all_project_items.each do |project|
update_project_item(projects, project)
end
end
2016-12-11 00:55:11 +01:00
end