OpenStack IRC meetings schedule
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

meetingindex.jinja 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
  5. <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
  6. <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
  7. <style>
  8. h2,h3 {margin-top: 30px;}
  9. .masterheader {position:relative;padding:15px 30px;color:white;background-color:#760000;}
  10. .meeting_index ul { height: auto; width:100%; }
  11. .meeting_index ul li { display: block; }
  12. @media(min-width: 480px){
  13. .meeting_index ul{-webkit-column-count:1;-moz-column-count:1;column-count:1;}
  14. }
  15. @media(min-width: 768px){
  16. .meeting_index ul{-webkit-column-count:2;-moz-column-count:2;column-count:2;}
  17. }
  18. @media(min-width: 992px){
  19. .meeting_index ul{-webkit-column-count:3;-moz-column-count:3;column-count:3;}
  20. }
  21. @media(min-width: 1150px){
  22. .meeting_index ul{-webkit-column-count:4;-moz-column-count:4;column-count:4;}
  23. }
  24. </style>
  25. <title>OpenStack IRC channels and meetings</title>
  26. </head>
  27. <body>
  28. <div class="masterheader">
  29. <h1>OpenStack IRC channels and meetings</h1>
  30. </div>
  31. <div class="container">
  32. <a id="channels"></a>
  33. <h2>IRC channels</h2>
  34. <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>
  35. <p>The main channels are:</p>
  36. <ul>
  37. <li><a href="https://webchat.freenode.net/?channels=openstack">#openstack</a> (for usage questions)</li>
  38. <li><a href="https://webchat.freenode.net/?channels=openstack-dev">#openstack-dev (for development questions)</a></li>
  39. <li><a href="https://webchat.freenode.net/?channels=openstack-infra">#openstack-infra</a> (for questions about the project infrastructure)</li>
  40. </ul>
  41. <p>OpenStack IRC channels and logged. You can find all channels and all logs here:</p>
  42. <div class="well"><span class="glyphicon glyphicon-fast-backward"></span>&nbsp;
  43. <a href="irclogs/">IRC Channel Logs</a></div>
  44. <p>Links to specific meeting logs can be found on meeting descriptions below.</p>
  45. <a id="meetings"></a>
  46. <h2>IRC meetings schedule</h2>
  47. <p>The IRC meetings schedule is driven by the
  48. <a href=https://opendev.org/opendev/irc-meetings>opendev/irc-meetings</a> repository.
  49. To propose a change, please submit a change to that repository in Gerrit.</p>
  50. <p>Here is the link to an ICS file containing all OpenStack IRC meetings, for
  51. use in your favorite calendaring app:</p>
  52. <div class="well"><span class="glyphicon glyphicon-download"></span>&nbsp;
  53. <a href="irc-meetings.ical">iCalendar Complete Meeting Schedule</a>
  54. </div>
  55. <h2>Meeting details</h2>
  56. <small>
  57. <div class="meeting_index">
  58. <ul>
  59. {% for meeting in meetings|sort(attribute='project') %}
  60. <li><a href="#{{ meeting.project|replace(' ', '_') }}">{{ meeting.project }}</a></li>
  61. {% endfor %}
  62. </ul>
  63. </div>
  64. </small>
  65. {% for meeting in meetings|sort(attribute='project') %}
  66. <a id="{{ meeting.project|replace(' ', '_') }}"></a>
  67. <h3>{{ meeting.project }}</h3>
  68. <div class="panel panel-default">
  69. <div class="panel-heading"><small>{{ meeting.description|urlize }}</small>
  70. </div>
  71. <div class="panel-body">
  72. {% for schedule in meeting.schedules %}
  73. <div><span class="glyphicon glyphicon-time"></span>&nbsp;
  74. {{ schedule.recurrence }} on {% if schedule.recurrence.day_specifier %}{{ schedule.recurrence.day_specifier }} {% endif %}{{ schedule.day }} at
  75. <a data-toggle="tooltip" data-placement="top" title="NotFilledInYet" utctime="{{schedule.utc}}" weekday="{{schedule.day}}"
  76. href="http://www.timeanddate.com/worldclock/fixedtime.html?hour={{ schedule.utc[:2] }}&amp;min={{ schedule.utc[2:] }}&amp;sec=0"
  77. class="timelink">
  78. {{ schedule.utc }} UTC
  79. </a>
  80. in <a href="ircs://irc.freenode.net:6697/{{ schedule.irc }}">#{{ schedule.irc }}</a>
  81. (IRC <a href="https://webchat.freenode.net/?randomnick=1&channels=%23{{ schedule.irc }}&prompt=1&uio=d4">webclient</a>)
  82. </div>
  83. {% endfor %}
  84. <div><span class="glyphicon glyphicon-calendar"></span>&nbsp;
  85. <a href="calendars/{{ meeting.outfile }}">ICS file</a> for this specific
  86. meeting</div>
  87. <div><span class="glyphicon glyphicon-user"></span>&nbsp;
  88. Chair (to contact for more information): {{ meeting.chair }}</div>
  89. {% if meeting.extras.meeting_id %}
  90. <div><span class="glyphicon glyphicon-fast-backward"></span>&nbsp;
  91. Logs from <a href="http://eavesdrop.openstack.org/meetings/{{meeting.extras.meeting_id|replace('-', '_')}}/">past meetings</a></div>
  92. <div><span class="glyphicon glyphicon-tags"></span>&nbsp;
  93. Start this meeting using: <tt>#startmeeting {{meeting.extras.meeting_id|replace('-', '_')}}</tt>
  94. </div>
  95. {% endif %}
  96. {% if meeting.extras.agenda_url %}
  97. <div><span class="glyphicon glyphicon-list-alt"></span>&nbsp;
  98. <a href="{{meeting.extras.agenda_url}}">Agenda</a> for next meeting</div>
  99. {% endif %}
  100. </div>
  101. </div>
  102. {% endfor %}
  103. <small>Page generated on {{ timestamp }} UTC</small>
  104. </div>
  105. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  106. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  107. <script>
  108. function setTimeTooltips() {
  109. var timelinks = [].slice.call(document.getElementsByClassName('timelink'));
  110. for (var i in timelinks) {
  111. var link = timelinks[i];
  112. var local_date = new Date();
  113. var local_zone_name = local_date.toLocaleString('en', {timeZoneName:'short'}).split(' ').pop();
  114. var offset = local_date.getTimezoneOffset() / 60 * 100;
  115. var utc_meeting_time = link.getAttribute('utctime');
  116. var local_meeting_time = parseInt(utc_meeting_time) - offset;
  117. var day_offset = 0;
  118. if (local_meeting_time < 0) {
  119. day_offset = -1;
  120. local_meeting_time += 2400;
  121. } else if (local_meeting_time > 2400) {
  122. day_offset = 1;
  123. local_meeting_time -= 2400;
  124. }
  125. local_meeting_time = checkUTC4DigitString(String(local_meeting_time));
  126. var weekday = link.getAttribute('weekday');
  127. weekday = moveWeekday(weekday, day_offset);
  128. weekday = toTitleCase(weekday);
  129. link.title = weekday + ' at ' + local_meeting_time + ' ' + local_zone_name;
  130. }
  131. }
  132. function toTitleCase(str) {
  133. return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
  134. }
  135. function checkUTC4DigitString(s) { // turns '100' into '0100'
  136. return repeat('0', 4 - s.length) + s;
  137. }
  138. function repeat(s, n){
  139. var a = [];
  140. while(a.length < n){
  141. a.push(s);
  142. }
  143. return a.join('');
  144. }
  145. function moveWeekday(day, offset) {
  146. var days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
  147. var i = days.indexOf(day.toLowerCase());
  148. i += offset;
  149. if (i < 0)
  150. i += 7;
  151. else if (i > 6)
  152. i -= 7;
  153. return days[i];
  154. }
  155. $(document).ready(function(){
  156. setTimeTooltips()
  157. $('[data-toggle="tooltip"]').tooltip();
  158. });
  159. </script>
  160. </body>
  161. </html>