summaryrefslogtreecommitdiff
path: root/meetingindex.jinja
blob: a656f0e41bc76cedb1c6270f770a1ba7da32b551 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<style>
h2,h3 {margin-top: 30px;}
.masterheader {position:relative;padding:15px 30px;color:white;background-color:#760000;}
.meeting_index ul { height: auto; width:100%; }
.meeting_index ul li { display: block; }
@media(min-width: 480px){
  .meeting_index ul{-webkit-column-count:1;-moz-column-count:1;column-count:1;}
}
@media(min-width: 768px){
  .meeting_index ul{-webkit-column-count:2;-moz-column-count:2;column-count:2;}
}
@media(min-width: 992px){
  .meeting_index ul{-webkit-column-count:3;-moz-column-count:3;column-count:3;}
}
@media(min-width: 1150px){
  .meeting_index ul{-webkit-column-count:4;-moz-column-count:4;column-count:4;}
}
</style>
<title>OpenStack IRC channels and meetings</title>
</head>
<body>
<div class="masterheader">
  <h1>OpenStack IRC channels and meetings</h1>
</div>
<div class="container">

 <a id="channels"></a>
 <h2>IRC channels</h2>
 <p>OpenStack maintains a large number of channels on the Freenode IRC network for community communications. You can learn more about IRC in the <a href="https://docs.openstack.org/contributors/common/irc.html">Contributor Guide</a>.</p>
 <p>The main channels are:</p>
 <ul>
  <li><a href="https://webchat.freenode.net/?channels=openstack">#openstack</a> (for usage questions)</li>
  <li><a href="https://webchat.freenode.net/?channels=openstack-dev">#openstack-dev (for development questions)</a></li>
  <li><a href="https://webchat.freenode.net/?channels=openstack-infra">#openstack-infra</a> (for questions about the project infrastructure)</li>
 </ul>
 <p>OpenStack IRC channels and logged. You can find all channels and all logs here:</p>
<div class="well"><span class="glyphicon glyphicon-fast-backward"></span>&nbsp;
<a href="irclogs/">IRC Channel Logs</a></div>
 <p>Links to specific meeting logs can be found on meeting descriptions below.</p>

 <a id="meetings"></a>
 <h2>IRC meetings schedule</h2>
 <p>The IRC meetings schedule is driven by the
<a href=http://git.openstack.org/cgit/openstack-infra/irc-meetings/tree/>openstack-infra/irc-meetings</a> repository.
To propose a change, please submit a change to that repository in Gerrit.</p>
 <p>Here is the link to an ICS file containing all OpenStack IRC meetings, for
use in your favorite calendaring app:</p>
<div class="well"><span class="glyphicon glyphicon-download"></span>&nbsp;
<a href="irc-meetings.ical">iCalendar Complete Meeting Schedule</a>
</div>
 <h2>Meeting details</h2>
  <small>
  <div class="meeting_index">
  <ul>
  {% for meeting in meetings|sort(attribute='project') %}
    <li><a href="#{{ meeting.project|replace(' ', '_') }}">{{ meeting.project }}</a></li>
  {% endfor %}
  </ul>
  </div>
  </small>

{% for meeting in meetings|sort(attribute='project') %}
 <a id="{{ meeting.project|replace(' ', '_') }}"></a>
 <h3>{{ meeting.project }}</h3>
 <div class="panel panel-default">
  <div class="panel-heading"><small>{{ meeting.description|urlize }}</small>
  </div>
  <div class="panel-body">
{% for schedule in meeting.schedules %}
   <div><span class="glyphicon glyphicon-time"></span>&nbsp;
{{ schedule.recurrence }} on {{ schedule.day }} at
<a data-toggle="tooltip" data-placement="top" title="NotFilledInYet" utctime="{{schedule.utc}}" weekday="{{schedule.day}}"
    href="http://www.timeanddate.com/worldclock/fixedtime.html?hour={{ schedule.utc[:2] }}&amp;min={{ schedule.utc[2:] }}&amp;sec=0" 
    class="timelink">
        {{ schedule.utc }} UTC
</a>
in <a href="ircs://irc.freenode.net:6697/{{ schedule.irc }}">#{{ schedule.irc }}</a>
(IRC <a href="https://webchat.freenode.net/?randomnick=1&channels=%23{{ schedule.irc }}&prompt=1&uio=d4">webclient</a>)
   </div>
{% endfor %}
   <div><span class="glyphicon glyphicon-calendar"></span>&nbsp;
<a href="calendars/{{ meeting.outfile }}">ICS file</a> for this specific
meeting</div>
   <div><span class="glyphicon glyphicon-user"></span>&nbsp;
Chair (to contact for more information): {{ meeting.chair }}</div>
{% if meeting.extras.meeting_id %}
   <div><span class="glyphicon glyphicon-fast-backward"></span>&nbsp;
Logs from <a href="http://eavesdrop.openstack.org/meetings/{{meeting.extras.meeting_id|replace('-', '_')}}/">past meetings</a></div>
   <div><span class="glyphicon glyphicon-tags"></span>&nbsp;
       Start this meeting using: <tt>#startmeeting {{meeting.extras.meeting_id|replace('-', '_')}}</tt>
   </div>
{% endif %}
{% if meeting.extras.agenda_url %}
   <div><span class="glyphicon glyphicon-list-alt"></span>&nbsp;
<a href="{{meeting.extras.agenda_url}}">Agenda</a> for next meeting</div>
{% endif %}
  </div>
 </div>
{% endfor %}
 <small>Page generated on {{ timestamp }} UTC</small>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script>
function setTimeTooltips() {
    var timelinks = [].slice.call(document.getElementsByClassName('timelink'));
    for (var i in timelinks) {
        var link = timelinks[i];
        var local_date = new Date();
        var local_zone_name = local_date.toLocaleString('en', {timeZoneName:'short'}).split(' ').pop();
        var offset = local_date.getTimezoneOffset() / 60 * 100;
        var utc_meeting_time = link.getAttribute('utctime');
        var local_meeting_time = parseInt(utc_meeting_time) - offset;
        var day_offset = 0;
        if (local_meeting_time < 0) {
            day_offset = -1;
            local_meeting_time += 2400;
        } else if (local_meeting_time > 2400) {
            day_offset = 1;
            local_meeting_time -= 2400;
        }
        local_meeting_time = checkUTC4DigitString(String(local_meeting_time));
        var weekday = link.getAttribute('weekday');
        weekday = moveWeekday(weekday, day_offset);
        weekday = toTitleCase(weekday);
        link.title = weekday + ' at ' + local_meeting_time + ' ' + local_zone_name;
    }
}
function toTitleCase(str) {
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
function checkUTC4DigitString(s) { // turns '100' into '0100'
    return repeat('0', 4 - s.length) + s;
}
function repeat(s, n){
    var a = [];
    while(a.length < n){
        a.push(s);
    }
    return a.join('');
}
function moveWeekday(day, offset) {
    var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
    var i = days.indexOf(day.toLowerCase());
    i += offset;
    if (i < 0)
        i += 7;
    else if (i > 6)
        i -= 7;
    return days[i];
}
$(document).ready(function(){
    setTimeTooltips()
    $('[data-toggle="tooltip"]').tooltip();
});
</script>
</body>
</html>