6 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
50 |
51 |
52 |
53 |
54 | adquira seu ingresso
55 |
56 |
57 | ├── .gitignore
├── .travis.yml
├── CNAME
├── Dockerfile
├── README.md
├── docker-compose.yaml
├── gulpfile.js
├── package-lock.json
├── package.json
├── pdfs
├── city_guide.pdf
├── guia_da_cidade.pdf
├── plano_de_patrocinio.pdf
└── sponsorship_plan.pdf
└── src
├── content
├── about.md
├── call.js
├── footer.js
├── hotels
│ └── taiwan.md
├── keynotes
│ ├── carol-willing.md
│ ├── debora-azevedo.md
│ ├── felipemorais.md
│ ├── laisvarejao.md
│ ├── lorenamesa.md
│ └── luciano-ramalho.md
└── sponsors.js
├── grade
├── calendario.js
├── core.min.css
├── core.min.js
├── daygrid.min.css
├── daygrid.min.js
├── google-calendar.js
├── index.html
├── list.min.css
├── list.min.js
├── logo.png
├── pt-br.min.js
├── style.css
├── timegrid.min.css
└── timegrid.min.js
├── images
├── cactus.svg
├── ccrp.svg
├── cloud_background.svg
├── cloud_background_2.svg
├── dinosaur.svg
├── download-on-appstore.svg
├── entities
│ ├── GitHub_Logo.png
│ ├── PSF-Logo-Narrow-Shapes.svg
│ ├── apyb.png
│ ├── estacio.png
│ ├── grupozap.png
│ ├── labcodes.png
│ ├── loadsmart-logo-horizontal.png
│ ├── logo-evolux.svg
│ ├── logo-idtrust.png
│ ├── logo_globo_com.svg
│ ├── olist.png
│ ├── placeholder.png
│ ├── stoodi.png
│ ├── usp.png
│ └── whatsgood.png
├── facebook.svg
├── fotos
│ ├── alexandre_villares.jpeg
│ ├── alexis_jawtuschenko.jpeg
│ ├── amanda_savluchinske.jpeg
│ ├── anicely_santos.jpeg
│ ├── arthur_fortes.jpeg
│ ├── barbara_barbosa_claudino.jpeg
│ ├── bernardo_fontes.jpeg
│ ├── betina_costa.jpeg
│ ├── bruno_evangelista.jpeg
│ ├── bruno_franca.jpeg
│ ├── camilla_martins.jpeg
│ ├── daniele_tavares.jpeg
│ ├── danielle_monteiro.jpeg
│ ├── david_cosac.jpeg
│ ├── diego_guimaraes.jpeg
│ ├── eder_martins.jpeg
│ ├── emanuel_lima.jpeg
│ ├── felipe_fernandes.jpeg
│ ├── felipe_videira.jpeg
│ ├── fernando_masanori.jpeg
│ ├── filipe_ximenes.jpeg
│ ├── flavio_juvenal.jpeg
│ ├── gabriel_bellon.jpeg
│ ├── giana_de_almeida.jpeg
│ ├── grupo_de_estudos_em_data_science.jpeg
│ ├── guilherme_garnier.jpeg
│ ├── gustavo_carvalho.jpeg
│ ├── henrique_bastos.jpeg
│ ├── ingrid_sena.jpeg
│ ├── jessica_bonson.jpeg
│ ├── joao_daher.jpeg
│ ├── juliana_karoline.jpeg
│ ├── juliany_raiol.jpeg
│ ├── katia_nakamura.jpeg
│ ├── leonardo_belluzzi.jpeg
│ ├── leonardo_rochael.jpeg
│ ├── lidiane_monteiro.jpeg
│ ├── maria_fernanda.jpeg
│ ├── mariana_albuquerque.jpeg
│ ├── matheus_hernandes.jpeg
│ ├── melissa_weber.jpeg
│ ├── nelson_nolasco.jpeg
│ ├── patricia_guisordi.jpeg
│ ├── paulo_santana.jpeg
│ ├── pietra_freitas.jpeg
│ ├── pyladies_brasil.jpeg
│ ├── pyladies_manaus.jpeg
│ ├── rafael_calixto.jpeg
│ ├── rafael_henrique.jpeg
│ ├── rebeca_sarai.jpeg
│ ├── renne_rocha.jpeg
│ ├── rodrigo_mendonca.jpeg
│ ├── ryllari_santana.jpeg
│ ├── sam_agnew.jpeg
│ ├── thais_almeida.jpeg
│ ├── tyrone_damasceno.jpeg
│ ├── william_oliveira.jpeg
│ └── yan_orestes.jpeg
├── google-play-badge.png
├── hayline.svg
├── hotels
│ └── taiwan.png
├── instagram.svg
├── keynotes
│ ├── carol-willing.jpg
│ ├── debora-azevedo.jpg
│ ├── felipemorais.jpg
│ ├── laisvarejao.jpg
│ ├── lorenamesa.jpg
│ └── luciano-ramalho.jpg
├── linkedin.svg
├── logo_python_2019.png
├── logo_python_2019_white.png
├── main_logo_ribeirao.png
├── py-logo-white.png
├── pylogo-2019-colored.svg
├── pylogo.svg
├── python_brasil_logo.png
├── python_brasil_logo_white.png
└── twitter.svg
├── sass
├── appbanner.sass
├── colors.sass
├── main.sass
└── style.sass
├── scripts
└── index.js
├── submissao-de-palestras
└── index.html
└── templates
├── index.hbs
├── partials
├── .main.hbs.swp
├── about.hbs
├── cityguide.hbs
├── footer.hbs
├── keynotes.hbs
├── lineup.hbs
├── main.hbs
├── prefooter.hbs
├── pylogo.hbs
├── sponsors.hbs
├── svgs
│ ├── facebook.hbs
│ ├── github.hbs
│ ├── instagram.hbs
│ ├── linkedin.hbs
│ ├── pylogo.hbs
│ └── twitter.hbs
└── tutorials.hbs
└── programacao.hbs
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | dist
4 |
5 | # OS X
6 | .DS_Store
7 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "11"
4 |
5 | script: npm run build
6 |
7 | deploy:
8 | local_dir: dist
9 | target-branch: gh-pages
10 | provider: pages
11 | github_token: $GITHUB_TOKEN
12 | keep_history: true
13 | skip_cleanup: true
14 | on:
15 | branch: master
16 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 | 2019.pythonbrasil.org.br
2 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:11-alpine
2 | RUN apk --update --no-cache \
3 | add \
4 | automake \
5 | git \
6 | alpine-sdk \
7 | nasm \
8 | autoconf \
9 | build-base \
10 | zlib \
11 | zlib-dev \
12 | libpng \
13 | libpng-dev\
14 | libwebp \
15 | libwebp-dev \
16 | libjpeg-turbo \
17 | libjpeg-turbo-dev
18 | RUN mkdir /src
19 | WORKDIR /src
20 | COPY . /src
21 | RUN npm install && npm run build
22 | EXPOSE 8080
23 | CMD ["npm", "run", "serve"]
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # pythonbrasil-2019-site
2 |
3 | https:///2019.pythonbrasil.org.br
4 |
5 | ```
6 | # Depende do Node v11
7 |
8 | # Instalando dependências
9 | $ npm install
10 |
11 | # Gera o site na pasta dist/
12 | $ npm run build
13 |
14 | # Serve o site na porta 8080
15 | $ npm run serve
16 | ```
17 |
18 | ## Desenvolvimento:
19 |
20 | ### Req
21 |
22 | Docker +18.06
23 | docker-compose +1.23
24 |
25 | ### Running
26 |
27 | ```bash
28 | docker-compose up # or docker-compose up -d if you want to dettach it from the terminal
29 | ```
30 |
31 | Then access http://localhost:8080/index.html
32 |
--------------------------------------------------------------------------------
/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.7'
2 |
3 | services:
4 | pybr_site:
5 | build:
6 | context: .
7 | dockerfile: Dockerfile
8 | image: "pybr_site"
9 | environment:
10 | - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/src/node_modules
11 | ports:
12 | - "8080:8080"
13 | volumes:
14 | - ./:/src
15 | - /src/node_modules
16 | - /src/dist
17 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | const gulpStatic = require('gulp-static-gen');
2 | const gulp = require('gulp');
3 | const fs = require('fs');
4 | const path = require('path');
5 | const set = require('lodash.set');
6 |
7 | const { Converter } = require('showdown');
8 |
9 | const data = {};
10 |
11 | const loadData = (folderPath, objectPaths = []) => {
12 | const finalPath = path.resolve(__dirname, folderPath)
13 | const files = fs.readdirSync(finalPath);
14 |
15 | files.forEach((file) => {
16 | if (file.indexOf('.') === -1) {
17 | loadData(`${folderPath}/${file}`, [file]);
18 | return;
19 | }
20 |
21 | if (file.indexOf('.js') !== -1) {
22 | let paths = [...objectPaths, file.replace('.js', '')]
23 | set(data, paths, require(`${process.cwd()}/${folderPath}/${file}`));
24 | } else {
25 | const conv = new Converter({ metadata: true, tables: true, openLinksInNewWindow: true });
26 | let paths = [...objectPaths, file.replace('.md', '')]
27 |
28 | set(data, paths, {
29 | html: conv.makeHtml(fs.readFileSync(
30 | path.resolve(finalPath, file), 'utf-8'
31 | )),
32 | meta: conv.getMetadata(),
33 | });
34 | }
35 | });
36 | }
37 |
38 | loadData('src/content')
39 |
40 | gulp.task('content', () => {
41 | loadData('src/content')
42 | });
43 |
44 | gulpStatic({
45 | customWatchers: [
46 | { files: './src/content/**/*', tasks: ['content', 'handlebars'] }
47 | ],
48 | move: [{
49 | input: './CNAME',
50 | output: './dist'
51 | },
52 | {
53 | input: './pdfs/**/*',
54 | output: './dist/assets/pdfs/'
55 | },
56 | {
57 | input: './src/submissao-de-palestras',
58 | output: './dist/'
59 | },
60 | {
61 | input: './src/grade/**/*',
62 | output: './dist/grade/'
63 | }
64 | ],
65 | css: {
66 | input: './src/sass/style.sass',
67 | output: './dist/assets/css',
68 | watch: './src/sass/**/*',
69 | },
70 | hbs: {
71 | batch: ['./src/templates/partials'],
72 | watch: './src/templates/**/*',
73 | multiple: [{
74 | data: data,
75 | input: './src/templates/index.hbs',
76 | output: {
77 | dir: './dist',
78 | name: 'index.html',
79 | }
80 | }]
81 | },
82 | img: {
83 | input: './src/images/**/*',
84 | output: './dist/assets/images',
85 | config: {
86 | interlaced: true,
87 | progressive: true,
88 | optimizationLevel: 5,
89 | svgoPlugins: [{ removeViewBox: true }]
90 | }
91 | },
92 | scripts: {
93 | input: './src/scripts/index.js',
94 | output: './dist/assets/scripts/',
95 | watch: './src/scripts/**/*',
96 | }
97 | });
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pybr",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "serve": "gulp serve",
8 | "build": "gulp build"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "gulp": "^3.X",
14 | "gulp-static-gen": "^1.0.2",
15 | "lodash.set": "^4.3.2",
16 | "prettier": "^1.18.2",
17 | "showdown": "^1.9.0",
18 | "tar": ">=2.2.2"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/pdfs/city_guide.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonbrasil/pybr2019-site/6a5af2c7ac51977dd79d6691fe787eb886947971/pdfs/city_guide.pdf
--------------------------------------------------------------------------------
/pdfs/guia_da_cidade.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonbrasil/pybr2019-site/6a5af2c7ac51977dd79d6691fe787eb886947971/pdfs/guia_da_cidade.pdf
--------------------------------------------------------------------------------
/pdfs/plano_de_patrocinio.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonbrasil/pybr2019-site/6a5af2c7ac51977dd79d6691fe787eb886947971/pdfs/plano_de_patrocinio.pdf
--------------------------------------------------------------------------------
/pdfs/sponsorship_plan.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonbrasil/pybr2019-site/6a5af2c7ac51977dd79d6691fe787eb886947971/pdfs/sponsorship_plan.pdf
--------------------------------------------------------------------------------
/src/content/about.md:
--------------------------------------------------------------------------------
1 | # O Evento
2 |
3 | A **PythonBrasil** é o maior evento sobre linguagem de programação Python do Brasil. Feito pela comunidade para a comunidade, tem o objetivo de difundir a linguagem, promover a troca de experiências e manter a comunidade crescendo igualmente em público e impacto social.
4 |
5 | Serão 6 dias de imersão onde os participantes poderão contribuir para projetos de software livre, participar de treinamentos e adquirir novos conhecimentos com desenvolvedores renomados da comunidade. A programação está organizada da seguinte forma: **Tutoriais** (23 e 24 de outubro no Centro Universitário Estácio de Sá), **Palestras e Keynotes** (25 a 27 de outubro no Centro de Convenções de Ribeirão Preto, CCRP) e **Sprints** (28 de outubro no Centro Universitário Estácio de Sá).
6 |
7 | Este ano, está sendo organizada pela comunidade Python de Ribeirão Preto/SP com o apoio da APyB (Associação Python Brasil).
8 |
--------------------------------------------------------------------------------
/src/content/call.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | text: 'A maior conferência de Python da América Latina',
3 | button: {
4 | link: '/foo',
5 | text: 'Quero patrocinar',
6 | }
7 | }
--------------------------------------------------------------------------------
/src/content/footer.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | nav: [
3 | {
4 | title: 'Sobre',
5 | items: [
6 | { text: 'Local', link: 'https://goo.gl/maps/m7ttyu5CCnBjobmD7' },
7 | { text: 'Keynotes', link: '#section-keynote' },
8 | { text: 'Evento', link: '#section-about' },
9 | { text: 'Guia da Cidade', link: '#section-cityguide' },
10 | // { text: 'Programação', link: '#' },
11 | { text: 'Código de Conduta', link: 'https://python.org.br/cdc/' },
12 | ]
13 | },
14 | {
15 | title: 'Patrocínio',
16 | items: [
17 | { text: 'Quero Patrocinar', link: '#section-sponsor' },
18 | { text: 'Patrocinadores', link: '#section-sponsors' },
19 | ]
20 | },
21 | ],
22 | social: {
23 | facebook: { link: 'https://www.facebook.com/pythonbrasil/', logo: '/images/facebook.svg' },
24 | twitter: { link: 'https://twitter.com/pythonbrasil', logo: '/images/twitter.svg' },
25 | instagram: { link: 'https://www.instagram.com/pythonbrasil/', logo: '/images/instagram.svg' },
26 | apybr: { link: 'https://python.org.br/', logo: '/images/pylogo.svg' }
27 | },
28 | buyTicketLink: 'https://pythonbrasil2019.eventbrite.com.br'
29 | }
30 |
--------------------------------------------------------------------------------
/src/content/hotels/taiwan.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Taiwan Hotel
3 | photo: taiwan.png
4 | href: https://www.taiwanhotel.com.br
5 | publish: True
6 | ---
7 |
8 | #### Taiwan Hotel (hotel oficial)
9 | [https://www.taiwanhotel.com.br](https://www.taiwanhotel.com.br)
10 |
11 | Oferece traslado gratuito do aeroporto para o hotel e vice-versa, e para o evento e vice-versa (válido para os dias de tutoriais, palestras e sprints)
12 |
13 | | Apartamento | Tarifa |
14 | |------------------------|------------|
15 | | Luxo Single (1 pessoa) | R$ 175,00* |
16 | | Luxo Duplo (2 pessoas) | R$ 205,00* |
17 |
18 | \* É cobrado 10% de taxas (Serviço e I.S.S.)
19 | \* Reservando um mínimo de 5 diárias, a 5ª é cortesia
20 |
21 | Utilize o código promocional `PYTHON_BRASIL` ao fazer a compra pelo site para acessar a condição especial.
22 |
--------------------------------------------------------------------------------
/src/content/keynotes/carol-willing.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: carol-willing.jpg
3 | github: https://github.com/willingc
4 | linkedin: https://www.linkedin.com/in/carolwilling/
5 | publish: True
6 | ---
7 |
8 | ### Carol Willing
9 | #### Diretora da PSF e Projeto Jupyter, desenvolvedora core do CPython e JupyterHub
10 |
11 | Carol Naslund Willing atua no Conselho Diretor do Projeto Jupyter e trabalha como Core Developer no JupyterHub e mybinder.org. Ela também atua como coeditora do “The Journal of Open Source Education” (JOSE) e é coautora de um livro open source, o “Teaching and Learning with Jupyter”.
12 |
13 | Ela é membro do primeiro Conselho Diretor do Python e faz parte da equipe principal de desenvolvimento do CPython. Ela também é ex-diretora da Python Software Foundation e atual Fellow Member. Em 2019, recebeu o Prêmio Frank Willison por suas contribuições técnicas e para com a comunidade Python. Fortemente comprometida com a divulgação da comunidade, Carol coorganiza o PyLadies San Diego e o San Diego Python User Group.
14 |
15 | Carol tem mestrado em Gestão pelo MIT e Bacharel em Engenharia Elétrica pela Duke University.
16 |
17 |
--------------------------------------------------------------------------------
/src/content/keynotes/debora-azevedo.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: debora-azevedo.jpg
3 | twitter: https://twitter.com/pydebb/
4 | linkedin: https://www.linkedin.com/in/debora-azevedo-1919b996/
5 | publish: true
6 | ---
7 |
8 | ### Débora Azevedo
9 | #### Professora na Secretaria Estadual de Educação e Cultura do Rio Grande do Norte
10 |
11 | Débora é professora na rede estadual de ensino no Rio Grande do Norte, e atualmente aluna do Mestrado em Inovação com Tecnologias Educacionais no Instituto Metrópole Digital (UFRN). Com uma formação mista, graduação em Letras - Inglês e bacharelado em TI ainda no meio do caminho, é cofundadora do PyLadies Brasil, estando em sua formação inicial até agora, além de organizadora do Django Girls Natal, sua cidade. Ano passado organizou a primeira PyLadiesBR Conf, primeira conferência do Brasil de PyLadies para PyLadies, e tem atuado ultimamente na comunidade de mulheres Python a nível nacional. Acredita que é com a educação que conseguiremos mudar alguma coisa, em nós, na comunidade, no país. Fã de Harry Potter e de literatura policial, pode chamá-la para conversar sobre isso ou sobre algum livro da Agatha Christie.
12 |
13 |
--------------------------------------------------------------------------------
/src/content/keynotes/felipemorais.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: felipemorais.jpg
3 | linkedin: https://www.linkedin.com/in/felipe-de-morais
4 | twitter: https://www.twitter.com/felipedemorais_
5 | publish: true
6 | ---
7 |
8 | ### Felipe de Morais
9 | #### Comunidade AfroPython
10 |
11 | Felipe de Morais é um Desenvolvedor de Software envolvido há alguns anos com a comunidade Python. Entre as contribuições mais relevantes para a Comunidade estão o AfroPython, iniciativa para empoderar pessoas negras através da tecnologia e colaborações em projetos abertos como a Operação Serenata de Amor. Tudo que ele faz são manifestações de seus 2 valores mais básicos: Ajudar pessoas e aprender com e de pessoas incríveis.
12 |
--------------------------------------------------------------------------------
/src/content/keynotes/laisvarejao.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: laisvarejao.jpg
3 | github: https://www.github.com/laisvarejao
4 | twitter: https://www.twitter.com/laisvarejao
5 | publish: true
6 | ---
7 |
8 | ### Laís Varejão
9 | #### Desenvolvedora Full-Stack e Gerente de Projetos @ Vinta Software
10 |
11 | É desenvolvedora full-stack e gerente de projetos na Vinta Software. PyLady e organizadora do Django Girls Recife, vislumbra um futuro com mais mulheres na computação. Alumna do Recurse Center, um retiro para programadores em Nova York. É engenheira de software por formação, tem 7 anos de experiência no mercado e atualmente lidera uma equipe de desenvolvimento onde aplica metodologias ágeis.
12 |
--------------------------------------------------------------------------------
/src/content/keynotes/lorenamesa.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: lorenamesa.jpg
3 | github: https://www.github.com/lorenanicole
4 | twitter: https://www.twitter.com/loooorenanicole
5 | publish: true
6 | ---
7 |
8 | ### Lorena Mesa
9 | #### Engenheira de Dados @ Github
10 |
11 | Cientista política que virou programadora, Lorena Mesa é engenheira de dados na equipe de sistemas de inteligência de software do GitHub, diretora da Python Software Foundation e coorganizadora do PyLadies Chicago.
12 | Durante o seu período na campanha "Obama for America" e, em seguida, na pesquisa de pós-graduação, Lorena teve que aprender como transformar dados confusos e incompletos em análises inteligíveis, como por exemplo a previsão do comportamento dos eleitores latinos. Foi esse histórico em pesquisa e matemática aplicada que levou Lorena a seguir uma carreira em engenharia e ciência de dados.
13 | Uma parte ativista, uma parte fanática por Star Wars e outra Trekkie, Lorena segue o lema "live long and prosper".
14 |
--------------------------------------------------------------------------------
/src/content/keynotes/luciano-ramalho.md:
--------------------------------------------------------------------------------
1 | ---
2 | photo: luciano-ramalho.jpg
3 | github: https://www.github.com/ramalho
4 | twitter: https://www.twitter.com/ramalhoorg
5 | publish: true
6 | ---
7 |
8 | ### Luciano Ramalho
9 | #### Autor do livro Python Fluente e Consultor Principal na ThoughtWorks Brasil
10 |
11 | Depois de 17 anos programando em Python, Ramalho publicou o livro Fluent Python (O'Reilly, 2015), lançado em 9 idiomas, inclusive PT-BR (Python Fluente, Novatec, 2015). Foi o primeiro presidente da Associação Python Brasil, e co-fundador do Garoa Hacker Clube. É fellow da Python Software Foundation e consultor principal na ThoughtWorks Brasil.
12 |
--------------------------------------------------------------------------------
/src/content/sponsors.js:
--------------------------------------------------------------------------------
1 | const Entity = (name, photo, link) => ({
2 | name, link,
3 | photo: `/assets/images/entities/${photo}`
4 | });
5 |
6 | module.exports = {
7 | sponsors: {
8 | title: 'Patrocinadores',
9 | categories: [
10 | {
11 | type: 'diamante',
12 | items: [
13 | Entity('GitHub', 'GitHub_Logo.png', 'https://github.com'),
14 | ],
15 | },
16 | {
17 | type: 'platina',
18 | items: [
19 | Entity('PSF', 'PSF-Logo-Narrow-Shapes.svg', 'https://www.python.org/psf'),
20 | Entity('GrupoZAP', 'grupozap.png', 'https://www.grupozap.com'),
21 | ],
22 | },
23 | {
24 | type: 'ouro',
25 | items: [
26 | Entity('Loadsmart', 'loadsmart-logo-horizontal.png', 'https://www.loadsmart.com'),
27 | Entity('olist', 'olist.png', 'https://olist.com'),
28 | Entity('Stoodi', 'stoodi.png', 'https://www.stoodi.com.br/'),
29 | Entity('Globo.com', 'logo_globo_com.svg', 'https://www.globo.com/'),
30 | ],
31 | },
32 | {
33 | type: 'prata',
34 | items: [
35 | Entity('Evolux', 'logo-evolux.svg', 'https://www.evolux.net.br'),
36 | Entity('Lab Codes', 'labcodes.png', 'https://labcodes.com.br/'),
37 | Entity('WhatsGood', 'whatsgood.png', 'https://whatsgood.com.br'),
38 | ],
39 | },
40 | {
41 | type: 'bronze',
42 | items: [
43 | Entity('iDtrust', 'logo-idtrust.png', 'https://www.idtrust.com.br'),
44 | ],
45 | },
46 | ]
47 | },
48 | partners: [
49 | {
50 | title: 'Parceiros',
51 | items: [
52 | Entity('associação python brasil', 'apyb.png', 'https://python.org.br/'),
53 | Entity('USP', 'usp.png', 'https://www5.usp.br/'),
54 | Entity('Estácio de Sá', 'estacio.png', 'http://portal.estacio.br')
55 | ]
56 | }
57 | ],
58 | organization: [
59 | Entity('FizzFuzz', 'placeholder.png', '/sponsor-test'),
60 | ]
61 | }
62 |
--------------------------------------------------------------------------------
/src/grade/calendario.js:
--------------------------------------------------------------------------------
1 | function open_details() {
2 | document.getElementById("full-detail").style.display = "block";
3 | }
4 |
5 | /* Close when someone clicks on the "x" symbol inside the overlay */
6 | function close_details() {
7 | document.getElementById("full-detail").style.display = "none";
8 | }
9 |
10 | function toggle_label(nodeId, value, display) {
11 | var node = document.getElementById(nodeId);
12 | if (value) {
13 | node.innerHTML = value;
14 | node.style.display = display;
15 | } else {
16 | node.style.display = "none";
17 | }
18 | }
19 |
20 | document.addEventListener('DOMContentLoaded', function() {
21 | var calendarEl = document.getElementById('calendar');
22 |
23 | var calendar = new FullCalendar.Calendar(calendarEl, {
24 | plugins: [
25 | 'list',
26 | 'googleCalendar'
27 | ],
28 |
29 | header: {
30 | left: 'title',
31 | right: 'tutoriais23,tutoriais24 talks25,talks26,talks27 sprints'
32 | },
33 | height: 'auto',
34 |
35 | // Python Brasil first day
36 | defaultDate: '2019-10-23',
37 | defaultView: 'tutoriais23',
38 | timeZone: 'America/Sao_Paulo',
39 | locale: 'pt-br',
40 |
41 | allDaySlot: false,
42 | minTime: "08:00:00",
43 | maxTime: "20:00:00",
44 | nowIndicator: true,
45 |
46 | views: {
47 | lista: {
48 | type: 'list',
49 | buttonText: 'Programação diária'
50 | },
51 | tutoriais23: {
52 | type: 'list',
53 | buttonText: 'Tutoriais: 23',
54 | visibleRange: {
55 | start: '2019-10-23',
56 | end: '2019-10-23'
57 | }
58 | },
59 | tutoriais24: {
60 | type: 'list',
61 | buttonText: '24',
62 | visibleRange: {
63 | start: '2019-10-24',
64 | end: '2019-10-24'
65 | }
66 | },
67 | talks25: {
68 | type: 'list',
69 | buttonText: 'Palestras: 25',
70 | visibleRange: {
71 | start: '2019-10-25',
72 | end: '2019-10-25'
73 | }
74 | },
75 | talks26: {
76 | type: 'list',
77 | buttonText: '26',
78 | visibleRange: {
79 | start: '2019-10-26',
80 | end: '2019-10-26'
81 | }
82 | },
83 | talks27: {
84 | type: 'list',
85 | buttonText: '27',
86 | visibleRange: {
87 | start: '2019-10-27',
88 | end: '2019-10-27'
89 | }
90 | },
91 | sprints: {
92 | type: 'list',
93 | buttonText: 'Sprints: 28',
94 | visibleRange: {
95 | start: '2019-10-28',
96 | end: '2019-10-28'
97 | }
98 | }
99 | },
100 |
101 | eventClick: function(info) {
102 | info.jsEvent.preventDefault();
103 |
104 | var title = info.event.title;
105 | var author = info.event._def.extendedProps.private.author;
106 | var location = info.event._def.extendedProps.location;
107 | var description = info.event._def.extendedProps.description || "";
108 | description = description.replace(/\\n\\n/g, "
");
109 | description = description.replace(/\\n/g, " ");
110 |
111 | document.getElementById("overlay-description").innerHTML = description;
112 | document.getElementById("overlay-title").innerHTML = title;
113 | toggle_label("overlay-author", author, "inline");
114 | toggle_label("overlay-room", location, "inline");
115 |
116 | open_details();
117 | },
118 |
119 | eventRender: function(info) {
120 | var meta = document.createElement("div");
121 | meta.className = "meta";
122 |
123 | // Palestrante
124 | var author = info.event._def.extendedProps.private.author;
125 | if (author) {
126 | console.log("author", author);
127 | var authorNode = document.createElement("div");
128 | authorNode.className = "speaker";
129 | authorNode.appendChild(
130 | document.createTextNode(author)
131 | )
132 | meta.appendChild(authorNode);
133 | }
134 | // Sala
135 | var location = info.event._def.extendedProps.location
136 | if (location) {
137 | var locationNode = document.createElement("div");
138 | locationNode.className = "room";
139 | locationNode.appendChild(
140 | document.createTextNode(location)
141 | )
142 | meta.appendChild(locationNode);
143 | }
144 |
145 | info.el.lastChild.appendChild(meta);
146 | },
147 | // Google Calendar settings
148 | googleCalendarApiKey: 'AIzaSyAIn8DyZFtthupLozgwIX3NUURFMWEIPb4',
149 | eventSources: [{
150 | googleCalendarId: 'ft5mdp26mhosq2heu6g87mb7ns@group.calendar.google.com'
151 | }]
152 | });
153 |
154 | calendar.render();
155 | });
--------------------------------------------------------------------------------
/src/grade/core.min.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,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") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}}
--------------------------------------------------------------------------------
/src/grade/daygrid.min.css:
--------------------------------------------------------------------------------
1 | .fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
--------------------------------------------------------------------------------
/src/grade/google-calendar.js:
--------------------------------------------------------------------------------
1 | /*!
2 | FullCalendar Google Calendar Plugin v4.3.0
3 | Docs & License: https://fullcalendar.io/
4 | (c) 2019 Adam Shaw
5 | */
6 |
7 | (function (global, factory) {
8 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
9 | typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
10 | (global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar));
11 | }(this, function (exports, core) { 'use strict';
12 |
13 | /*! *****************************************************************************
14 | Copyright (c) Microsoft Corporation. All rights reserved.
15 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use
16 | this file except in compliance with the License. You may obtain a copy of the
17 | License at http://www.apache.org/licenses/LICENSE-2.0
18 |
19 | THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20 | KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
21 | WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
22 | MERCHANTABLITY OR NON-INFRINGEMENT.
23 |
24 | See the Apache Version 2.0 License for specific language governing permissions
25 | and limitations under the License.
26 | ***************************************************************************** */
27 |
28 | var __assign = function() {
29 | __assign = Object.assign || function __assign(t) {
30 | for (var s, i = 1, n = arguments.length; i < n; i++) {
31 | s = arguments[i];
32 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
33 | }
34 | return t;
35 | };
36 | return __assign.apply(this, arguments);
37 | };
38 |
39 | // TODO: expose somehow
40 | var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
41 | var STANDARD_PROPS = {
42 | url: String,
43 | googleCalendarApiKey: String,
44 | googleCalendarId: String,
45 | data: null
46 | };
47 | var eventSourceDef = {
48 | parseMeta: function (raw) {
49 | if (typeof raw === 'string') {
50 | raw = { url: raw };
51 | }
52 | if (typeof raw === 'object') {
53 | var standardProps = core.refineProps(raw, STANDARD_PROPS);
54 | if (!standardProps.googleCalendarId && standardProps.url) {
55 | standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
56 | }
57 | delete standardProps.url;
58 | if (standardProps.googleCalendarId) {
59 | return standardProps;
60 | }
61 | }
62 | return null;
63 | },
64 | fetch: function (arg, onSuccess, onFailure) {
65 | var calendar = arg.calendar;
66 | var meta = arg.eventSource.meta;
67 | var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
68 | if (!apiKey) {
69 | onFailure({
70 | message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
71 | });
72 | }
73 | else {
74 | var url = buildUrl(meta);
75 | var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
76 | core.requestJson('GET', url, requestParams_1, function (body, xhr) {
77 | if (body.error) {
78 | onFailure({
79 | message: 'Google Calendar API: ' + body.error.message,
80 | errors: body.error.errors,
81 | xhr: xhr
82 | });
83 | }
84 | else {
85 | onSuccess({
86 | rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
87 | xhr: xhr
88 | });
89 | }
90 | }, function (message, xhr) {
91 | onFailure({ message: message, xhr: xhr });
92 | });
93 | }
94 | }
95 | };
96 | function parseGoogleCalendarId(url) {
97 | var match;
98 | // detect if the ID was specified as a single string.
99 | // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
100 | if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
101 | return url;
102 | }
103 | else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
104 | (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
105 | return decodeURIComponent(match[1]);
106 | }
107 | }
108 | function buildUrl(meta) {
109 | return API_BASE + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
110 | }
111 | function buildRequestParams(range, apiKey, extraParams, dateEnv) {
112 | var params;
113 | var startStr;
114 | var endStr;
115 | if (dateEnv.canComputeOffset) {
116 | // strings will naturally have offsets, which GCal needs
117 | startStr = dateEnv.formatIso(range.start);
118 | endStr = dateEnv.formatIso(range.end);
119 | }
120 | else {
121 | // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
122 | // from the UTC day-start to guarantee we're getting all the events
123 | // (start/end will be UTC-coerced dates, so toISOString is okay)
124 | startStr = core.addDays(range.start, -1).toISOString();
125 | endStr = core.addDays(range.end, 1).toISOString();
126 | }
127 | params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
128 | if (dateEnv.timeZone !== 'local') {
129 | params.timeZone = dateEnv.timeZone;
130 | }
131 | return params;
132 | }
133 | function gcalItemsToRawEventDefs(items, gcalTimezone) {
134 | return items.map(function (item) {
135 | return gcalItemToRawEventDef(item, gcalTimezone);
136 | });
137 | }
138 | function gcalItemToRawEventDef(item, gcalTimezone) {
139 | var url = item.htmlLink || null;
140 | // make the URLs for each event show times in the correct timezone
141 | if (url && gcalTimezone) {
142 | url = injectQsComponent(url, 'ctz=' + gcalTimezone);
143 | }
144 | return {
145 | id: item.id,
146 | title: item.summary,
147 | start: item.start.dateTime || item.start.date,
148 | end: item.end.dateTime || item.end.date,
149 | url: url,
150 | location: item.location,
151 | description: item.description,
152 | extendedProps: item.extendedProperties
153 | };
154 | }
155 | // Injects a string like "arg=value" into the querystring of a URL
156 | // TODO: move to a general util file?
157 | function injectQsComponent(url, component) {
158 | // inject it after the querystring but before the fragment
159 | return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
160 | return (qs ? qs + '&' : '?') + component + hash;
161 | });
162 | }
163 | var main = core.createPlugin({
164 | eventSourceDefs: [eventSourceDef]
165 | });
166 |
167 | exports.default = main;
168 |
169 | Object.defineProperty(exports, '__esModule', { value: true });
170 |
171 | }));
172 |
--------------------------------------------------------------------------------
/src/grade/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
'+(this.opt("allDaySlot")?' ':"")+" |
Formulário de submissão de palestras
10 | 11 | 12 | -------------------------------------------------------------------------------- /src/templates/index.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |em breve mais informações
7 |O Sprint é um espaço proporcionado pela conferência Python Brasil para desenvolvimento e contribuição de projetos open source.
11 | submeta seu sprint 12 |A maior conferência de Python da América Latina
4 | 5 | 13 |Tutoriais são atividades práticas, onde os participantes têm contato com a linguagem Python e tecnologias relacionadas. Os tutoriais da Python Brasil 2019 acontecerão nos dias 23 e 24 de Outubro, no Centro Universitário Estácio, em Ribeirão Preto - SP.
6 | Inscrições 7 |