├── app ├── assets │ ├── images │ │ ├── logo.png │ │ ├── conectividad.png │ │ ├── economia_digital.png │ │ ├── gobierno_digital.png │ │ ├── distribucion_conectividad.png │ │ ├── distribucion_fortalecimiento.png │ │ ├── distribucion_economia_digital.png │ │ ├── distribucion_gobierno_digital.png │ │ └── fortalecimiento_institucional.png │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── informes │ │ └── c1 │ │ │ ├── c1-07-2019-Pdifdn │ │ │ ├── c1-02-2015-Svcssp.pdf │ │ │ ├── c1-01-201811-Stdcsp.pdf │ │ │ ├── c1-03-2018-Mcatcepy.pdf │ │ │ ├── c1-04-201808-SOCpyPpy.pdf │ │ │ ├── c1-05-201808-Cssrpy.pdf │ │ │ ├── c1-06-2018-TDRGovlab.docx │ │ │ └── c1-08-2019-Prmregovcs.docx │ ├── css │ │ ├── extra.css │ │ └── noscript.css │ ├── sass │ │ ├── layout │ │ │ ├── _main.scss │ │ │ ├── _wrapper.scss │ │ │ ├── _footer.scss │ │ │ ├── _header.scss │ │ │ └── _menu.scss │ │ ├── components │ │ │ ├── _icons.scss │ │ │ ├── _section.scss │ │ │ ├── _box.scss │ │ │ ├── _row.scss │ │ │ ├── _list.scss │ │ │ ├── _icon.scss │ │ │ ├── _image.scss │ │ │ ├── _table.scss │ │ │ ├── _button.scss │ │ │ ├── _actions.scss │ │ │ ├── _form.scss │ │ │ └── _tiles.scss │ │ ├── noscript.scss │ │ ├── libs │ │ │ ├── _vars.scss │ │ │ ├── _mixins.scss │ │ │ ├── _functions.scss │ │ │ ├── _html-grid.scss │ │ │ ├── _breakpoints.scss │ │ │ └── _vendor.scss │ │ ├── base │ │ │ ├── _page.scss │ │ │ ├── _reset.scss │ │ │ └── _typography.scss │ │ └── main.scss │ └── js │ │ ├── browser.min.js │ │ ├── breakpoints.min.js │ │ ├── linkify-jquery.min.js │ │ ├── main.js │ │ ├── util.js │ │ └── linkify.min.js ├── templates │ ├── seguimiento.html │ ├── error.html │ ├── documentacion.html │ ├── solicitudes.html │ ├── propuesta.html │ ├── propuestaform.html │ ├── propuestas.html │ ├── footer.html │ ├── layout.html │ ├── principal.html │ ├── conectividad.html │ ├── fortalecimiento-institucional.html │ ├── economia-digital.html │ ├── objetivo-general.html │ ├── faq.html │ └── gobierno-digital.html └── main.py ├── Dockerfile ├── requirements.txt ├── LICENSE ├── .gitignore └── README.md /app/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/logo.png -------------------------------------------------------------------------------- /app/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /app/assets/images/conectividad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/conectividad.png -------------------------------------------------------------------------------- /app/assets/images/economia_digital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/economia_digital.png -------------------------------------------------------------------------------- /app/assets/images/gobierno_digital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/gobierno_digital.png -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-07-2019-Pdifdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-07-2019-Pdifdn -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /app/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-02-2015-Svcssp.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-02-2015-Svcssp.pdf -------------------------------------------------------------------------------- /app/assets/images/distribucion_conectividad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/distribucion_conectividad.png -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-01-201811-Stdcsp.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-01-201811-Stdcsp.pdf -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-03-2018-Mcatcepy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-03-2018-Mcatcepy.pdf -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-04-201808-SOCpyPpy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-04-201808-SOCpyPpy.pdf -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-05-201808-Cssrpy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-05-201808-Cssrpy.pdf -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-06-2018-TDRGovlab.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-06-2018-TDRGovlab.docx -------------------------------------------------------------------------------- /app/assets/images/distribucion_fortalecimiento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/distribucion_fortalecimiento.png -------------------------------------------------------------------------------- /app/assets/informes/c1/c1-08-2019-Prmregovcs.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/informes/c1/c1-08-2019-Prmregovcs.docx -------------------------------------------------------------------------------- /app/assets/images/distribucion_economia_digital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/distribucion_economia_digital.png -------------------------------------------------------------------------------- /app/assets/images/distribucion_gobierno_digital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/distribucion_gobierno_digital.png -------------------------------------------------------------------------------- /app/assets/images/fortalecimiento_institucional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agendadigitalpy/web-python/HEAD/app/assets/images/fortalecimiento_institucional.png -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM tiangolo/meinheld-gunicorn-flask:python3.7 2 | COPY ./app /app 3 | COPY ./requirements.txt /app/requirements.txt 4 | RUN pip install -r /app/requirements.txt 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Click==7.0 2 | Flask==1.0.3 3 | Flask-PyMongo==2.3.0 4 | itsdangerous==1.1.0 5 | Jinja2==2.11.3 6 | MarkupSafe==1.1.1 7 | pymongo==3.8.0 8 | Werkzeug==0.15.4 9 | beautifulsoup4==4.7.1 10 | 11 | -------------------------------------------------------------------------------- /app/templates/seguimiento.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Seguimiento{% endblock %} 3 | {% block body %} 4 |
5 |
6 |

Seguimiento

7 |

En construcción

8 |
9 |
10 |
11 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/error.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block body %} 3 |
4 |
5 |

Página no encontrada

6 |

Volver al inicio

7 |
8 |
9 |
10 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/css/extra.css: -------------------------------------------------------------------------------- 1 | .budget_dist div { 2 | text-align: center; 3 | } 4 | .budget_dist div img { 5 | width: 80%; 6 | } 7 | 8 | .proposal_details { 9 | } 10 | 11 | .proposal_details p { 12 | } 13 | 14 | .flash_success { 15 | background-color: #f5f5f5; 16 | padding: 1em; 17 | } 18 | 19 | .tweets { 20 | margin: 0px auto; 21 | width: 70%; 22 | } -------------------------------------------------------------------------------- /app/assets/css/noscript.css: -------------------------------------------------------------------------------- 1 | /* 2 | Phantom by HTML5 UP 3 | html5up.net | @ajlkn 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | /* Tiles */ 8 | 9 | body.is-preload .tiles article { 10 | -moz-transform: none; 11 | -webkit-transform: none; 12 | -ms-transform: none; 13 | transform: none; 14 | opacity: 1; 15 | } -------------------------------------------------------------------------------- /app/assets/sass/layout/_main.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Main */ 8 | 9 | #main { 10 | @include padding(5em, 0, (-5em, 0, 3em, 0)); 11 | 12 | @include breakpoint('<=small') { 13 | @include padding(3em, 0, (-3em, 0, 3em, 0)); 14 | } 15 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_icons.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Icons */ 8 | 9 | ul.icons { 10 | cursor: default; 11 | list-style: none; 12 | padding-left: 0; 13 | margin: -1em 0 _size(element-margin) -1em; 14 | 15 | li { 16 | display: inline-block; 17 | padding: 1em 0 0 1em; 18 | } 19 | } -------------------------------------------------------------------------------- /app/templates/documentacion.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Documentación{% endblock %} 3 | {% block body %} 4 |
5 |
6 |

Documentación

7 | 8 |
9 |
10 |

Volver al inicio

11 |
12 |
13 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/sass/components/_section.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Section/Article */ 8 | 9 | section, article { 10 | &.special { 11 | text-align: center; 12 | } 13 | } 14 | 15 | header { 16 | p { 17 | margin-top: _size(element-margin) * -0.5; 18 | } 19 | 20 | @include breakpoint('<=small') { 21 | p { 22 | margin-top: 0; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/assets/sass/noscript.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | @import 'libs/vendor'; 5 | @import 'libs/breakpoints'; 6 | @import 'libs/html-grid'; 7 | 8 | /* 9 | Phantom by HTML5 UP 10 | html5up.net | @ajlkn 11 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 12 | */ 13 | 14 | /* Tiles */ 15 | 16 | .tiles { 17 | body.is-preload & { 18 | article { 19 | @include vendor('transform', 'none'); 20 | opacity: 1; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/assets/sass/layout/_wrapper.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Wrapper */ 8 | 9 | #wrapper { 10 | > * { 11 | > .inner { 12 | $gutter: _size(gutter); 13 | 14 | width: 100%; 15 | max-width: _size(inner); 16 | margin: 0 auto; 17 | padding: 0 $gutter; 18 | 19 | @include breakpoint('<=small') { 20 | $gutter: _size(gutter) * 0.5; 21 | 22 | padding: 0 $gutter; 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_box.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Box */ 8 | 9 | .box { 10 | border-radius: _size(border-radius); 11 | border: solid _size(border-width) _palette(border); 12 | margin-bottom: _size(element-margin); 13 | padding: 1.5em; 14 | 15 | > :last-child, 16 | > :last-child > :last-child, 17 | > :last-child > :last-child > :last-child { 18 | margin-bottom: 0; 19 | } 20 | 21 | &.alt { 22 | border: 0; 23 | border-radius: 0; 24 | padding: 0; 25 | } 26 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_row.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Row */ 8 | 9 | .row { 10 | @include html-grid(2em); 11 | 12 | @include breakpoint('<=xlarge') { 13 | @include html-grid(2em, 'xlarge'); 14 | } 15 | 16 | @include breakpoint('<=large') { 17 | @include html-grid(2em, 'large'); 18 | } 19 | 20 | @include breakpoint('<=medium') { 21 | @include html-grid(1.5em, 'medium'); 22 | } 23 | 24 | @include breakpoint('<=small') { 25 | @include html-grid(1em, 'small'); 26 | } 27 | 28 | @include breakpoint('<=xsmall') { 29 | @include html-grid(1em, 'xsmall'); 30 | } 31 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Agenda Digital Paraguay 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/assets/sass/libs/_vars.scss: -------------------------------------------------------------------------------- 1 | // Misc. 2 | $misc: ( 3 | z-index-base: 10000 4 | ); 5 | 6 | // Duration. 7 | $duration: ( 8 | menu: 0.45s, 9 | transition: 0.2s 10 | ); 11 | 12 | // Size. 13 | $size: ( 14 | border-radius: 4px, 15 | border-width: 1px, 16 | element-height: 3em, 17 | element-margin: 2em, 18 | gutter: 2.5em, 19 | field-gutter: 2em, 20 | inner: 68em, 21 | menu: 22em 22 | ); 23 | 24 | // Font. 25 | $font: ( 26 | family: ('Source Sans Pro', Helvetica, sans-serif), 27 | family-fixed: ('Courier New', monospace), 28 | weight: 300, 29 | weight-bold: 900, 30 | weight-bold-alt: 700, 31 | letter-spacing: 0.35em, 32 | letter-spacing-alt: -0.035em 33 | ); 34 | 35 | // Palette. 36 | $palette: ( 37 | bg: #ffffff, 38 | bg-accent: #333333, 39 | bg-alt: #f6f6f6, 40 | fg: #585858, 41 | fg-accent: #ffffff, 42 | border: #c9c9c9, 43 | border-bg: rgba(144,144,144,0.075), 44 | accent1: #f2849e, 45 | accent2: #7ecaf6, 46 | accent3: #7bd0c1, 47 | accent4: #c75b9b, 48 | accent5: #ae85ca, 49 | accent6: #8499e7, 50 | ); -------------------------------------------------------------------------------- /app/assets/sass/components/_list.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* List */ 8 | 9 | ol { 10 | list-style: decimal; 11 | margin: 0 0 _size(element-margin) 0; 12 | padding-left: 1.25em; 13 | 14 | li { 15 | padding-left: 0.25em; 16 | } 17 | } 18 | 19 | ul { 20 | list-style: disc; 21 | margin: 0 0 _size(element-margin) 0; 22 | padding-left: 1em; 23 | 24 | li { 25 | padding-left: 0.5em; 26 | } 27 | 28 | &.alt { 29 | list-style: none; 30 | padding-left: 0; 31 | 32 | li { 33 | border-top: solid _size(border-width) _palette(border); 34 | padding: 0.5em 0; 35 | 36 | &:first-child { 37 | border-top: 0; 38 | padding-top: 0; 39 | } 40 | } 41 | } 42 | } 43 | 44 | dl { 45 | margin: 0 0 _size(element-margin) 0; 46 | 47 | dt { 48 | display: block; 49 | font-weight: _font(weight-bold); 50 | margin: 0 0 (_size(element-margin) * 0.5) 0; 51 | } 52 | 53 | dd { 54 | margin-left: _size(element-margin); 55 | } 56 | } -------------------------------------------------------------------------------- /app/assets/sass/base/_page.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Basic */ 8 | 9 | // MSIE: Required for IEMobile. 10 | @-ms-viewport { 11 | width: device-width; 12 | } 13 | 14 | // MSIE: Prevents scrollbar from overlapping content. 15 | body { 16 | -ms-overflow-style: scrollbar; 17 | } 18 | 19 | // Ensures page width is always >=320px. 20 | @include breakpoint('<=xsmall') { 21 | html, body { 22 | min-width: 320px; 23 | } 24 | } 25 | 26 | // Set box model to border-box. 27 | // Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice 28 | html { 29 | box-sizing: border-box; 30 | } 31 | 32 | *, *:before, *:after { 33 | box-sizing: inherit; 34 | } 35 | 36 | body { 37 | background: _palette(bg); 38 | 39 | // Stops initial animations until page loads. 40 | &.is-preload { 41 | *, *:before, *:after { 42 | @include vendor('animation', 'none !important'); 43 | @include vendor('transition', 'none !important'); 44 | } 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_icon.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Icon */ 8 | 9 | .icon { 10 | @include icon; 11 | border-bottom: none; 12 | position: relative; 13 | 14 | > .label { 15 | display: none; 16 | } 17 | 18 | &.style1 { 19 | } 20 | 21 | &.style2 { 22 | @include vendor('transition', ( 23 | 'background-color #{_duration(transition)} ease-in-out', 24 | 'color #{_duration(transition)} ease-in-out', 25 | 'border-color #{_duration(transition)} ease-in-out' 26 | )); 27 | background-color: transparent; 28 | border: solid 1px _palette(border); 29 | border-radius: _size(border-radius); 30 | width: 2.65em; 31 | height: 2.65em; 32 | display: inline-block; 33 | text-align: center; 34 | line-height: 2.65em; 35 | color: inherit; 36 | 37 | &:before { 38 | font-size: 1.1em; 39 | } 40 | 41 | &:hover { 42 | color: _palette(accent1); 43 | border-color: _palette(accent1); 44 | } 45 | 46 | &:active { 47 | background-color: transparentize(_palette(accent1), 0.9); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_image.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Image */ 8 | 9 | .image { 10 | border-radius: _size(border-radius); 11 | border: 0; 12 | display: inline-block; 13 | position: relative; 14 | 15 | img { 16 | border-radius: _size(border-radius); 17 | display: block; 18 | } 19 | 20 | &.left, 21 | &.right { 22 | max-width: 40%; 23 | 24 | img { 25 | width: 100%; 26 | } 27 | } 28 | 29 | &.left { 30 | float: left; 31 | padding: 0 1.5em 1em 0; 32 | top: 0.25em; 33 | } 34 | 35 | &.right { 36 | float: right; 37 | padding: 0 0 1em 1.5em; 38 | top: 0.25em; 39 | } 40 | 41 | &.fit { 42 | display: block; 43 | margin: 0 0 _size(element-margin) 0; 44 | width: 100%; 45 | 46 | img { 47 | width: 100%; 48 | } 49 | } 50 | 51 | &.main { 52 | display: block; 53 | margin: 0 0 (_size(element-margin) * 1.5) 0; 54 | width: 100%; 55 | 56 | img { 57 | width: 100%; 58 | } 59 | 60 | @include breakpoint('<=small') { 61 | margin: 0 0 _size(element-margin) 0; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /app/assets/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import 'libs/vars'; 2 | @import 'libs/functions'; 3 | @import 'libs/mixins'; 4 | @import 'libs/vendor'; 5 | @import 'libs/breakpoints'; 6 | @import 'libs/html-grid'; 7 | @import 'font-awesome.min.css'; 8 | @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,700,900'); 9 | 10 | /* 11 | Phantom by HTML5 UP 12 | html5up.net | @ajlkn 13 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 14 | */ 15 | 16 | // Breakpoints. 17 | 18 | @include breakpoints(( 19 | xlarge: ( 1281px, 1680px ), 20 | large: ( 981px, 1280px ), 21 | medium: ( 737px, 980px ), 22 | small: ( 481px, 736px ), 23 | xsmall: ( 361px, 480px ), 24 | xxsmall: ( null, 360px ) 25 | )); 26 | 27 | // Base. 28 | 29 | @import 'base/reset'; 30 | @import 'base/page'; 31 | @import 'base/typography'; 32 | 33 | // Component. 34 | 35 | @import 'components/row'; 36 | @import 'components/section'; 37 | @import 'components/icon'; 38 | @import 'components/list'; 39 | @import 'components/actions'; 40 | @import 'components/icons'; 41 | @import 'components/form'; 42 | @import 'components/box'; 43 | @import 'components/image'; 44 | @import 'components/table'; 45 | @import 'components/button'; 46 | @import 'components/tiles'; 47 | 48 | // Layout. 49 | 50 | @import 'layout/header'; 51 | @import 'layout/menu'; 52 | @import 'layout/main'; 53 | @import 'layout/footer'; 54 | @import 'layout/wrapper'; -------------------------------------------------------------------------------- /app/templates/solicitudes.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Solicitudes{% endblock %} 3 | {% block body %} 4 |
5 |
6 |

Solicitudes de información pública enviadas a MITIC

7 |
8 |
9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {{ range .reqs }} 21 | 22 | 23 | 24 | 31 | 32 | 33 | {{ end }} 34 | 35 |
FechaAsuntoRespondidaEnlace
{{ .Date }}{{ .Title }} 25 | {{ if .Replied }} 26 | Sí 27 | {{ else }} 28 | No (faltan {{ .RemainingDays }} dias) 29 | {{ end }} 30 | Ver
36 |
37 |
38 |
39 |

Volver al inicio

40 |
41 |
42 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/sass/components/_table.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Table */ 8 | 9 | .table-wrapper { 10 | -webkit-overflow-scrolling: touch; 11 | overflow-x: auto; 12 | } 13 | 14 | table { 15 | margin: 0 0 _size(element-margin) 0; 16 | width: 100%; 17 | 18 | tbody { 19 | tr { 20 | border: solid _size(border-width) _palette(border); 21 | border-left: 0; 22 | border-right: 0; 23 | 24 | &:nth-child(2n + 1) { 25 | background-color: _palette(border-bg); 26 | } 27 | } 28 | } 29 | 30 | td { 31 | padding: 0.75em 0.75em; 32 | } 33 | 34 | th { 35 | color: _palette(fg-bold); 36 | font-size: 0.9em; 37 | font-weight: _font(weight-bold); 38 | padding: 0 0.75em 0.75em 0.75em; 39 | text-align: left; 40 | } 41 | 42 | thead { 43 | border-bottom: solid (_size(border-width) * 2) _palette(border); 44 | } 45 | 46 | tfoot { 47 | border-top: solid (_size(border-width) * 2) _palette(border); 48 | } 49 | 50 | &.alt { 51 | border-collapse: separate; 52 | 53 | tbody { 54 | tr { 55 | td { 56 | border: solid _size(border-width) _palette(border); 57 | border-left-width: 0; 58 | border-top-width: 0; 59 | 60 | &:first-child { 61 | border-left-width: _size(border-width); 62 | } 63 | } 64 | 65 | &:first-child { 66 | td { 67 | border-top-width: _size(border-width); 68 | } 69 | } 70 | } 71 | } 72 | 73 | thead { 74 | border-bottom: 0; 75 | } 76 | 77 | tfoot { 78 | border-top: 0; 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /app/assets/js/browser.min.js: -------------------------------------------------------------------------------- 1 | /* browser.js v1.0 | @ajlkn | MIT licensed */ 2 | var browser=function(){"use strict";var e={name:null,version:null,os:null,osVersion:null,touch:null,mobile:null,_canUse:null,canUse:function(n){e._canUse||(e._canUse=document.createElement("div"));var o=e._canUse.style,r=n.charAt(0).toUpperCase()+n.slice(1);return n in o||"Moz"+r in o||"Webkit"+r in o||"O"+r in o||"ms"+r in o},init:function(){var n,o,r,i,t=navigator.userAgent;for(n="other",o=0,r=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],i=0;i0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser}); 3 | -------------------------------------------------------------------------------- /app/templates/propuesta.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Propuesta: {{ proposal.title }}{% endblock %} 3 | {% block body %} 4 |
5 |
6 | Volver a la lista de propuestas 7 |
8 |
9 |

Propuesta: "{{ proposal.title }}"

10 |
11 |

Autor: {{ proposal.name }}

12 |

Componente: {{ proposal.category | category_name }}

13 |

Fecha: {{ proposal._id | proposal_date }}

14 |
15 |
16 |
17 | {{ proposal.content | content_filter | safe }} 18 |
19 |
20 |
21 |
22 |
23 | 35 | 36 | 37 |
38 |
39 | {% endblock %} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # web-python 2 | 3 | Sitio web de agendadigital.com.py. 4 | 5 | Si tenés alguna sugerencia relacionada con este proyecto, podes crear un ticket [aquí](https://github.com/agendadigitalpy/web-python/issues/new). 6 | 7 | # Requisitos 8 | 9 | - [Python 3](https://www.python.org/downloads/) 10 | - [MongoDB](https://www.mongodb.com/) 11 | 12 | # Requisitos (Python) 13 | 14 | - [Flask](http://flask.pocoo.org/) 15 | - [Flask-PyMongo](https://flask-pymongo.readthedocs.io/en/latest/) 16 | - [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) 17 | 18 | ```bash 19 | $ pip install -r requirements.txt 20 | ``` 21 | 22 | # Desarrollo 23 | 24 | Antes de utilizar la aplicación, crear una base de datos en MongoDB, llamada "agendadigitalpy". 25 | 26 | ## Entorno virtual 27 | 28 | ```bash 29 | $ python3 -m venv venv 30 | ``` 31 | 32 | ```bash 33 | $ ./venv/bin/activate 34 | ``` 35 | 36 | ## Ejecución 37 | 38 | ```bash 39 | $ cd src 40 | $ flask run 41 | ``` 42 | 43 | ## Guía de instalación para macos 44 | 45 | ```bash 46 | $ python3 -m venv venv 47 | 48 | $ source venv/bin/activate 49 | 50 | $ pip install -r requirements.txt 51 | 52 | $ cd src 53 | 54 | $ export FLASK_APP=app.py 55 | # ejecutar flask en debug mode 56 | $ export FLASK_ENV=development 57 | 58 | $ flask run 59 | ``` 60 | 61 | en **macos** al correr `flask run` es muy común el error 62 | 63 | ```bash 64 | ModuleNotFoundError: No module named 'bs4' 65 | ``` 66 | 67 | el fix es: 68 | 69 | ```bash 70 | # salir del virtualenv 71 | deactivate 72 | # instalar manualmente 73 | python3 -m pip install bs4 74 | ``` 75 | 76 | # Comunidad 77 | 78 | Para discutir sobre temas de desarrollo podes ingresar al Telegram de desarrollo en [este enlace](https://t.me/agendadigitalpydev). 79 | 80 | Para temas generales relacionados a la agenda digital, [este es el canal oficial](https://t.me/agendadigitalpy). 81 | -------------------------------------------------------------------------------- /app/assets/sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | // Reset. 8 | // Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) 9 | 10 | html, body, div, span, applet, object, 11 | iframe, h1, h2, h3, h4, h5, h6, p, blockquote, 12 | pre, a, abbr, acronym, address, big, cite, 13 | code, del, dfn, em, img, ins, kbd, q, s, samp, 14 | small, strike, strong, sub, sup, tt, var, b, 15 | u, i, center, dl, dt, dd, ol, ul, li, fieldset, 16 | form, label, legend, table, caption, tbody, 17 | tfoot, thead, tr, th, td, article, aside, 18 | canvas, details, embed, figure, figcaption, 19 | footer, header, hgroup, menu, nav, output, ruby, 20 | section, summary, time, mark, audio, video { 21 | margin: 0; 22 | padding: 0; 23 | border: 0; 24 | font-size: 100%; 25 | font: inherit; 26 | vertical-align: baseline; 27 | } 28 | 29 | article, aside, details, figcaption, figure, 30 | footer, header, hgroup, menu, nav, section { 31 | display: block; 32 | } 33 | 34 | body { 35 | line-height: 1; 36 | } 37 | 38 | ol, ul { 39 | list-style:none; 40 | } 41 | 42 | blockquote, q { 43 | quotes: none; 44 | 45 | &:before, 46 | &:after { 47 | content: ''; 48 | content: none; 49 | } 50 | } 51 | 52 | table { 53 | border-collapse: collapse; 54 | border-spacing: 0; 55 | } 56 | 57 | body { 58 | -webkit-text-size-adjust: none; 59 | } 60 | 61 | mark { 62 | background-color: transparent; 63 | color: inherit; 64 | } 65 | 66 | input::-moz-focus-inner { 67 | border: 0; 68 | padding: 0; 69 | } 70 | 71 | input, select, textarea { 72 | -moz-appearance: none; 73 | -webkit-appearance: none; 74 | -ms-appearance: none; 75 | appearance: none; 76 | } -------------------------------------------------------------------------------- /app/templates/propuestaform.html: -------------------------------------------------------------------------------- 1 |
2 |

Creá tu propuesta

3 |

También podes incluir consultas puntuales sobre los distintos componentes del programa. En el caso de que necesites adjuntar más información, es posible agregar enlaces.

4 |

Haremos lo posible para consultar a las autoridades y mantenerte al tanto.

5 |

Tu dirección de correo no se publicará y se almacenará con el propósito de seguimiento.

6 |
7 | 8 |
9 |
10 |
11 |
12 | 13 |
14 |
15 | 16 |
17 |
18 | 19 | 26 |
27 |
28 | 29 |
30 |
31 |
32 | 33 |
34 |
35 |
36 |
    37 |
  • 38 | 39 |
  • 40 |
41 |
42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /app/assets/sass/libs/_mixins.scss: -------------------------------------------------------------------------------- 1 | /// Makes an element's :before pseudoelement a FontAwesome icon. 2 | /// @param {string} $content Optional content value to use. 3 | /// @param {string} $where Optional pseudoelement to target (before or after). 4 | @mixin icon($content: false, $where: before) { 5 | 6 | text-decoration: none; 7 | 8 | &:#{$where} { 9 | 10 | @if $content { 11 | content: $content; 12 | } 13 | 14 | -moz-osx-font-smoothing: grayscale; 15 | -webkit-font-smoothing: antialiased; 16 | font-family: FontAwesome; 17 | font-style: normal; 18 | font-weight: normal; 19 | text-transform: none !important; 20 | 21 | } 22 | 23 | } 24 | 25 | /// Applies padding to an element, taking the current element-margin value into account. 26 | /// @param {mixed} $tb Top/bottom padding. 27 | /// @param {mixed} $lr Left/right padding. 28 | /// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) 29 | /// @param {bool} $important If true, adds !important. 30 | @mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { 31 | 32 | @if $important { 33 | $important: '!important'; 34 | } 35 | 36 | $x: 0.1em; 37 | 38 | @if unit(_size(element-margin)) == 'rem' { 39 | $x: 0.1rem; 40 | } 41 | 42 | padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; 43 | 44 | } 45 | 46 | /// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). 47 | /// @param {string} $svg SVG data URL. 48 | /// @return {string} Encoded SVG data URL. 49 | @function svg-url($svg) { 50 | 51 | $svg: str-replace($svg, '"', '\''); 52 | $svg: str-replace($svg, '%', '%25'); 53 | $svg: str-replace($svg, '<', '%3C'); 54 | $svg: str-replace($svg, '>', '%3E'); 55 | $svg: str-replace($svg, '&', '%26'); 56 | $svg: str-replace($svg, '#', '%23'); 57 | $svg: str-replace($svg, '{', '%7B'); 58 | $svg: str-replace($svg, '}', '%7D'); 59 | $svg: str-replace($svg, ';', '%3B'); 60 | 61 | @return url("data:image/svg+xml;charset=utf8,#{$svg}"); 62 | 63 | } -------------------------------------------------------------------------------- /app/templates/propuestas.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Propuestas{% endblock %} 3 | {% block body %} 4 |
5 | {% if message.success == True %} 6 |

7 | ¡Gracias por tu aporte, será publicado en breve! 8 |
9 | 10 | 11 |

12 | {% else %} 13 |

{{ message.text }}

14 | {% endif %} 15 | 16 | {% include "propuestaform.html" %} 17 | 18 |
19 |

Últimas propuestas recibidas

20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | {% for p in proposals %} 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | {% endfor %} 41 | 42 |
FechaComponenteTítuloContenido
{{ p._id | proposal_date }}{{ p.category | category_name }}{{ p.title | truncate(50) }} {{ p.content | truncate(50) }} Ver
43 |
44 |
45 | 46 |
47 |

Volver al inicio

48 |
49 |
50 | {% endblock %} 51 | -------------------------------------------------------------------------------- /app/assets/sass/components/_button.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Button */ 8 | 9 | input[type="submit"], 10 | input[type="reset"], 11 | input[type="button"], 12 | button, 13 | .button { 14 | @include vendor('appearance', 'none'); 15 | @include vendor('transition', ( 16 | 'background-color #{_duration(transition)} ease-in-out', 17 | 'color #{_duration(transition)} ease-in-out', 18 | 'box-shadow #{_duration(transition)} ease-in-out' 19 | )); 20 | background-color: transparent; 21 | border-radius: _size(border-radius); 22 | border: 0; 23 | box-shadow: inset 0 0 0 (_size(border-width) * 2) _palette(fg); 24 | color: _palette(fg) !important; 25 | cursor: pointer; 26 | display: inline-block; 27 | font-size: 0.8em; 28 | font-weight: _font(weight-bold); 29 | height: 3.5em; 30 | letter-spacing: _font(letter-spacing); 31 | line-height: 3.45em; 32 | overflow: hidden; 33 | padding: 0 1.25em 0 #{1.25em + _font(letter-spacing)}; 34 | text-align: center; 35 | text-decoration: none; 36 | text-overflow: ellipsis; 37 | text-transform: uppercase; 38 | white-space: nowrap; 39 | 40 | &.icon { 41 | &:before { 42 | margin-right: 0.5em; 43 | } 44 | } 45 | 46 | &.fit { 47 | width: 100%; 48 | } 49 | 50 | &:hover { 51 | color: _palette(accent1) !important; 52 | box-shadow: inset 0 0 0 (_size(border-width) * 2) _palette(accent1); 53 | } 54 | 55 | &:active { 56 | background-color: transparentize(_palette(accent1), 0.9); 57 | } 58 | 59 | &.small { 60 | font-size: 0.6em; 61 | } 62 | 63 | &.large { 64 | font-size: 1em; 65 | } 66 | 67 | &.primary { 68 | box-shadow: none; 69 | background-color: _palette(fg); 70 | color: _palette(bg) !important; 71 | 72 | &:hover { 73 | background-color: _palette(accent1); 74 | } 75 | 76 | &:active { 77 | background-color: darken(_palette(accent1), 8); 78 | } 79 | } 80 | 81 | &.disabled, 82 | &:disabled { 83 | @include vendor('pointer-events', 'none'); 84 | opacity: 0.25; 85 | } 86 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_actions.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Actions */ 8 | 9 | ul.actions { 10 | @include vendor('display', 'flex'); 11 | cursor: default; 12 | list-style: none; 13 | margin-left: (_size(element-margin) * -0.5); 14 | padding-left: 0; 15 | 16 | li { 17 | padding: 0 0 0 (_size(element-margin) * 0.5); 18 | vertical-align: middle; 19 | } 20 | 21 | &.special { 22 | @include vendor('justify-content', 'center'); 23 | width: 100%; 24 | margin-left: 0; 25 | 26 | li { 27 | &:first-child { 28 | padding-left: 0; 29 | } 30 | } 31 | } 32 | 33 | &.stacked { 34 | @include vendor('flex-direction', 'column'); 35 | margin-left: 0; 36 | 37 | li { 38 | padding: (_size(element-margin) * 0.65) 0 0 0; 39 | 40 | &:first-child { 41 | padding-top: 0; 42 | } 43 | } 44 | } 45 | 46 | &.fit { 47 | width: calc(100% + #{_size(element-margin) * 0.5}); 48 | 49 | li { 50 | @include vendor('flex-grow', '1'); 51 | @include vendor('flex-shrink', '1'); 52 | width: 100%; 53 | 54 | > * { 55 | width: 100%; 56 | } 57 | } 58 | 59 | &.stacked { 60 | width: 100%; 61 | } 62 | } 63 | 64 | @include breakpoint('<=xsmall') { 65 | &:not(.fixed) { 66 | @include vendor('flex-direction', 'column'); 67 | margin-left: 0; 68 | width: 100% !important; 69 | 70 | li { 71 | @include vendor('flex-grow', '1'); 72 | @include vendor('flex-shrink', '1'); 73 | padding: (_size(element-margin) * 0.5) 0 0 0; 74 | text-align: center; 75 | width: 100%; 76 | 77 | > * { 78 | width: 100%; 79 | } 80 | 81 | &:first-child { 82 | padding-top: 0; 83 | } 84 | 85 | input[type="submit"], 86 | input[type="reset"], 87 | input[type="button"], 88 | button, 89 | .button { 90 | width: 100%; 91 | 92 | &.icon { 93 | &:before { 94 | margin-left: -0.5rem; 95 | } 96 | } 97 | } 98 | } 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /app/assets/sass/libs/_functions.scss: -------------------------------------------------------------------------------- 1 | /// Removes a specific item from a list. 2 | /// @author Hugo Giraudel 3 | /// @param {list} $list List. 4 | /// @param {integer} $index Index. 5 | /// @return {list} Updated list. 6 | @function remove-nth($list, $index) { 7 | 8 | $result: null; 9 | 10 | @if type-of($index) != number { 11 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 12 | } 13 | @else if $index == 0 { 14 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 15 | } 16 | @else if abs($index) > length($list) { 17 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 18 | } 19 | @else { 20 | 21 | $result: (); 22 | $index: if($index < 0, length($list) + $index + 1, $index); 23 | 24 | @for $i from 1 through length($list) { 25 | 26 | @if $i != $index { 27 | $result: append($result, nth($list, $i)); 28 | } 29 | 30 | } 31 | 32 | } 33 | 34 | @return $result; 35 | 36 | } 37 | 38 | /// Gets a value from a map. 39 | /// @author Hugo Giraudel 40 | /// @param {map} $map Map. 41 | /// @param {string} $keys Key(s). 42 | /// @return {string} Value. 43 | @function val($map, $keys...) { 44 | 45 | @if nth($keys, 1) == null { 46 | $keys: remove-nth($keys, 1); 47 | } 48 | 49 | @each $key in $keys { 50 | $map: map-get($map, $key); 51 | } 52 | 53 | @return $map; 54 | 55 | } 56 | 57 | /// Gets a duration value. 58 | /// @param {string} $keys Key(s). 59 | /// @return {string} Value. 60 | @function _duration($keys...) { 61 | @return val($duration, $keys...); 62 | } 63 | 64 | /// Gets a font value. 65 | /// @param {string} $keys Key(s). 66 | /// @return {string} Value. 67 | @function _font($keys...) { 68 | @return val($font, $keys...); 69 | } 70 | 71 | /// Gets a misc value. 72 | /// @param {string} $keys Key(s). 73 | /// @return {string} Value. 74 | @function _misc($keys...) { 75 | @return val($misc, $keys...); 76 | } 77 | 78 | /// Gets a palette value. 79 | /// @param {string} $keys Key(s). 80 | /// @return {string} Value. 81 | @function _palette($keys...) { 82 | @return val($palette, $keys...); 83 | } 84 | 85 | /// Gets a size value. 86 | /// @param {string} $keys Key(s). 87 | /// @return {string} Value. 88 | @function _size($keys...) { 89 | @return val($size, $keys...); 90 | } -------------------------------------------------------------------------------- /app/assets/js/breakpoints.min.js: -------------------------------------------------------------------------------- 1 | /* breakpoints.js v1.0 | @ajlkn | MIT licensed */ 2 | var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e 2 |
3 |
4 |

Lista de correo

5 | 6 |

Si queres recibir novedades relacionadas al avance del proyecto así como iniciativas organizadas 7 | por la comunidad, podes suscribirte acá:

8 |
9 |
10 |
11 | 12 |
13 | 14 |
15 |
    16 |
  • 17 |
18 |
19 |
20 |
21 |

Seguínos

22 | 37 |
38 | 43 |
44 | 45 | -------------------------------------------------------------------------------- /app/templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | #AgendaDigital Paraguay {% block title %}{% endblock %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 33 | 34 | 51 | 52 |
53 | {% block body %}{% endblock %} 54 |
55 | {% include "footer.html" %} 56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /app/assets/js/linkify-jquery.min.js: -------------------------------------------------------------------------------- 1 | "use strict";!function(e,n,t){var i=function(n){function t(e,n,t){var i=t[t.length-1];e.replaceChild(i,n);for(var a=t.length-2;a>=0;a--)e.insertBefore(t[a],i),i=t[a]}function i(e,n,t){for(var i=[],a=e,r=Array.isArray(a),o=0,a=r?a:a[Symbol.iterator]();;){var l;if(r){if(o>=a.length)break;l=a[o++]}else{if(o=a.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&n.nl2br)i.push(t.createElement("br"));else if(f.isLink&&n.check(f)){var s=n.resolve(f),c=s.formatted,u=s.formattedHref,y=s.tagName,d=s.className,m=s.target,k=s.events,h=s.attributes,v=t.createElement(y);if(v.setAttribute("href",u),d&&v.setAttribute("class",d),m&&v.setAttribute("target",m),h)for(var g in h)v.setAttribute(g,h[g]);if(k)for(var b in k)v.addEventListener?v.addEventListener(b,k[b]):v.attachEvent&&v.attachEvent("on"+b,k[b]);v.appendChild(t.createTextNode(c)),i.push(v)}else i.push(t.createTextNode(f.toString()))}return i}function a(e,n,r){if(!e||e.nodeType!==u)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=n.ignoreTags;if("A"===e.tagName||f.contains(o,e.tagName))return e;for(var s=e.firstChild;s;){var d=void 0,m=void 0,k=void 0;switch(s.nodeType){case u:a(s,n,r);break;case y:if(d=s.nodeValue,m=l(d),0===m.length||1===m.length&&m[0]instanceof c)break;k=i(m,n,r),t(e,s,k),s=k[k.length-1]}s=s.nextSibling}return e}function r(n,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return t=new s(t),a(n,t,i)}function o(n){function t(e){return e=r.normalize(e),this.each(function(){r.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];n.fn=n.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(a){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof n.fn.linkify&&(n.fn.linkify=t,n(i).ready(function(){n("[data-linkify]").each(function(){var e=n(this),t=e.data(),i=t.linkify,a=t.linkifyNlbr,o={nl2br:!!a&&0!==a&&"false"!==a};"linkifyAttributes"in t&&(o.attributes=t.linkifyAttributes),"linkifyDefaultProtocol"in t&&(o.defaultProtocol=t.linkifyDefaultProtocol),"linkifyEvents"in t&&(o.events=t.linkifyEvents),"linkifyFormat"in t&&(o.format=t.linkifyFormat),"linkifyFormatHref"in t&&(o.formatHref=t.linkifyFormatHref),"linkifyTagname"in t&&(o.tagName=t.linkifyTagname),"linkifyTarget"in t&&(o.target=t.linkifyTarget),"linkifyValidate"in t&&(o.validate=t.linkifyValidate),"linkifyIgnoreTags"in t&&(o.ignoreTags=t.linkifyIgnoreTags),"linkifyClassName"in t?o.className=t.linkifyClassName:"linkifyLinkclass"in t&&(o.className=t.linkifyLinkclass),o=r.normalize(o);var l="this"===i?e:e.find(i);l.linkify(o)})}))}var l=n.tokenize,f=n.options,s=f.Options,c=n.parser.TOKENS.TEXT,u=1,y=3;r.helper=a,r.normalize=function(e){return new s(e)};try{!(void 0).define&&(e.linkifyElement=r)}catch(d){}return o}(n);"function"!=typeof t.fn.linkify&&i(t)}(window,linkify,jQuery); -------------------------------------------------------------------------------- /app/assets/sass/layout/_footer.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Footer */ 8 | 9 | #footer { 10 | $gutter: _size(gutter); 11 | 12 | @include padding(5em, 0, (0, 0, 3em, 0)); 13 | background-color: _palette(bg-alt); 14 | 15 | > .inner { 16 | @include vendor('display', 'flex'); 17 | @include vendor('flex-wrap', 'wrap'); 18 | @include vendor('flex-direction', 'row'); 19 | 20 | > * > :last-child { 21 | margin-bottom: 0; 22 | } 23 | 24 | section:nth-child(1) { 25 | width: calc(66% - #{$gutter}); 26 | margin-right: $gutter; 27 | } 28 | 29 | section:nth-child(2) { 30 | width: calc(33% - #{$gutter}); 31 | margin-left: $gutter; 32 | } 33 | 34 | .copyright { 35 | width: 100%; 36 | padding: 0; 37 | margin-top: 5em; 38 | list-style: none; 39 | font-size: 0.8em; 40 | color: transparentize(_palette(fg), 0.5); 41 | 42 | a { 43 | color: inherit; 44 | } 45 | 46 | li { 47 | display: inline-block; 48 | border-left: solid 1px transparentize(_palette(fg), 0.85); 49 | line-height: 1; 50 | padding: 0 0 0 1em; 51 | margin: 0 0 0 1em; 52 | 53 | &:first-child { 54 | border-left: 0; 55 | padding-left: 0; 56 | margin-left: 0; 57 | } 58 | } 59 | } 60 | } 61 | 62 | @include breakpoint('<=large') { 63 | $gutter: _size(gutter) * 0.5; 64 | 65 | @include padding(5em, 0); 66 | 67 | > .inner { 68 | section:nth-child(1) { 69 | width: calc(66% - #{$gutter}); 70 | margin-right: $gutter; 71 | } 72 | 73 | section:nth-child(2) { 74 | width: calc(33% - #{$gutter}); 75 | margin-left: $gutter; 76 | } 77 | } 78 | } 79 | 80 | @include breakpoint('<=medium') { 81 | $gutter: _size(gutter); 82 | 83 | > .inner { 84 | section:nth-child(1) { 85 | width: 66%; 86 | margin-right: 0; 87 | } 88 | 89 | section:nth-child(2) { 90 | width: calc(33% - #{$gutter}); 91 | margin-left: $gutter; 92 | } 93 | } 94 | } 95 | 96 | @include breakpoint('<=small') { 97 | @include padding(3em, 0); 98 | 99 | > .inner { 100 | @include vendor('flex-direction', 'column'); 101 | 102 | section:nth-child(1) { 103 | width: 100%; 104 | margin-right: 0; 105 | margin: 3em 0 0 0; 106 | } 107 | 108 | section:nth-child(2) { 109 | @include vendor('order', '-1'); 110 | width: 100%; 111 | margin-left: 0; 112 | } 113 | 114 | .copyright { 115 | margin-top: 3em; 116 | } 117 | } 118 | } 119 | 120 | @include breakpoint('<=xsmall') { 121 | > .inner { 122 | .copyright { 123 | margin-top: 3em; 124 | 125 | li { 126 | border-left: 0; 127 | padding-left: 0; 128 | margin: 0.75em 0 0 0; 129 | display: block; 130 | line-height: inherit; 131 | 132 | &:first-child { 133 | margin-top: 0; 134 | } 135 | } 136 | } 137 | } 138 | } 139 | } -------------------------------------------------------------------------------- /app/assets/sass/libs/_html-grid.scss: -------------------------------------------------------------------------------- 1 | // html-grid.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Mixins. 4 | 5 | /// Initializes the current element as an HTML grid. 6 | /// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually). 7 | /// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list). 8 | @mixin html-grid($gutters: 1.5em, $suffix: '') { 9 | 10 | // Initialize. 11 | $cols: 12; 12 | $multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00; 13 | $unit: 100% / $cols; 14 | 15 | // Suffixes. 16 | $suffixes: null; 17 | 18 | @if (type-of($suffix) == 'list') { 19 | $suffixes: $suffix; 20 | } 21 | @else { 22 | $suffixes: ($suffix); 23 | } 24 | 25 | // Gutters. 26 | $guttersCols: null; 27 | $guttersRows: null; 28 | 29 | @if (type-of($gutters) == 'list') { 30 | 31 | $guttersCols: nth($gutters, 1); 32 | $guttersRows: nth($gutters, 2); 33 | 34 | } 35 | @else { 36 | 37 | $guttersCols: $gutters; 38 | $guttersRows: 0; 39 | 40 | } 41 | 42 | // Row. 43 | display: flex; 44 | flex-wrap: wrap; 45 | box-sizing: border-box; 46 | align-items: stretch; 47 | 48 | // Columns. 49 | > * { 50 | box-sizing: border-box; 51 | } 52 | 53 | // Gutters. 54 | &.gtr-uniform { 55 | > * { 56 | > :last-child { 57 | margin-bottom: 0; 58 | } 59 | } 60 | } 61 | 62 | // Alignment. 63 | &.aln-left { 64 | justify-content: flex-start; 65 | } 66 | 67 | &.aln-center { 68 | justify-content: center; 69 | } 70 | 71 | &.aln-right { 72 | justify-content: flex-end; 73 | } 74 | 75 | &.aln-top { 76 | align-items: flex-start; 77 | } 78 | 79 | &.aln-middle { 80 | align-items: center; 81 | } 82 | 83 | &.aln-bottom { 84 | align-items: flex-end; 85 | } 86 | 87 | // Step through suffixes. 88 | @each $suffix in $suffixes { 89 | 90 | // Suffix. 91 | @if ($suffix != '') { 92 | $suffix: '-' + $suffix; 93 | } 94 | @else { 95 | $suffix: ''; 96 | } 97 | 98 | // Row. 99 | 100 | // Important. 101 | > .imp#{$suffix} { 102 | order: -1; 103 | } 104 | 105 | // Columns, offsets. 106 | @for $i from 1 through $cols { 107 | > .col-#{$i}#{$suffix} { 108 | width: $unit * $i; 109 | } 110 | 111 | > .off-#{$i}#{$suffix} { 112 | margin-left: $unit * $i; 113 | } 114 | } 115 | 116 | // Step through multipliers. 117 | @each $multiplier in $multipliers { 118 | 119 | // Gutters. 120 | $class: null; 121 | 122 | @if ($multiplier != 1) { 123 | $class: '.gtr-' + ($multiplier * 100); 124 | } 125 | 126 | &#{$class} { 127 | margin-top: ($guttersRows * $multiplier * -1); 128 | margin-left: ($guttersCols * $multiplier * -1); 129 | 130 | > * { 131 | padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier); 132 | } 133 | 134 | // Uniform. 135 | &.gtr-uniform { 136 | margin-top: $guttersCols * $multiplier * -1; 137 | 138 | > * { 139 | padding-top: $guttersCols * $multiplier; 140 | } 141 | } 142 | 143 | } 144 | 145 | } 146 | 147 | } 148 | 149 | } -------------------------------------------------------------------------------- /app/templates/principal.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block body %} 3 |
4 |
5 |

Buscamos transparentar la #AgendaDigital en Paraguay

6 |

7 | Este es un sitio creado por la comunidad donde podrás explorar los desarrollos y las metas 8 | detrás del proyecto. 9 |

10 |

11 | Toda la información expuesta aquí se basa en la documentación proveída por el BID 12 | (Banco Interamericano de Desarrollo) y está sujeta a cambios. 13 |

14 |

15 | Queremos divulgar el proyecto e incentivar propuestas y discusiones por parte de la comunidad 16 | técnica y la ciudadanía en general. 17 |

18 |

La falta de continuidad en políticas públicas relacionadas con tecnología y la poca inversión han 19 | impactado mucho en nuestro país. No debemos perder la oportunidad de convertir esto en algo útil 20 | para las futuras generaciones. 21 |

22 | 25 |

Si no sabes en qué consiste la agenda digital, podes empezar leyendo este 27 | artículo. Y posteriormente explorar los componentes del proyecto:

28 |
29 |
30 | 42 | 54 | 65 | 77 |
78 |
79 |
80 |

Documentación y seguimiento

81 |

En este enlace disponibilizamos toda la documentación pública que 82 | existe sobre el proyecto #AgendaDigital

83 |

Planeamos realizar un seguimiento de los avances de este proyecto y nos gustaría hacerlo parte de 84 | este sitio.

85 |

Las solicitudes de información pública asociadas a MITIC se encuentran aquí.

86 |
87 | 88 |
89 | 90 |
91 |
92 | {% endblock body %} 93 | -------------------------------------------------------------------------------- /app/templates/conectividad.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Componente 3: Conectividad{% endblock %} 3 | {% block body %} 4 |
5 |

Componente 3: Conectividad

6 |

Este componente busca la extensión del uso de banda ancha y mejora de su calidad y precio. El monto 7 | previsto es de US$ 47.9 millones.

8 |

La distribución del presupuesto en los distintos productos se detalla a continuación, posteriormente 9 | incluimos la descripción e indicadores de cada uno:

10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 |

Productos, indicadores y resultados esperados

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 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
ComponenteUnidad de medidaLínea de baseAño 1Año 2Año 3Año 4Año 5Año 6TotalMedios de verificaciónComentarios
Producto 18: Sitios y edificios públicos conectadosCantidad de sitios--70931211042641IPP
Producto 19: Data Center operandoCantidad de Data Centers------11IPP
Producto 20: Derechos de uso para conectividad internacional, adquiridos 67 | Cantidad de gigabytes por segundo----100--100Reportes de certificación de servicios
82 |
83 |
84 |
85 |

86 | Volver al inicio 87 | Ir a propuestas 88 |

89 |
90 | 91 |
92 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/sass/layout/_header.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Header */ 8 | 9 | #header { 10 | @include padding(5em, 0, (3em, 0, -5em, 0)); 11 | 12 | .logo { 13 | display: block; 14 | border-bottom: 0; 15 | color: inherit; 16 | font-weight: _font(weight-bold); 17 | letter-spacing: _font(letter-spacing); 18 | margin: 0 0 (_size(element-margin) * 1.25) 0; 19 | text-decoration: none; 20 | text-transform: uppercase; 21 | display: inline-block; 22 | 23 | > * { 24 | display: inline-block; 25 | vertical-align: middle; 26 | } 27 | 28 | .symbol { 29 | margin-right: 0.65em; 30 | 31 | img { 32 | display: block; 33 | width: 2em; 34 | height: 2em; 35 | } 36 | } 37 | } 38 | 39 | nav { 40 | position: fixed; 41 | right: 2em; 42 | top: 2em; 43 | z-index: _misc(z-index-base); 44 | 45 | ul { 46 | @include vendor('display', 'flex'); 47 | @include vendor('align-items', 'center'); 48 | list-style: none; 49 | margin: 0; 50 | padding: 0; 51 | 52 | li { 53 | display: block; 54 | padding: 0; 55 | 56 | a { 57 | display: block; 58 | position: relative; 59 | height: 3em; 60 | line-height: 3em; 61 | padding: 0 1.5em; 62 | background-color: transparentize(_palette(bg), 0.5); 63 | border-radius: _size(border-radius); 64 | border: 0; 65 | font-size: 0.8em; 66 | font-weight: _font(weight-bold); 67 | letter-spacing: _font(letter-spacing); 68 | text-transform: uppercase; 69 | } 70 | 71 | a[href="#menu"] { 72 | -webkit-tap-highlight-color: transparent; 73 | width: 4em; 74 | text-indent: 4em; 75 | font-size: 1em; 76 | overflow: hidden; 77 | padding: 0; 78 | white-space: nowrap; 79 | 80 | &:before, &:after { 81 | @include vendor('transition', 'opacity #{_duration(transition)} ease'); 82 | content: ''; 83 | display: block; 84 | position: absolute; 85 | top: 0; 86 | left: 0; 87 | width: 100%; 88 | height: 100%; 89 | background-position: center; 90 | background-repeat: no-repeat; 91 | background-size: 2em 2em; 92 | } 93 | 94 | &:before { 95 | background-image: svg-url(''); 96 | opacity: 0; 97 | } 98 | 99 | &:after { 100 | background-image: svg-url(''); 101 | opacity: 1; 102 | } 103 | 104 | &:hover { 105 | &:before { 106 | opacity: 1; 107 | } 108 | 109 | &:after { 110 | opacity: 0; 111 | } 112 | } 113 | } 114 | } 115 | } 116 | } 117 | 118 | @include breakpoint('<=small') { 119 | @include padding(3em, 0, (1em, 0, -3em, 0)); 120 | 121 | nav { 122 | right: 0.5em; 123 | top: 0.5em; 124 | 125 | ul { 126 | li { 127 | a[href="#menu"] { 128 | &:before, &:after { 129 | background-size: 1.5em 1.5em; 130 | } 131 | } 132 | } 133 | } 134 | } 135 | } 136 | } -------------------------------------------------------------------------------- /app/main.py: -------------------------------------------------------------------------------- 1 | 2 | from email.utils import parseaddr 3 | from flask import Flask, request, render_template, send_from_directory 4 | from flask import Response 5 | from flask_pymongo import PyMongo, ASCENDING, DESCENDING 6 | from bson.objectid import ObjectId 7 | 8 | from bs4 import BeautifulSoup 9 | 10 | 11 | app = Flask(__name__, static_url_path='') 12 | 13 | app.config["MONGO_URI"] = "mongodb://localhost:27017/agendadigitalpy" 14 | mongo = PyMongo(app) 15 | 16 | 17 | @app.route('/assets/') 18 | def send_assets(path): 19 | return send_from_directory('assets', path) 20 | 21 | 22 | @app.route('/') 23 | def index(): 24 | return render_template('principal.html') 25 | 26 | 27 | @app.route("/propuestas/<_id>") 28 | def show_proposal(_id): 29 | proposal = mongo.db.proposals.find_one({'_id': ObjectId(_id)}) 30 | return render_template("propuesta.html", proposal=proposal) 31 | 32 | 33 | @app.route('/propuestas', methods=['GET']) 34 | def getProps(): 35 | msg = {} 36 | proposals = mongo.db.proposals.find().sort('_id', DESCENDING) 37 | return render_template("propuestas.html", proposals=proposals, message=msg) 38 | 39 | # TODO: validar e-mail 40 | @app.route('/propuestas', methods=['POST']) 41 | def createProposal(): 42 | name = remove_html(request.form["name"]) 43 | email = remove_html(request.form["email"]) 44 | category = request.form["category"] 45 | try: 46 | category = int(category) 47 | if category > 4: 48 | category = 0 49 | except ValueError: 50 | category = 0 51 | title = remove_html(request.form["title"]) 52 | content = remove_html(request.form["content"]) 53 | p = { 54 | 'name': name, 55 | 'email': email, 56 | 'category': category, 57 | 'title': title, 58 | 'content': content, 59 | 'approved': True 60 | } 61 | 62 | msg = {} 63 | if len(parseaddr(p["email"][1])) == 0: 64 | msg["text"] = "Email invalido." 65 | msg["success"] = False 66 | else: 67 | msg["success"] = True 68 | mongo.db.proposals.insert(p) 69 | 70 | proposals = mongo.db.proposals.find().sort('_id', DESCENDING) 71 | return render_template("propuestas.html", proposals=proposals, message=msg) 72 | 73 | 74 | def remove_html(s): 75 | soup = BeautifulSoup(s) 76 | return soup.get_text() 77 | 78 | 79 | @app.route('/conectividad') 80 | def getConectividad(): 81 | return render_template("conectividad.html") 82 | 83 | 84 | @app.route('/documentacion') 85 | def getDocumentacion(): 86 | return render_template("documentacion.html") 87 | 88 | @app.route('/preguntas-frecuentes') 89 | def getFaq(): 90 | return render_template("faq.html") 91 | 92 | @app.route('/economia-digital') 93 | def getEconomia_Digital(): 94 | return render_template("economia-digital.html") 95 | 96 | 97 | @app.route('/fortalecimiento-institucional') 98 | def getFortalecimieto_digital(): 99 | return render_template("fortalecimiento-institucional.html") 100 | 101 | 102 | @app.route('/gobierno-digital') 103 | def getGobierno_digital(): 104 | return render_template("gobierno-digital.html") 105 | 106 | @app.route('/objetivo-general') 107 | def getObjetivo_general(): 108 | return render_template("objetivo-general.html") 109 | 110 | @app.route('/seguimiento') 111 | def getSeguimiento(): 112 | return render_template("seguimiento.html") 113 | 114 | 115 | @app.route('/solicitudes') 116 | def getSolicitudes(): 117 | return render_template("solicitudes.html") 118 | 119 | 120 | cats = ['General', 'Gobierno Digital', 'Economía Digital', 121 | 'Conectividad', 'Fortalecimiento Institucional'] 122 | 123 | 124 | @app.template_filter('category_name') 125 | def category_name(n): 126 | return cats[n] 127 | 128 | 129 | @app.template_filter('proposal_date') 130 | def proposal_date(i): 131 | return i.generation_time.strftime('%d/%m/%y') 132 | 133 | 134 | @app.template_filter('content_filter') 135 | def content_filter(s): 136 | s = s.replace("\n", "
") 137 | return s 138 | 139 | 140 | if __name__ == '__main__': 141 | app.run(debug=True) 142 | -------------------------------------------------------------------------------- /app/assets/sass/base/_typography.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Type */ 8 | 9 | body, input, select, textarea { 10 | color: _palette(fg); 11 | font-family: _font(family); 12 | font-size: 16pt; 13 | font-weight: _font(weight); 14 | line-height: 1.75; 15 | 16 | @include breakpoint('<=xlarge') { 17 | font-size: 14pt; 18 | } 19 | 20 | @include breakpoint('<=large') { 21 | font-size: 12pt; 22 | } 23 | } 24 | 25 | a { 26 | @include vendor('transition', ( 27 | 'border-bottom-color #{_duration(transition)} ease', 28 | 'color #{_duration(transition)} ease' 29 | )); 30 | text-decoration: none; 31 | color: _palette(fg); 32 | border-bottom: dotted 1px transparentize(_palette(fg), 0.5); 33 | 34 | &:hover { 35 | border-bottom-color: transparent; 36 | color: _palette(accent1) !important; 37 | } 38 | } 39 | 40 | strong, b { 41 | color: _palette(fg-bold); 42 | font-weight: _font(weight-bold); 43 | } 44 | 45 | em, i { 46 | font-style: italic; 47 | } 48 | 49 | p { 50 | margin: 0 0 _size(element-margin) 0; 51 | } 52 | 53 | h1 { 54 | font-size: 2.75em; 55 | color: _palette(fg-bold); 56 | font-weight: _font(weight-bold-alt); 57 | line-height: 1.3; 58 | margin: 0 0 (_size(element-margin) * 0.5) 0; 59 | letter-spacing: _font(letter-spacing-alt); 60 | 61 | a { 62 | color: inherit; 63 | } 64 | 65 | @include breakpoint('<=small') { 66 | font-size: 2em; 67 | margin: 0 0 (_size(element-margin) * 0.5) 0; 68 | } 69 | 70 | @include breakpoint('<=xxsmall') { 71 | font-size: 1.75em; 72 | } 73 | } 74 | 75 | h2, h3, h4, h5, h6 { 76 | color: _palette(fg-bold); 77 | font-weight: _font(weight-bold); 78 | line-height: 1.5; 79 | margin: 0 0 (_size(element-margin) * 1) 0; 80 | text-transform: uppercase; 81 | letter-spacing: _font(letter-spacing); 82 | 83 | a { 84 | color: inherit; 85 | } 86 | } 87 | 88 | h2 { 89 | font-size: 1.1em; 90 | } 91 | 92 | h3 { 93 | font-size: 1em; 94 | } 95 | 96 | h4 { 97 | font-size: 0.8em; 98 | } 99 | 100 | h5 { 101 | font-size: 0.8em; 102 | } 103 | 104 | h6 { 105 | font-size: 0.8em; 106 | } 107 | 108 | @include breakpoint('<=medium') { 109 | h1, h2, h3, h4, h5, h6 { 110 | br { 111 | display: none; 112 | } 113 | } 114 | } 115 | 116 | @include breakpoint('<=small') { 117 | h2 { 118 | font-size: 1em; 119 | } 120 | 121 | h3 { 122 | font-size: 0.8em; 123 | } 124 | } 125 | 126 | sub { 127 | font-size: 0.8em; 128 | position: relative; 129 | top: 0.5em; 130 | } 131 | 132 | sup { 133 | font-size: 0.8em; 134 | position: relative; 135 | top: -0.5em; 136 | } 137 | 138 | blockquote { 139 | border-left: solid (_size(border-width) * 4) _palette(border); 140 | font-style: italic; 141 | margin: 0 0 _size(element-margin) 0; 142 | padding: (_size(element-margin) / 4) 0 (_size(element-margin) / 4) _size(element-margin); 143 | } 144 | 145 | code { 146 | background: _palette(border-bg); 147 | border-radius: _size(border-radius); 148 | border: solid _size(border-width) _palette(border); 149 | font-family: _font(family-fixed); 150 | font-size: 0.9em; 151 | margin: 0 0.25em; 152 | padding: 0.25em 0.65em; 153 | } 154 | 155 | pre { 156 | -webkit-overflow-scrolling: touch; 157 | font-family: _font(family-fixed); 158 | font-size: 0.9em; 159 | margin: 0 0 _size(element-margin) 0; 160 | 161 | code { 162 | display: block; 163 | line-height: 1.75; 164 | padding: 1em 1.5em; 165 | overflow-x: auto; 166 | } 167 | } 168 | 169 | hr { 170 | border: 0; 171 | border-bottom: solid _size(border-width) _palette(border); 172 | margin: _size(element-margin) 0; 173 | 174 | &.major { 175 | margin: (_size(element-margin) * 1.5) 0; 176 | } 177 | } 178 | 179 | .align-left { 180 | text-align: left; 181 | } 182 | 183 | .align-center { 184 | text-align: center; 185 | } 186 | 187 | .align-right { 188 | text-align: right; 189 | } -------------------------------------------------------------------------------- /app/assets/js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | Phantom by HTML5 UP 3 | html5up.net | @ajlkn 4 | Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | */ 6 | 7 | (function($) { 8 | 9 | var $window = $(window), 10 | $body = $('body'); 11 | 12 | // Breakpoints. 13 | breakpoints({ 14 | xlarge: [ '1281px', '1680px' ], 15 | large: [ '981px', '1280px' ], 16 | medium: [ '737px', '980px' ], 17 | small: [ '481px', '736px' ], 18 | xsmall: [ '361px', '480px' ], 19 | xxsmall: [ null, '360px' ] 20 | }); 21 | 22 | // Play initial animations on page load. 23 | $window.on('load', function() { 24 | window.setTimeout(function() { 25 | $body.removeClass('is-preload'); 26 | }, 100); 27 | }); 28 | 29 | // Touch? 30 | if (browser.mobile) 31 | $body.addClass('is-touch'); 32 | 33 | // Forms. 34 | var $form = $('form'); 35 | 36 | // Auto-resizing textareas. 37 | $form.find('textarea').each(function() { 38 | 39 | var $this = $(this), 40 | $wrapper = $('
'), 41 | $submits = $this.find('input[type="submit"]'); 42 | 43 | $this 44 | .wrap($wrapper) 45 | .attr('rows', 1) 46 | .css('overflow', 'hidden') 47 | .css('resize', 'none') 48 | .on('keydown', function(event) { 49 | 50 | if (event.keyCode == 13 51 | && event.ctrlKey) { 52 | 53 | event.preventDefault(); 54 | event.stopPropagation(); 55 | 56 | $(this).blur(); 57 | 58 | } 59 | 60 | }) 61 | .on('blur focus', function() { 62 | $this.val($.trim($this.val())); 63 | }) 64 | .on('input blur focus --init', function() { 65 | 66 | $wrapper 67 | .css('height', $this.height()); 68 | 69 | $this 70 | .css('height', 'auto') 71 | .css('height', $this.prop('scrollHeight') + 'px'); 72 | 73 | }) 74 | .on('keyup', function(event) { 75 | 76 | if (event.keyCode == 9) 77 | $this 78 | .select(); 79 | 80 | }) 81 | .triggerHandler('--init'); 82 | 83 | // Fix. 84 | if (browser.name == 'ie' 85 | || browser.mobile) 86 | $this 87 | .css('max-height', '10em') 88 | .css('overflow-y', 'auto'); 89 | 90 | }); 91 | 92 | // Menu. 93 | var $menu = $('#menu'); 94 | 95 | $menu.wrapInner('
'); 96 | 97 | $menu._locked = false; 98 | 99 | $menu._lock = function() { 100 | 101 | if ($menu._locked) 102 | return false; 103 | 104 | $menu._locked = true; 105 | 106 | window.setTimeout(function() { 107 | $menu._locked = false; 108 | }, 350); 109 | 110 | return true; 111 | 112 | }; 113 | 114 | $menu._show = function() { 115 | 116 | if ($menu._lock()) 117 | $body.addClass('is-menu-visible'); 118 | 119 | }; 120 | 121 | $menu._hide = function() { 122 | 123 | if ($menu._lock()) 124 | $body.removeClass('is-menu-visible'); 125 | 126 | }; 127 | 128 | $menu._toggle = function() { 129 | 130 | if ($menu._lock()) 131 | $body.toggleClass('is-menu-visible'); 132 | 133 | }; 134 | 135 | $menu 136 | .appendTo($body) 137 | .on('click', function(event) { 138 | event.stopPropagation(); 139 | }) 140 | .on('click', 'a', function(event) { 141 | 142 | var href = $(this).attr('href'); 143 | 144 | event.preventDefault(); 145 | event.stopPropagation(); 146 | 147 | // Hide. 148 | $menu._hide(); 149 | 150 | // Redirect. 151 | if (href == '#menu') 152 | return; 153 | 154 | window.setTimeout(function() { 155 | window.location.href = href; 156 | }, 350); 157 | 158 | }) 159 | .append('Close'); 160 | 161 | $body 162 | .on('click', 'a[href="#menu"]', function(event) { 163 | 164 | event.stopPropagation(); 165 | event.preventDefault(); 166 | 167 | // Toggle. 168 | $menu._toggle(); 169 | 170 | }) 171 | .on('click', function(event) { 172 | 173 | // Hide. 174 | $menu._hide(); 175 | 176 | }) 177 | .on('keydown', function(event) { 178 | 179 | // Hide on escape. 180 | if (event.keyCode == 27) 181 | $menu._hide(); 182 | 183 | }); 184 | 185 | })(jQuery); -------------------------------------------------------------------------------- /app/assets/sass/layout/_menu.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Menu */ 8 | 9 | #wrapper { 10 | @include vendor('transition', 'opacity #{_duration(menu)} ease'); 11 | opacity: 1; 12 | } 13 | 14 | #menu { 15 | @include vendor('transform', 'translateX(#{_size(menu)})'); 16 | @include vendor('transition', ('transform #{_duration(menu)} ease', 'visibility #{_duration(menu)}')); 17 | position: fixed; 18 | top: 0; 19 | right: 0; 20 | width: _size(menu); 21 | max-width: 80%; 22 | height: 100%; 23 | -webkit-overflow-scrolling: touch; 24 | background: _palette(fg); 25 | color: _palette(bg); 26 | cursor: default; 27 | visibility: hidden; 28 | z-index: _misc(z-index-base) + 2; 29 | 30 | > .inner { 31 | @include vendor('transition', 'opacity #{_duration(menu)} ease'); 32 | -webkit-overflow-scrolling: touch; 33 | position: absolute; 34 | top: 0; 35 | left: 0; 36 | width: 100%; 37 | height: 100%; 38 | padding: 2.75em; 39 | opacity: 0; 40 | overflow-y: auto; 41 | 42 | > ul { 43 | list-style: none; 44 | margin: 0 0 (_size(element-margin) * 0.5) 0; 45 | padding: 0; 46 | 47 | > li { 48 | padding: 0; 49 | border-top: solid 1px transparentize(_palette(bg), 0.85); 50 | 51 | a { 52 | display: block; 53 | padding: 1em 0; 54 | line-height: 1.5; 55 | border: 0; 56 | color: inherit; 57 | } 58 | 59 | &:first-child { 60 | border-top: 0; 61 | margin-top: -1em; 62 | } 63 | } 64 | } 65 | } 66 | 67 | > .close { 68 | @include vendor('transition', ( 69 | 'opacity #{_duration(menu)} ease', 70 | 'transform #{_duration(menu)} ease' 71 | )); 72 | @include vendor('transform', 'scale(0.25) rotate(180deg)'); 73 | -webkit-tap-highlight-color: transparent; 74 | display: block; 75 | position: absolute; 76 | top: 2em; 77 | left: -6em; 78 | width: 6em; 79 | text-indent: 6em; 80 | height: 3em; 81 | border: 0; 82 | font-size: 1em; 83 | opacity: 0; 84 | overflow: hidden; 85 | padding: 0; 86 | white-space: nowrap; 87 | 88 | &:before, &:after { 89 | @include vendor('transition', 'opacity #{_duration(transition)} ease'); 90 | content: ''; 91 | display: block; 92 | position: absolute; 93 | top: 0; 94 | left: 0; 95 | width: 100%; 96 | height: 100%; 97 | background-position: center; 98 | background-repeat: no-repeat; 99 | background-size: 2em 2em; 100 | } 101 | 102 | &:before { 103 | background-image: svg-url(''); 104 | opacity: 0; 105 | } 106 | 107 | &:after { 108 | background-image: svg-url(''); 109 | opacity: 1; 110 | } 111 | 112 | &:hover { 113 | &:before { 114 | opacity: 1; 115 | } 116 | 117 | &:after { 118 | opacity: 0; 119 | } 120 | } 121 | } 122 | 123 | @include breakpoint('<=small') { 124 | @include vendor('transform', 'translateX(#{_size(menu) * 0.75})'); 125 | width: (_size(menu) * 0.75); 126 | 127 | > .inner { 128 | padding: 2.75em 1.5em; 129 | } 130 | 131 | > .close { 132 | top: 0.5em; 133 | left: -4.25em; 134 | width: 4.25em; 135 | text-indent: 4.25em; 136 | 137 | &:before, &:after { 138 | background-size: 1.5em 1.5em; 139 | } 140 | } 141 | } 142 | } 143 | 144 | body.is-menu-visible { 145 | #wrapper { 146 | @include vendor('pointer-events', 'none'); 147 | cursor: default; 148 | opacity: 0.25; 149 | } 150 | 151 | #menu { 152 | @include vendor('transform', 'translateX(0)'); 153 | visibility: visible; 154 | 155 | > * { 156 | opacity: 1; 157 | } 158 | 159 | .close { 160 | @include vendor('transform', 'scale(1.0) rotate(0deg)'); 161 | opacity: 1; 162 | } 163 | } 164 | } -------------------------------------------------------------------------------- /app/assets/sass/libs/_breakpoints.scss: -------------------------------------------------------------------------------- 1 | // breakpoints.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Vars. 4 | 5 | /// Breakpoints. 6 | /// @var {list} 7 | $breakpoints: () !global; 8 | 9 | // Mixins. 10 | 11 | /// Sets breakpoints. 12 | /// @param {map} $x Breakpoints. 13 | @mixin breakpoints($x: ()) { 14 | $breakpoints: $x !global; 15 | } 16 | 17 | /// Wraps @content in a @media block targeting a specific orientation. 18 | /// @param {string} $orientation Orientation. 19 | @mixin orientation($orientation) { 20 | @media screen and (orientation: #{$orientation}) { 21 | @content; 22 | } 23 | } 24 | 25 | /// Wraps @content in a @media block using a given query. 26 | /// @param {string} $query Query. 27 | @mixin breakpoint($query: null) { 28 | 29 | $breakpoint: null; 30 | $op: null; 31 | $media: null; 32 | 33 | // Determine operator, breakpoint. 34 | 35 | // Greater than or equal. 36 | @if (str-slice($query, 0, 2) == '>=') { 37 | 38 | $op: 'gte'; 39 | $breakpoint: str-slice($query, 3); 40 | 41 | } 42 | 43 | // Less than or equal. 44 | @elseif (str-slice($query, 0, 2) == '<=') { 45 | 46 | $op: 'lte'; 47 | $breakpoint: str-slice($query, 3); 48 | 49 | } 50 | 51 | // Greater than. 52 | @elseif (str-slice($query, 0, 1) == '>') { 53 | 54 | $op: 'gt'; 55 | $breakpoint: str-slice($query, 2); 56 | 57 | } 58 | 59 | // Less than. 60 | @elseif (str-slice($query, 0, 1) == '<') { 61 | 62 | $op: 'lt'; 63 | $breakpoint: str-slice($query, 2); 64 | 65 | } 66 | 67 | // Not. 68 | @elseif (str-slice($query, 0, 1) == '!') { 69 | 70 | $op: 'not'; 71 | $breakpoint: str-slice($query, 2); 72 | 73 | } 74 | 75 | // Equal. 76 | @else { 77 | 78 | $op: 'eq'; 79 | $breakpoint: $query; 80 | 81 | } 82 | 83 | // Build media. 84 | @if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { 85 | 86 | $a: map-get($breakpoints, $breakpoint); 87 | 88 | // Range. 89 | @if (type-of($a) == 'list') { 90 | 91 | $x: nth($a, 1); 92 | $y: nth($a, 2); 93 | 94 | // Max only. 95 | @if ($x == null) { 96 | 97 | // Greater than or equal (>= 0 / anything) 98 | @if ($op == 'gte') { 99 | $media: 'screen'; 100 | } 101 | 102 | // Less than or equal (<= y) 103 | @elseif ($op == 'lte') { 104 | $media: 'screen and (max-width: ' + $y + ')'; 105 | } 106 | 107 | // Greater than (> y) 108 | @elseif ($op == 'gt') { 109 | $media: 'screen and (min-width: ' + ($y + 1) + ')'; 110 | } 111 | 112 | // Less than (< 0 / invalid) 113 | @elseif ($op == 'lt') { 114 | $media: 'screen and (max-width: -1px)'; 115 | } 116 | 117 | // Not (> y) 118 | @elseif ($op == 'not') { 119 | $media: 'screen and (min-width: ' + ($y + 1) + ')'; 120 | } 121 | 122 | // Equal (<= y) 123 | @else { 124 | $media: 'screen and (max-width: ' + $y + ')'; 125 | } 126 | 127 | } 128 | 129 | // Min only. 130 | @else if ($y == null) { 131 | 132 | // Greater than or equal (>= x) 133 | @if ($op == 'gte') { 134 | $media: 'screen and (min-width: ' + $x + ')'; 135 | } 136 | 137 | // Less than or equal (<= inf / anything) 138 | @elseif ($op == 'lte') { 139 | $media: 'screen'; 140 | } 141 | 142 | // Greater than (> inf / invalid) 143 | @elseif ($op == 'gt') { 144 | $media: 'screen and (max-width: -1px)'; 145 | } 146 | 147 | // Less than (< x) 148 | @elseif ($op == 'lt') { 149 | $media: 'screen and (max-width: ' + ($x - 1) + ')'; 150 | } 151 | 152 | // Not (< x) 153 | @elseif ($op == 'not') { 154 | $media: 'screen and (max-width: ' + ($x - 1) + ')'; 155 | } 156 | 157 | // Equal (>= x) 158 | @else { 159 | $media: 'screen and (min-width: ' + $x + ')'; 160 | } 161 | 162 | } 163 | 164 | // Min and max. 165 | @else { 166 | 167 | // Greater than or equal (>= x) 168 | @if ($op == 'gte') { 169 | $media: 'screen and (min-width: ' + $x + ')'; 170 | } 171 | 172 | // Less than or equal (<= y) 173 | @elseif ($op == 'lte') { 174 | $media: 'screen and (max-width: ' + $y + ')'; 175 | } 176 | 177 | // Greater than (> y) 178 | @elseif ($op == 'gt') { 179 | $media: 'screen and (min-width: ' + ($y + 1) + ')'; 180 | } 181 | 182 | // Less than (< x) 183 | @elseif ($op == 'lt') { 184 | $media: 'screen and (max-width: ' + ($x - 1) + ')'; 185 | } 186 | 187 | // Not (< x and > y) 188 | @elseif ($op == 'not') { 189 | $media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')'; 190 | } 191 | 192 | // Equal (>= x and <= y) 193 | @else { 194 | $media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')'; 195 | } 196 | 197 | } 198 | 199 | } 200 | 201 | // String. 202 | @else { 203 | 204 | // Missing a media type? Prefix with "screen". 205 | @if (str-slice($a, 0, 1) == '(') { 206 | $media: 'screen and ' + $a; 207 | } 208 | 209 | // Otherwise, use as-is. 210 | @else { 211 | $media: $a; 212 | } 213 | 214 | } 215 | 216 | } 217 | 218 | // Output. 219 | @media #{$media} { 220 | @content; 221 | } 222 | 223 | } -------------------------------------------------------------------------------- /app/assets/sass/components/_form.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Form */ 8 | 9 | form { 10 | margin: 0 0 _size(element-margin) 0; 11 | overflow-x: hidden; 12 | 13 | > :last-child { 14 | margin-bottom: 0; 15 | } 16 | 17 | > .fields { 18 | $gutter: (_size(element-margin) * 0.75); 19 | 20 | @include vendor('display', 'flex'); 21 | @include vendor('flex-wrap', 'wrap'); 22 | width: calc(100% + #{$gutter * 2}); 23 | margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); 24 | 25 | > .field { 26 | @include vendor('flex-grow', '0'); 27 | @include vendor('flex-shrink', '0'); 28 | padding: $gutter 0 0 $gutter; 29 | width: calc(100% - #{$gutter * 1}); 30 | 31 | &.half { 32 | width: calc(50% - #{$gutter * 0.5}); 33 | } 34 | 35 | &.third { 36 | width: calc(#{100% / 3} - #{$gutter * (1 / 3)}); 37 | } 38 | 39 | &.quarter { 40 | width: calc(25% - #{$gutter * 0.25}); 41 | } 42 | } 43 | } 44 | 45 | @include breakpoint('<=xsmall') { 46 | > .fields { 47 | $gutter: (_size(element-margin) * 0.75); 48 | 49 | width: calc(100% + #{$gutter * 2}); 50 | margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); 51 | 52 | > .field { 53 | padding: $gutter 0 0 $gutter; 54 | width: calc(100% - #{$gutter * 1}); 55 | 56 | &.half { 57 | width: calc(100% - #{$gutter * 1}); 58 | } 59 | 60 | &.third { 61 | width: calc(100% - #{$gutter * 1}); 62 | } 63 | 64 | &.quarter { 65 | width: calc(100% - #{$gutter * 1}); 66 | } 67 | } 68 | } 69 | } 70 | } 71 | 72 | label { 73 | display: block; 74 | font-size: 0.9em; 75 | font-weight: _font(weight-bold); 76 | margin: 0 0 (_size(element-margin) * 0.5) 0; 77 | } 78 | 79 | input[type="text"], 80 | input[type="password"], 81 | input[type="email"], 82 | input[type="tel"], 83 | select, 84 | textarea { 85 | @include vendor('appearance', 'none'); 86 | background-color: transparent; 87 | border: none; 88 | border-radius: 0; 89 | border-bottom: solid _size(border-width) _palette(border); 90 | color: inherit; 91 | display: block; 92 | outline: 0; 93 | padding: 0; 94 | text-decoration: none; 95 | width: 100%; 96 | 97 | &:invalid { 98 | box-shadow: none; 99 | } 100 | 101 | &:focus { 102 | border-bottom-color: _palette(accent1); 103 | box-shadow: inset 0 -1px 0 0 _palette(accent1); 104 | } 105 | } 106 | 107 | select { 108 | background-image: svg-url(""); 109 | background-size: 1.25rem; 110 | background-repeat: no-repeat; 111 | background-position: calc(100% - 1rem) center; 112 | height: _size(element-height); 113 | padding-right: _size(element-height); 114 | text-overflow: ellipsis; 115 | 116 | option { 117 | color: _palette(fg-bold); 118 | background: _palette(bg); 119 | } 120 | 121 | &:focus { 122 | &::-ms-value { 123 | background-color: transparent; 124 | } 125 | } 126 | 127 | &::-ms-expand { 128 | display: none; 129 | } 130 | } 131 | 132 | input[type="text"], 133 | input[type="password"], 134 | input[type="email"], 135 | select { 136 | height: _size(element-height); 137 | } 138 | 139 | textarea { 140 | padding: 0; 141 | min-height: (_size(element-height) * 1.25); 142 | } 143 | 144 | input[type="checkbox"], 145 | input[type="radio"], { 146 | @include vendor('appearance', 'none'); 147 | display: block; 148 | float: left; 149 | margin-right: -2em; 150 | opacity: 0; 151 | width: 1em; 152 | z-index: -1; 153 | 154 | & + label { 155 | @include icon; 156 | color: _palette(fg); 157 | cursor: pointer; 158 | display: inline-block; 159 | font-size: 1em; 160 | font-weight: _font(weight); 161 | padding-left: (_size(element-height) * 0.6) + 0.75em; 162 | padding-right: 0.75em; 163 | position: relative; 164 | 165 | &:before { 166 | border-radius: _size(border-radius); 167 | border: solid _size(border-width) _palette(border); 168 | content: ''; 169 | display: inline-block; 170 | height: (_size(element-height) * 0.6); 171 | left: 0; 172 | line-height: (_size(element-height) * 0.575); 173 | position: absolute; 174 | text-align: center; 175 | top: 0; 176 | width: (_size(element-height) * 0.6); 177 | } 178 | } 179 | 180 | &:checked + label { 181 | &:before { 182 | background: _palette(fg); 183 | border-color: _palette(fg); 184 | color: _palette(bg); 185 | content: '\f00c'; 186 | } 187 | } 188 | 189 | &:focus + label { 190 | &:before { 191 | border-color: _palette(accent1); 192 | box-shadow: 0 0 0 _size(border-width) _palette(accent1); 193 | } 194 | } 195 | } 196 | 197 | input[type="checkbox"] { 198 | & + label { 199 | &:before { 200 | border-radius: _size(border-radius); 201 | } 202 | } 203 | } 204 | 205 | input[type="radio"] { 206 | & + label { 207 | &:before { 208 | border-radius: 100%; 209 | } 210 | } 211 | } -------------------------------------------------------------------------------- /app/templates/fortalecimiento-institucional.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Componente 4: Fortalecimiento Institucional{% endblock %} 3 | {% block body %} 4 |
5 |

Componente 4: Fortalecimiento Institucional

6 |

Este componente pretende fortalecer el marco institucional y la capacidad gubernamental para el desarrollo de la Agenda Digital. El monto previsto es de US$ 13.4 millones.

7 |

La distribución del presupuesto en los distintos productos se detalla a continuación, posteriormente incluimos la descripción e indicadores de cada uno:

8 |
9 |
10 | 11 |
12 |
13 |
14 |
15 |

Productos, indicadores y resultados esperados

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 |
ComponenteUnidad de medidaLínea de baseAño 1Año 2Año 3Año 4Año 5Año 6TotalMedios de verificaciónComentarios
Producto 21: Nuevo Modelo de Gestión Institucional, diseñado e implementadoCantidad de sistemas------11Informe de Progreso del ProgramaEste producto deberá ser desarrollado cumpliendo con el Modelo Estándar de Control Interno del Paraguay (MECIP).
Producto 22: Modelos de costeo, esquemas de operación y herramientas de medidas de calidad de servicios corporativos, desarrolladosCantidad de consultorías----21-3Informes Finales de la Consultoría aprobados
Producto 23: Sistema Informático Integrado de Gestión, implementadoCantidad de sistemas------11Reportes de operación emitidos desde el Sistema
Producto 24: Capacidad técnica y operativa de la SENATICS incrementada# Personal Incremental / Año-254565553515240Contratos firmados - Informes de GestiónSe prevé financiar 80 profesionales durante 36 meses en 4 grupos: Grupo 1 en el año 1 #25; Grupo 2 en el año 2 #20; Grupo 3 en el año 3 #20; Grupo 4 en el año 4 #15.
Producto 25: Personal de las instituciones claves del ecosistema público en TIC, capacitado# de Personas---50808040250Informe de ejecución de capacitaciones - Listado de asistenciasSe prevé el desarrollo de un Diplomado en TIC.
Producto 26: Actividades de sensibilización dirigidas a ciudadanos para el uso de los trámites digitalizados, realizadas# de Actividades--5555525Reportes de implementación de las Actividades de Sensibilización
121 |
122 |
123 |
124 |

125 | Volver al inicio 126 | Ir a propuestas 127 |

128 |
129 | 130 |
131 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/sass/components/_tiles.scss: -------------------------------------------------------------------------------- 1 | /// 2 | /// Phantom by HTML5 UP 3 | /// html5up.net | @ajlkn 4 | /// Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 | /// 6 | 7 | /* Tiles */ 8 | 9 | .tiles { 10 | $gutter: _size(gutter); 11 | $duration: 0.5s; 12 | $ease: 'ease'; 13 | 14 | @include vendor('display', 'flex'); 15 | @include vendor('flex-wrap', 'wrap'); 16 | postiion: relative; 17 | margin: ($gutter * -1) 0 0 ($gutter * -1); 18 | 19 | article { 20 | @include vendor('transition', ( 21 | 'transform #{$duration} #{$ease}', 22 | 'opacity #{$duration} #{$ease}' 23 | )); 24 | position: relative; 25 | width: calc(#{(100% / 3)} - #{$gutter * 1}); 26 | margin: $gutter 0 0 $gutter; 27 | 28 | > .image { 29 | @include vendor('transition', 'transform #{$duration} #{$ease}'); 30 | position: relative; 31 | display: block; 32 | width: 100%; 33 | border-radius: _size(border-radius); 34 | overflow: hidden; 35 | 36 | img { 37 | display: block; 38 | width: 100%; 39 | } 40 | 41 | &:before { 42 | @include vendor('pointer-events', 'none'); 43 | @include vendor('transition', ( 44 | 'background-color #{$duration} #{$ease}', 45 | 'opacity #{$duration} #{$ease}' 46 | )); 47 | content: ''; 48 | display: block; 49 | position: absolute; 50 | top: 0; 51 | left: 0; 52 | width: 100%; 53 | height: 100%; 54 | opacity: 1.0; 55 | z-index: 1; 56 | opacity: 0.8; 57 | } 58 | 59 | &:after { 60 | @include vendor('pointer-events', 'none'); 61 | @include vendor('transition', 'opacity #{$duration} #{$ease}'); 62 | content: ''; 63 | display: block; 64 | position: absolute; 65 | top: 0; 66 | left: 0; 67 | width: 100%; 68 | height: 100%; 69 | background-image: svg-url(''); 70 | background-position: center; 71 | background-repeat: no-repeat; 72 | background-size: 100% 100%; 73 | opacity: 0.25; 74 | z-index: 2; 75 | } 76 | } 77 | 78 | > a { 79 | @include vendor('display', 'flex'); 80 | @include vendor('flex-direction', 'column'); 81 | @include vendor('align-items', 'center'); 82 | @include vendor('justify-content', 'center'); 83 | @include vendor('transition', ( 84 | 'background-color #{$duration} #{$ease}', 85 | 'transform #{$duration} #{$ease}' 86 | )); 87 | position: absolute; 88 | top: 0; 89 | left: 0; 90 | width: 100%; 91 | height: 100%; 92 | padding: 1em; 93 | border-radius: _size(border-radius); 94 | border-bottom: 0; 95 | color: _palette(fg-accent); 96 | text-align: center; 97 | text-decoration: none; 98 | z-index: 3; 99 | 100 | > :last-child { 101 | margin: 0; 102 | } 103 | 104 | &:hover { 105 | color: _palette(fg-accent) !important; 106 | } 107 | 108 | h2 { 109 | margin: 0; 110 | } 111 | 112 | .content { 113 | @include vendor('transition', ( 114 | 'max-height #{$duration} #{$ease}', 115 | 'opacity #{$duration} #{$ease}' 116 | )); 117 | width: 100%; 118 | max-height: 0; 119 | line-height: 1.5; 120 | margin-top: 0.35em; 121 | opacity: 0; 122 | 123 | > :last-child { 124 | margin-bottom: 0; 125 | } 126 | } 127 | } 128 | 129 | &.style1 { 130 | > .image:before { 131 | background-color: _palette(accent1); 132 | } 133 | } 134 | 135 | &.style2 { 136 | > .image:before { 137 | background-color: _palette(accent2); 138 | } 139 | } 140 | 141 | &.style3 { 142 | > .image:before { 143 | background-color: _palette(accent3); 144 | } 145 | } 146 | 147 | &.style4 { 148 | > .image:before { 149 | background-color: _palette(accent4); 150 | } 151 | } 152 | 153 | &.style5 { 154 | > .image:before { 155 | background-color: _palette(accent5); 156 | } 157 | } 158 | 159 | &.style6 { 160 | > .image:before { 161 | background-color: _palette(accent6); 162 | } 163 | } 164 | 165 | body:not(.is-touch) & { 166 | &:hover { 167 | > .image { 168 | @include vendor('transform', 'scale(1.1)'); 169 | 170 | &:before { 171 | background-color: _palette(bg-accent); 172 | opacity: 0.35; 173 | } 174 | 175 | &:after { 176 | opacity: 0; 177 | } 178 | } 179 | 180 | .content { 181 | max-height: 15em; 182 | opacity: 1; 183 | } 184 | } 185 | } 186 | } 187 | 188 | * + & { 189 | margin-top: _size(element-margin); 190 | } 191 | 192 | body.is-preload & { 193 | article { 194 | @include vendor('transform', 'scale(0.9)'); 195 | opacity: 0; 196 | } 197 | } 198 | 199 | body.is-touch & { 200 | article { 201 | .content { 202 | max-height: 15em; 203 | opacity: 1; 204 | } 205 | } 206 | } 207 | 208 | @include breakpoint('<=large') { 209 | $gutter: _size(gutter) * 0.5; 210 | 211 | margin: ($gutter * -1) 0 0 ($gutter * -1); 212 | 213 | article { 214 | width: calc(#{(100% / 3)} - #{$gutter * 1}); 215 | margin: $gutter 0 0 $gutter; 216 | } 217 | } 218 | 219 | @include breakpoint('<=medium') { 220 | $gutter: _size(gutter); 221 | 222 | margin: ($gutter * -1) 0 0 ($gutter * -1); 223 | 224 | article { 225 | width: calc(#{(100% / 2)} - #{$gutter * 1}); 226 | margin: $gutter 0 0 $gutter; 227 | } 228 | } 229 | 230 | @include breakpoint('<=small') { 231 | $gutter: _size(gutter) * 0.5; 232 | 233 | margin: ($gutter * -1) 0 0 ($gutter * -1); 234 | 235 | article { 236 | width: calc(#{(100% / 2)} - #{$gutter * 1}); 237 | margin: $gutter 0 0 $gutter; 238 | 239 | &:hover { 240 | > .image { 241 | @include vendor('transform', 'scale(1.0)'); 242 | } 243 | } 244 | } 245 | } 246 | 247 | @include breakpoint('<=xsmall') { 248 | $gutter: _size(gutter) * 0.5; 249 | 250 | margin: 0; 251 | 252 | article { 253 | width: 100%; 254 | margin: $gutter 0 0 0; 255 | } 256 | } 257 | } 258 | 259 | -------------------------------------------------------------------------------- /app/templates/economia-digital.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Componente 2: Economía Digital{% endblock %} 3 | {% block body %} 4 |
5 |

Componente 2: Economía Digital

6 |

Este componente busca la mejora de la inversión en tecnología mediante el apoyo a jóvenes, 7 | emprendedores y empresas. El monto previsto es de US$ 29.6 millones.

8 |

La distribución del presupuesto en los distintos productos se detalla a continuación, posteriormente 9 | incluimos la descripción e indicadores de cada uno:

10 |
11 |
12 | 13 |
14 |
15 |
16 |
17 |

Productos, indicadores y resultados esperados

18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 53 | 54 | 55 | 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 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 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 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 170 | 171 | 172 | 173 |
ComponenteUnidad de medidaLínea de baseAño 1Año 2Año 3Año 4Año 5Año 6TotalMedios de verificaciónComentarios
Producto 9: Emprendimientos con Base Digital (EBD) financiados con 39 | capital semillaCantidad de EBD--2040505010170IPPSe prevé transferencia de recursos a los emprendedores seleccionados según 51 | lineamientos incluidos en el Reglamento Operativo del Programa aprobado para el 52 | efecto.
Producto 10: Actividades para la promoción del emprendedurismo con BD, 56 | realizadasCantidad de actividades--5111510647IPP
Producto 11: Iniciativas Digitales Extranjeras, captadasCantidad de iniciativas--10201010-50IPP
Producto 12: Jóvenes con talento digital, identificadosCantidad de jóvenes--450450450450-1800Informe de rendición de cuentas de las olimpiadas
Producto 13: Personas formadas en certificaciones de competencias 99 | digitalesCantidad de personas--30030030020-920Informe de ejecución de capacitaciones Listado de participantes
Producto 14: Proyectos asociativos para la mejora de programas de 114 | formación en tecnologías digitales, ejecutadosCantidad de Proyectos--1221-6Informe de Gestión y de Rendición de Cuentas por proyecto
Producto 15: Servicios para la industria de TIC, implementadosCantidad de servicios--2332-10Informe de Gestión y de Rendición de Cuentas por proyecto
Producto 16: Proyectos de transformación digital sectorial, 143 | implementadosCantidad de proyectos0-2882-20Informe de Gestión y de Rendición de Cuentas por proyecto
Producto 17: Distrito Digital operando# Distrito0-----11Informe de Progreso del ProgramaSe prevé la financiación por dos años para la operación y mantenimiento del 169 | Distrito.
174 |
175 |
176 |
177 |

178 | Volver al inicio 179 | Ir a propuestas 180 |

181 |
182 | 183 |
184 | {% endblock %} -------------------------------------------------------------------------------- /app/assets/sass/libs/_vendor.scss: -------------------------------------------------------------------------------- 1 | // vendor.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Vars. 4 | 5 | /// Vendor prefixes. 6 | /// @var {list} 7 | $vendor-prefixes: ( 8 | '-moz-', 9 | '-webkit-', 10 | '-ms-', 11 | '' 12 | ); 13 | 14 | /// Properties that should be vendorized. 15 | /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org 16 | /// @var {list} 17 | $vendor-properties: ( 18 | 19 | // Animation. 20 | 'animation', 21 | 'animation-delay', 22 | 'animation-direction', 23 | 'animation-duration', 24 | 'animation-fill-mode', 25 | 'animation-iteration-count', 26 | 'animation-name', 27 | 'animation-play-state', 28 | 'animation-timing-function', 29 | 30 | // Appearance. 31 | 'appearance', 32 | 33 | // Backdrop filter. 34 | 'backdrop-filter', 35 | 36 | // Background image options. 37 | 'background-clip', 38 | 'background-origin', 39 | 'background-size', 40 | 41 | // Box sizing. 42 | 'box-sizing', 43 | 44 | // Clip path. 45 | 'clip-path', 46 | 47 | // Filter effects. 48 | 'filter', 49 | 50 | // Flexbox. 51 | 'align-content', 52 | 'align-items', 53 | 'align-self', 54 | 'flex', 55 | 'flex-basis', 56 | 'flex-direction', 57 | 'flex-flow', 58 | 'flex-grow', 59 | 'flex-shrink', 60 | 'flex-wrap', 61 | 'justify-content', 62 | 'order', 63 | 64 | // Font feature. 65 | 'font-feature-settings', 66 | 'font-language-override', 67 | 'font-variant-ligatures', 68 | 69 | // Font kerning. 70 | 'font-kerning', 71 | 72 | // Fragmented borders and backgrounds. 73 | 'box-decoration-break', 74 | 75 | // Grid layout. 76 | 'grid-column', 77 | 'grid-column-align', 78 | 'grid-column-end', 79 | 'grid-column-start', 80 | 'grid-row', 81 | 'grid-row-align', 82 | 'grid-row-end', 83 | 'grid-row-start', 84 | 'grid-template-columns', 85 | 'grid-template-rows', 86 | 87 | // Hyphens. 88 | 'hyphens', 89 | 'word-break', 90 | 91 | // Masks. 92 | 'mask', 93 | 'mask-border', 94 | 'mask-border-outset', 95 | 'mask-border-repeat', 96 | 'mask-border-slice', 97 | 'mask-border-source', 98 | 'mask-border-width', 99 | 'mask-clip', 100 | 'mask-composite', 101 | 'mask-image', 102 | 'mask-origin', 103 | 'mask-position', 104 | 'mask-repeat', 105 | 'mask-size', 106 | 107 | // Multicolumn. 108 | 'break-after', 109 | 'break-before', 110 | 'break-inside', 111 | 'column-count', 112 | 'column-fill', 113 | 'column-gap', 114 | 'column-rule', 115 | 'column-rule-color', 116 | 'column-rule-style', 117 | 'column-rule-width', 118 | 'column-span', 119 | 'column-width', 120 | 'columns', 121 | 122 | // Object fit. 123 | 'object-fit', 124 | 'object-position', 125 | 126 | // Regions. 127 | 'flow-from', 128 | 'flow-into', 129 | 'region-fragment', 130 | 131 | // Scroll snap points. 132 | 'scroll-snap-coordinate', 133 | 'scroll-snap-destination', 134 | 'scroll-snap-points-x', 135 | 'scroll-snap-points-y', 136 | 'scroll-snap-type', 137 | 138 | // Shapes. 139 | 'shape-image-threshold', 140 | 'shape-margin', 141 | 'shape-outside', 142 | 143 | // Tab size. 144 | 'tab-size', 145 | 146 | // Text align last. 147 | 'text-align-last', 148 | 149 | // Text decoration. 150 | 'text-decoration-color', 151 | 'text-decoration-line', 152 | 'text-decoration-skip', 153 | 'text-decoration-style', 154 | 155 | // Text emphasis. 156 | 'text-emphasis', 157 | 'text-emphasis-color', 158 | 'text-emphasis-position', 159 | 'text-emphasis-style', 160 | 161 | // Text size adjust. 162 | 'text-size-adjust', 163 | 164 | // Text spacing. 165 | 'text-spacing', 166 | 167 | // Transform. 168 | 'transform', 169 | 'transform-origin', 170 | 171 | // Transform 3D. 172 | 'backface-visibility', 173 | 'perspective', 174 | 'perspective-origin', 175 | 'transform-style', 176 | 177 | // Transition. 178 | 'transition', 179 | 'transition-delay', 180 | 'transition-duration', 181 | 'transition-property', 182 | 'transition-timing-function', 183 | 184 | // Unicode bidi. 185 | 'unicode-bidi', 186 | 187 | // User select. 188 | 'user-select', 189 | 190 | // Writing mode. 191 | 'writing-mode', 192 | 193 | ); 194 | 195 | /// Values that should be vendorized. 196 | /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org 197 | /// @var {list} 198 | $vendor-values: ( 199 | 200 | // Cross fade. 201 | 'cross-fade', 202 | 203 | // Element function. 204 | 'element', 205 | 206 | // Filter function. 207 | 'filter', 208 | 209 | // Flexbox. 210 | 'flex', 211 | 'inline-flex', 212 | 213 | // Grab cursors. 214 | 'grab', 215 | 'grabbing', 216 | 217 | // Gradients. 218 | 'linear-gradient', 219 | 'repeating-linear-gradient', 220 | 'radial-gradient', 221 | 'repeating-radial-gradient', 222 | 223 | // Grid layout. 224 | 'grid', 225 | 'inline-grid', 226 | 227 | // Image set. 228 | 'image-set', 229 | 230 | // Intrinsic width. 231 | 'max-content', 232 | 'min-content', 233 | 'fit-content', 234 | 'fill', 235 | 'fill-available', 236 | 'stretch', 237 | 238 | // Sticky position. 239 | 'sticky', 240 | 241 | // Transform. 242 | 'transform', 243 | 244 | // Zoom cursors. 245 | 'zoom-in', 246 | 'zoom-out', 247 | 248 | ); 249 | 250 | // Functions. 251 | 252 | /// Removes a specific item from a list. 253 | /// @author Hugo Giraudel 254 | /// @param {list} $list List. 255 | /// @param {integer} $index Index. 256 | /// @return {list} Updated list. 257 | @function remove-nth($list, $index) { 258 | 259 | $result: null; 260 | 261 | @if type-of($index) != number { 262 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 263 | } 264 | @else if $index == 0 { 265 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 266 | } 267 | @else if abs($index) > length($list) { 268 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 269 | } 270 | @else { 271 | 272 | $result: (); 273 | $index: if($index < 0, length($list) + $index + 1, $index); 274 | 275 | @for $i from 1 through length($list) { 276 | 277 | @if $i != $index { 278 | $result: append($result, nth($list, $i)); 279 | } 280 | 281 | } 282 | 283 | } 284 | 285 | @return $result; 286 | 287 | } 288 | 289 | /// Replaces a substring within another string. 290 | /// @author Hugo Giraudel 291 | /// @param {string} $string String. 292 | /// @param {string} $search Substring. 293 | /// @param {string} $replace Replacement. 294 | /// @return {string} Updated string. 295 | @function str-replace($string, $search, $replace: '') { 296 | 297 | $index: str-index($string, $search); 298 | 299 | @if $index { 300 | @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); 301 | } 302 | 303 | @return $string; 304 | 305 | } 306 | 307 | /// Replaces a substring within each string in a list. 308 | /// @param {list} $strings List of strings. 309 | /// @param {string} $search Substring. 310 | /// @param {string} $replace Replacement. 311 | /// @return {list} Updated list of strings. 312 | @function str-replace-all($strings, $search, $replace: '') { 313 | 314 | @each $string in $strings { 315 | $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); 316 | } 317 | 318 | @return $strings; 319 | 320 | } 321 | 322 | // Mixins. 323 | 324 | /// Wraps @content in vendorized keyframe blocks. 325 | /// @param {string} $name Name. 326 | @mixin keyframes($name) { 327 | 328 | @-moz-keyframes #{$name} { @content; } 329 | @-webkit-keyframes #{$name} { @content; } 330 | @-ms-keyframes #{$name} { @content; } 331 | @keyframes #{$name} { @content; } 332 | 333 | } 334 | 335 | /// Vendorizes a declaration's property and/or value(s). 336 | /// @param {string} $property Property. 337 | /// @param {mixed} $value String/list of value(s). 338 | @mixin vendor($property, $value) { 339 | 340 | // Determine if property should expand. 341 | $expandProperty: index($vendor-properties, $property); 342 | 343 | // Determine if value should expand (and if so, add '-prefix-' placeholder). 344 | $expandValue: false; 345 | 346 | @each $x in $value { 347 | @each $y in $vendor-values { 348 | @if $y == str-slice($x, 1, str-length($y)) { 349 | 350 | $value: set-nth($value, index($value, $x), '-prefix-' + $x); 351 | $expandValue: true; 352 | 353 | } 354 | } 355 | } 356 | 357 | // Expand property? 358 | @if $expandProperty { 359 | @each $vendor in $vendor-prefixes { 360 | #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 361 | } 362 | } 363 | 364 | // Expand just the value? 365 | @elseif $expandValue { 366 | @each $vendor in $vendor-prefixes { 367 | #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 368 | } 369 | } 370 | 371 | // Neither? Treat them as a normal declaration. 372 | @else { 373 | #{$property}: #{$value}; 374 | } 375 | 376 | } -------------------------------------------------------------------------------- /app/templates/objetivo-general.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Componente 1: Gobierno Digital{% endblock %} 3 | {% block body %} 4 |
5 |

Resultados Esperados

6 |

Objetivo General

7 |

8 | Promover la mejora de la competitividad de la economía paraguaya y 9 | la reducción de costos transaccionales para ciudadanos y empresas 10 | en el acceso a bienes y servicios. 11 |

12 |

Objetivos específicos

13 |

14 |

    15 |
  • 16 | 1. disminuir los costos transaccionales del acceso a servicios públicos para ciudadanos y empresas; 17 |
  • 18 |
  • 19 | 2. aumentar el uso de Tecnologías de la Información y Comunicación (TICS) e incentivar la innovación y articulación empresarial; 20 |
  • 21 |
  • 22 | 3. aumentar el acceso a Banda Ancha (BA) mediante la extensión de la conectividad y una mejora en la calidad del servicio; y 23 |
  • 24 |
  • 25 | 4. fortalecer el marco institucional y la capacidad operativa gubernamental para favorecer el desarrollo de la Agenda Digital. 26 |
  • 27 |
28 |

29 |
30 |

Impacto Esperado

31 |

32 | Se prevé un solo impacto. En la Mejora de la competitividad y de la calidad de los servicios públicos 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 | 112 |
IndicadorUnidadLínea de baseAño Línea de baseAño 1 2019Año 2 2020Año 3 2021Año 4 2022Año 5 2023Año 6 2024Año 7 2025Meta FinalMedios de verificaciónComentarios
Nivel satisfacción ciudadano con los trámitesEscala 1 a 104,62015

5,3

6
6Reportes de resultado de encuestas publicados.Se harán sólo dos mediciones: en el año 3 y al final.
Ciudadanos que realizan trámites en líneaPorcentaje2,152017

5

15
15Reportes de resultado de encuestas publicados.Se harán sólo dos mediciones: en el año 3 y al final.
Indicador Global de Competitividad (World Economic Forum)Puntos3,732017

3,75

3,8
3,8Reporte del WEF
113 |
114 |
115 |
116 |

Resultados Esperados

117 |

118 | Se espera tener los siguientes resultados 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 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 |
IndicadorUnidadLínea de baseAño Línea de baseAño 1 2019Año 2 2020Año 3 2021Año 4 2022Año 5 2023Año 6 2024Año 7 2025Meta FinalMedios de verificaciónComentarios
Resultado 1: Disminución de los costos transaccionales de servicios públicos para ciudadanos y empresas
Costo promedio de renovar la cédula de identidadUSD942017

82

70
70Informe de Medición realizada con la misma metodología aplicada en 2018-
Costo promedio de abrir una empresaUSD3.6002017

3000

2700
2700Informe de medición realizada con la misma metodología aplicada en 2018.-
Resultado 2: Mayor uso de TIC por parte de las empresas
Empresas que invierten en TICPorcentaje102013

10,5

11
11Encuesta Nacional de Innovación Empresarial de Paraguay
Resultado 3: Aumento del número de usuarios conectados a servicios de BA de mayor calidad
Costo por MBPSUSD/Mbps202016

7,24

4,18
4,18Índice de Desarrollo de la Banda Ancha (BID)
Cantidad de líneas de BA fija por cada 100 habitantesLíneas de BA/100 habitantes %3,35 %2016

5,37%

5,8%
5,8%Índice de Desarrollo de la Banda Ancha (BID)
Resultado 4: Fortalecimiento de las instituciones clave para el desarrollo digital
Cumplimiento de SENATICs del Artículo 12 de la Ley 4989/13[8]Porcentaje362018

50

73
73Informe de cumplimiento de metas institucionales preparado por SENATICs auditadoActualmente la SENATICS cumple adecuadamente con 8 de sus 22 atribuciones y se espera alcanzar, al menos, a 16. Estas 8 nuevas serían : (i) emitir directrices para la optimización de los procesos de interoperabilidad; (ii) coordinar acciones interinstitucionales para la integración de los servicios públicos; (iii) promover el uso de TIC en las comunidades del país;(iv) supervisar las compras públicas de TIC; (v) asesorar otras instituciones en las compras de TIC; (vi) establecer políticas de protección de la información personal y gubernamental, y un sistema de organización de seguridad, proponer una política de seguridad a nivel nacional; (vii) definir las mejores tecnologías y especificar los equipos, programas y medios de conectividad, para el Ministerio de Educación y Cultura; (viii) Implementar un sistema de operación y mantenimiento y asistencia técnica de los equipos y conectividades contratados.
252 |
253 |
254 |
255 |

256 | Volver al inicio 257 | Ir a propuestas 258 |

259 |
260 | 261 |
262 | {% endblock %} 263 | -------------------------------------------------------------------------------- /app/templates/faq.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %}FAQ{% endblock %} 3 | {% block body %} 4 |
5 |
6 |

Documentaciones

7 | 15 |
16 |
17 |
18 |

Preguntas Frecuentes

19 |
20 |

¿Qué es la Agenda Digital? 21 |

22 |

El Congreso de Paraguay aprobó el 16 de Abril de 2019 un préstamo de 130 millones de dólares para un proyecto de 6 años (2019 a 2025) llamado “Agenda Digital” y ejecutado por el MITIC con el objetivo de mejorar la competitividad de la economía paraguaya, la calidad de los servicios públicos mediante la implementación de tecnologías de la información y mejorar la red de fibra aumentando el acceso a más ancho de banda de Internet.

23 | 24 |

¿Cuál es el origen de los fondos? 25 |

26 |

El préstamo fue otorgado por el BID (Banco Interamericano de Desarrollo uno de los mayores acreedores de la deuda externa paraguaya. Este organismo desarrolló el proyecto PR-L1153 “Programa de Apoyo a la Agenda Digital” en conjunto con autoridades locales.

27 |

¿Por qué transparentar la Agenda Digital? 28 |

29 |

Hasta ahora --8 de Julio de 2019--, aún no tenemos documentación técnica respaldatoria para los 26 productos de la Agenda Digital.

30 | 31 |

Implementar este proyecto sin documentación técnica es como construir un edificio sin planos. A ciegas

32 | 33 |

Como ciudadanos, no podemos permitir que se invierta más dinero público sin control, sin impacto, sin evaluaciones previas apropiadas, como tantas veces ha ocurrido en el pasado.

34 | 35 |

Recordemos el fracaso del proyecto Metrobús, otro préstamo también del BID. Unos $50 millones de dólares deberán ser pagados al BID, a pesar de haber sido un total fracaso que generó grandes pérdidas para los frentistas y un caos vehicular presente hasta hoy.

36 | 37 |

Ese fracaso fue fácil de ver y entender. Sin embargo, la #AgendaDigital podría no ser tan visible por tratarse de proyecto muy técnico, difícil de entender para la ciudadanía en general. Queremos evitar que las irregularidades pasen desapercibidas desde antes de ser consumadas.

38 | 39 |

Nuestro primer paso ha sido solicitar el acceso a todos los documentos relacionados al proyecto, algo que no siempre tuvo una respuesta positiva. La forma oficial de hacerlo es a través de solicitudes de información pública, aquí se encuentran las que hemos realizado.

40 | 41 |

Las primeras respuestas del MITIC decían que todos los documentos ya habían sido publicados en su página web. Sin embargo, todos eran meros insumos (pocos informes, encuestas, presentaciones, etc) y no documentos de planificación que expliquen claramente cada uno de los 26 productos del proyecto. Posteriormente, el MITIC argumentó que todo lo que no han publicado aún es porque el BID no se los proveyó.

42 | 43 |

¿En qué consiste la Agenda Digital? 44 |

45 |

La #AgendaDigital consiste de 26 productos agrupados en 4 componentes:

46 |
    47 |
  1. GOBIERNO DIGITAL: Digitalización de procesos y mejora de la entrega de servicios prestados por el sector público. 48 |
  2. 49 |
  3. ECONOMIA DIGITAL: Mejora de la inversión en tecnología mediante el apoyo a jóvenes emprendedores y empresas.
  4. 50 |
  5. CONECTIVIDAD: Extensión del uso de banda ancha y mejora de su calidad y precio.
  6. 51 |
  7. FORTALECIMIENTO INSTITUCIONAL: Fortalecimiento del marco institucional y la capacidad gubernamental para el desarrollo de la agenda digital.
  8. 52 |
53 | 54 |

La información oficial de la página del MITIC al respecto aún es bastante incompleta, es por eso que tenemos una sección de Documentación donde vamos cargando lo que encontramos en diferentes fuentes.

55 | 56 |

El documento más detallado y actualizado sobre el proyecto es la Matriz de Planificación Presupuestaria presentada al Ministerio de Hacienda el 28 de Junio de 2019.

57 | 58 |

¿Quiénes somos? 59 |

60 |

No somos una ONG, ni un gremio, ni pertenecemos a un partido político. Somos ciudadanos independientes, unidos por una preocupación por el buen uso del dinero público en este proyecto. No tenemos “representantes” oficiales.

61 | 62 |

Cada ciudadano emite su opinión a título personal, ya sea en privado o en público a través de redes sociales y medios de prensa.

63 | 64 |

Como punto de encuentro utilizamos un grupo de Telegram totalmente abierto, nos reunimos en persona con cierta frecuencia y compilamos información en este sitio web open source creado y mantenido por la comunidad.

65 | 66 |

¿Cuáles son nuestros objetivos concretos? 67 |

68 |
    69 |
  • Obtener documentación detallada que sustente cada uno de los 26 productos de la Agenda Digital.
  • 70 |
  • Auditar el proyecto y denunciar irregularidades. 71 |
  • 72 |
  • Que el MITIC establezca un mecanismo de gobernanza participativa y vinculante para todo el proyecto, para permitir la participación a todo ciudadano, sin exigencias de personería jurídica de tipo organizacional alguna.
  • 73 |
  • Son muchas las voces en la comunidad que consideran que el proyecto no debería recibir desembolso alguno antes que se cumplan estos objetivos.
  • 74 |
75 | 76 |
Actualización Julio, 2019: luego de 2 reuniones con el MITIC con mediación de la Unidad de Gestión de la Presidencia, presentamos nuestro plan de participación ciudadana a través de MESAS ABIERTAS a ser desarrolladas por un espacio de 6 meses. Aguardamos aprobación del MITIC y estamos en conversaciones con Gobierno Abierto para contar con su apoyo.
77 |
78 |
79 |

¿Qué hemos encontrado?

80 | 88 | 89 |
90 |
91 |

Aclaraciones

92 |

¿Es verdad que se gastarán US$ 45 millones solamente en consultorías?

93 |

No exactamente. Fue una clasificación de rubros confusa que generó mucha repercusión en los medios, pero ya está aclarada.Dentro del rubro de “consultorías”, ya aclaró MITIC que incluyeron a bienes concretos, como por ejemplo, software a ser desarrollado.

94 | 95 |

Por lo tanto, si bien es cierto que existen US$ 45 millones para el rubro de “consultorías”, no estamos hablando solamente de informes a ser entregados en papel sino también de productos concretos.

96 | 97 |

Aclarado esto, la "confusión" del significado de los rubros de parte de Hacienda es un problema que también debe corregirse de tal forma a que podamos saber real y efectivamente qué es qué en el presupuesto de este y cualquier otro proyecto.

98 | 99 |

¿Es verdad que la Agencia Oniria cobró US$ 450 mil? 100 |

101 | 102 |

Es falso que esta agencia cobró US$ 450 mil, algo que esta comunidad nunca dijo pues nadie tenía tal información. Solo sabíamos que estaba contratada dentro de un proyecto financiado con fondos propios del BID -no por el crédito para el Paraguay- cuyo total era por ese monto de US$ 450 mil, sin tener claro cuánto de ese monto correspondía al contrato con Oniria.

103 | 104 |

Oniria aclaró que fueron $14.296,00. 105 |

106 |
107 |
108 |

109 | Volver al inicio 110 | Ir a propuestas 111 |

112 |
113 |
114 | {% endblock %} 115 | -------------------------------------------------------------------------------- /app/templates/gobierno-digital.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block title %} - Componente 1: Gobierno Digital{% endblock %} 3 | {% block body %} 4 |
5 |

Componente 1: Gobierno Digital

6 |

Este componente busca la digitalización de procesos y mejora de la entrega de servicios prestados por el sector público. El monto previsto es de US$ 32.6 millones.

7 |

La distribución del presupuesto en los distintos productos se detalla a continuación, posteriormente incluimos la descripción e indicadores de cada uno:

8 |
9 |
10 | 11 |
12 |
13 |
14 |
15 |

Productos, indicadores y resultados esperados

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 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 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 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 349 | 350 | 351 | 352 | 360 |
ProductosUnidad de MedidaLínea de BaseAño LBAño 1
2019*
Año 2
2020
Año 3
2021
Año 4
2022
Año 5
2023
Año 6
2024
Año 7
2025**
Meta FinalMedios de VerificaciónComentariosDocumentación
Componente 1. Digitalización de procesos y mejora de la entrega de servicios prestados por el sector público
Producto 1: Propuestas de normativas en gobierno digital y sectores estratégicos, elaboradas# Análisis jurídico y/o propuestas normativas02018253---
10 - Documentos análisis jurídico y propuesta de las normativasIncluye normas sobre protección de datos personales, telecomunicaciones, comercio electrónico, gobierno digital, innovación y ciberseguridad.Ninguna documentación 57 |
Producto 2: Servicios simplificados y digitalizados# de trámites en línea02018------
0Reportes anuales indicando la lista de trámites simplificados y, para cada uno, cuáles fueron las simplificaciones o los pasos o registros digitalizados
D1
D2
D3
74 |
Hito 1:Trámites simples o lineales implementado# trámites








55


Hito 2: Trámites semi-complejos implementado# trámites








45


Hito 3: Trámites complejos implementado# trámites








20


Producto 3: Sistema de Información de Salud (HIS), implementado# de establecimientos con HIS implementado02018-14200250--
464Reporte anual de grado de avance
Ninguna Documentacion
Producto 4: Servicios brindados por el Sistema Catastral, implementados% de avance de acciones planificadas02018-20452510-
100Reporte anual de grado de avance
Ninguna Documentacion
Modelo de atención multicanal implementado# Modelos02018010000
1


Plataforma de hardware y software de base modernizada# plataforma02018001000
1


Nuevas sedes regionales equipadas# sedes regionales32018002000
5


Archivos digitalizados y nuevo sistema de gestión catastral implementado% de avance de implementación0201800050500
100


Producto 5: Sistemas de gobierno digital, desarrollados e implementados# de sistemas de gobierno electrónico02018--2332
10Reporte final de cada aplicación transversal implementadaIncluye autenticación de identidad digital, firma digital, expediente electrónico, notificación electrónica, geoportal, plataforma para gestión de municipios, portal de trámites, actualización de elementos de la plataforma de interoperabilidad y pasarela de pagos en línea.Ningna Documentacion
Producto 6: Laboratorio de innovación gubernamental para apoyar el desarrollo de proyectos específicos de gobierno digital, implementado# Proyectos02018------
0Informes finales de cada proyectoSi bien se abrirán concursos hay dos proyectos ya priorizados dentro de este producto: el registro único de beneficiarios de programas sociales y el registro único de productores rurales. Ninguna Documentacion
Hito 1: Proyectos de innovación abierta de servicios públicos, elaborados?#Proyectos








10


Hito 2: Laboratorio de innovación gubernamental implementado (etapa 1)?#Laboratorios








1


Hito 3: Laboratorio de innovación gubernamental implementado (etapa 2)?#Laboratorios








1


Producto 7: Modelo de atención multicanal, implementado#Modelo02018-----1
1Informe de Progreso del Programa
Ninguna Documentacion
Producto 8: Sistema Nacional de Ciberseguridad, fortalecido% de avance del sistema02018-1010502010
100Informes finales de: 1) propuestas de mejora regulatoria, 2) SOC implementado y CERT fortalecido, 3) infraestructuras críticas, y 4) fortalecimiento técnico.Incluye: revisión de marco regulatorio, protección de infraestructuras críticas, respuesta a incidentes (CERT), monitoreo y análisis (SOC) y fortalecimiento de capacidades técnicas. 346 | D1
347 | D2
348 |
361 |
362 |
363 |
364 |

365 | Volver al inicio 366 | Ir a propuestas 367 |

368 |
369 | 370 |
371 | {% endblock %} 372 | -------------------------------------------------------------------------------- /app/assets/js/util.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | /** 4 | * Generate an indented list of links from a nav. Meant for use with panel(). 5 | * @return {jQuery} jQuery object. 6 | */ 7 | $.fn.navList = function() { 8 | 9 | var $this = $(this); 10 | $a = $this.find('a'), 11 | b = []; 12 | 13 | $a.each(function() { 14 | 15 | var $this = $(this), 16 | indent = Math.max(0, $this.parents('li').length - 1), 17 | href = $this.attr('href'), 18 | target = $this.attr('target'); 19 | 20 | b.push( 21 | '' + 26 | '' + 27 | $this.text() + 28 | '' 29 | ); 30 | 31 | }); 32 | 33 | return b.join(''); 34 | 35 | }; 36 | 37 | /** 38 | * Panel-ify an element. 39 | * @param {object} userConfig User config. 40 | * @return {jQuery} jQuery object. 41 | */ 42 | $.fn.panel = function(userConfig) { 43 | 44 | // No elements? 45 | if (this.length == 0) 46 | return $this; 47 | 48 | // Multiple elements? 49 | if (this.length > 1) { 50 | 51 | for (var i=0; i < this.length; i++) 52 | $(this[i]).panel(userConfig); 53 | 54 | return $this; 55 | 56 | } 57 | 58 | // Vars. 59 | var $this = $(this), 60 | $body = $('body'), 61 | $window = $(window), 62 | id = $this.attr('id'), 63 | config; 64 | 65 | // Config. 66 | config = $.extend({ 67 | 68 | // Delay. 69 | delay: 0, 70 | 71 | // Hide panel on link click. 72 | hideOnClick: false, 73 | 74 | // Hide panel on escape keypress. 75 | hideOnEscape: false, 76 | 77 | // Hide panel on swipe. 78 | hideOnSwipe: false, 79 | 80 | // Reset scroll position on hide. 81 | resetScroll: false, 82 | 83 | // Reset forms on hide. 84 | resetForms: false, 85 | 86 | // Side of viewport the panel will appear. 87 | side: null, 88 | 89 | // Target element for "class". 90 | target: $this, 91 | 92 | // Class to toggle. 93 | visibleClass: 'visible' 94 | 95 | }, userConfig); 96 | 97 | // Expand "target" if it's not a jQuery object already. 98 | if (typeof config.target != 'jQuery') 99 | config.target = $(config.target); 100 | 101 | // Panel. 102 | 103 | // Methods. 104 | $this._hide = function(event) { 105 | 106 | // Already hidden? Bail. 107 | if (!config.target.hasClass(config.visibleClass)) 108 | return; 109 | 110 | // If an event was provided, cancel it. 111 | if (event) { 112 | 113 | event.preventDefault(); 114 | event.stopPropagation(); 115 | 116 | } 117 | 118 | // Hide. 119 | config.target.removeClass(config.visibleClass); 120 | 121 | // Post-hide stuff. 122 | window.setTimeout(function() { 123 | 124 | // Reset scroll position. 125 | if (config.resetScroll) 126 | $this.scrollTop(0); 127 | 128 | // Reset forms. 129 | if (config.resetForms) 130 | $this.find('form').each(function() { 131 | this.reset(); 132 | }); 133 | 134 | }, config.delay); 135 | 136 | }; 137 | 138 | // Vendor fixes. 139 | $this 140 | .css('-ms-overflow-style', '-ms-autohiding-scrollbar') 141 | .css('-webkit-overflow-scrolling', 'touch'); 142 | 143 | // Hide on click. 144 | if (config.hideOnClick) { 145 | 146 | $this.find('a') 147 | .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); 148 | 149 | $this 150 | .on('click', 'a', function(event) { 151 | 152 | var $a = $(this), 153 | href = $a.attr('href'), 154 | target = $a.attr('target'); 155 | 156 | if (!href || href == '#' || href == '' || href == '#' + id) 157 | return; 158 | 159 | // Cancel original event. 160 | event.preventDefault(); 161 | event.stopPropagation(); 162 | 163 | // Hide panel. 164 | $this._hide(); 165 | 166 | // Redirect to href. 167 | window.setTimeout(function() { 168 | 169 | if (target == '_blank') 170 | window.open(href); 171 | else 172 | window.location.href = href; 173 | 174 | }, config.delay + 10); 175 | 176 | }); 177 | 178 | } 179 | 180 | // Event: Touch stuff. 181 | $this.on('touchstart', function(event) { 182 | 183 | $this.touchPosX = event.originalEvent.touches[0].pageX; 184 | $this.touchPosY = event.originalEvent.touches[0].pageY; 185 | 186 | }) 187 | 188 | $this.on('touchmove', function(event) { 189 | 190 | if ($this.touchPosX === null 191 | || $this.touchPosY === null) 192 | return; 193 | 194 | var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, 195 | diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, 196 | th = $this.outerHeight(), 197 | ts = ($this.get(0).scrollHeight - $this.scrollTop()); 198 | 199 | // Hide on swipe? 200 | if (config.hideOnSwipe) { 201 | 202 | var result = false, 203 | boundary = 20, 204 | delta = 50; 205 | 206 | switch (config.side) { 207 | 208 | case 'left': 209 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); 210 | break; 211 | 212 | case 'right': 213 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); 214 | break; 215 | 216 | case 'top': 217 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); 218 | break; 219 | 220 | case 'bottom': 221 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); 222 | break; 223 | 224 | default: 225 | break; 226 | 227 | } 228 | 229 | if (result) { 230 | 231 | $this.touchPosX = null; 232 | $this.touchPosY = null; 233 | $this._hide(); 234 | 235 | return false; 236 | 237 | } 238 | 239 | } 240 | 241 | // Prevent vertical scrolling past the top or bottom. 242 | if (($this.scrollTop() < 0 && diffY < 0) 243 | || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { 244 | 245 | event.preventDefault(); 246 | event.stopPropagation(); 247 | 248 | } 249 | 250 | }); 251 | 252 | // Event: Prevent certain events inside the panel from bubbling. 253 | $this.on('click touchend touchstart touchmove', function(event) { 254 | event.stopPropagation(); 255 | }); 256 | 257 | // Event: Hide panel if a child anchor tag pointing to its ID is clicked. 258 | $this.on('click', 'a[href="#' + id + '"]', function(event) { 259 | 260 | event.preventDefault(); 261 | event.stopPropagation(); 262 | 263 | config.target.removeClass(config.visibleClass); 264 | 265 | }); 266 | 267 | // Body. 268 | 269 | // Event: Hide panel on body click/tap. 270 | $body.on('click touchend', function(event) { 271 | $this._hide(event); 272 | }); 273 | 274 | // Event: Toggle. 275 | $body.on('click', 'a[href="#' + id + '"]', function(event) { 276 | 277 | event.preventDefault(); 278 | event.stopPropagation(); 279 | 280 | config.target.toggleClass(config.visibleClass); 281 | 282 | }); 283 | 284 | // Window. 285 | 286 | // Event: Hide on ESC. 287 | if (config.hideOnEscape) 288 | $window.on('keydown', function(event) { 289 | 290 | if (event.keyCode == 27) 291 | $this._hide(event); 292 | 293 | }); 294 | 295 | return $this; 296 | 297 | }; 298 | 299 | /** 300 | * Apply "placeholder" attribute polyfill to one or more forms. 301 | * @return {jQuery} jQuery object. 302 | */ 303 | $.fn.placeholder = function() { 304 | 305 | // Browser natively supports placeholders? Bail. 306 | if (typeof (document.createElement('input')).placeholder != 'undefined') 307 | return $(this); 308 | 309 | // No elements? 310 | if (this.length == 0) 311 | return $this; 312 | 313 | // Multiple elements? 314 | if (this.length > 1) { 315 | 316 | for (var i=0; i < this.length; i++) 317 | $(this[i]).placeholder(); 318 | 319 | return $this; 320 | 321 | } 322 | 323 | // Vars. 324 | var $this = $(this); 325 | 326 | // Text, TextArea. 327 | $this.find('input[type=text],textarea') 328 | .each(function() { 329 | 330 | var i = $(this); 331 | 332 | if (i.val() == '' 333 | || i.val() == i.attr('placeholder')) 334 | i 335 | .addClass('polyfill-placeholder') 336 | .val(i.attr('placeholder')); 337 | 338 | }) 339 | .on('blur', function() { 340 | 341 | var i = $(this); 342 | 343 | if (i.attr('name').match(/-polyfill-field$/)) 344 | return; 345 | 346 | if (i.val() == '') 347 | i 348 | .addClass('polyfill-placeholder') 349 | .val(i.attr('placeholder')); 350 | 351 | }) 352 | .on('focus', function() { 353 | 354 | var i = $(this); 355 | 356 | if (i.attr('name').match(/-polyfill-field$/)) 357 | return; 358 | 359 | if (i.val() == i.attr('placeholder')) 360 | i 361 | .removeClass('polyfill-placeholder') 362 | .val(''); 363 | 364 | }); 365 | 366 | // Password. 367 | $this.find('input[type=password]') 368 | .each(function() { 369 | 370 | var i = $(this); 371 | var x = $( 372 | $('
') 373 | .append(i.clone()) 374 | .remove() 375 | .html() 376 | .replace(/type="password"/i, 'type="text"') 377 | .replace(/type=password/i, 'type=text') 378 | ); 379 | 380 | if (i.attr('id') != '') 381 | x.attr('id', i.attr('id') + '-polyfill-field'); 382 | 383 | if (i.attr('name') != '') 384 | x.attr('name', i.attr('name') + '-polyfill-field'); 385 | 386 | x.addClass('polyfill-placeholder') 387 | .val(x.attr('placeholder')).insertAfter(i); 388 | 389 | if (i.val() == '') 390 | i.hide(); 391 | else 392 | x.hide(); 393 | 394 | i 395 | .on('blur', function(event) { 396 | 397 | event.preventDefault(); 398 | 399 | var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 400 | 401 | if (i.val() == '') { 402 | 403 | i.hide(); 404 | x.show(); 405 | 406 | } 407 | 408 | }); 409 | 410 | x 411 | .on('focus', function(event) { 412 | 413 | event.preventDefault(); 414 | 415 | var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); 416 | 417 | x.hide(); 418 | 419 | i 420 | .show() 421 | .focus(); 422 | 423 | }) 424 | .on('keypress', function(event) { 425 | 426 | event.preventDefault(); 427 | x.val(''); 428 | 429 | }); 430 | 431 | }); 432 | 433 | // Events. 434 | $this 435 | .on('submit', function() { 436 | 437 | $this.find('input[type=text],input[type=password],textarea') 438 | .each(function(event) { 439 | 440 | var i = $(this); 441 | 442 | if (i.attr('name').match(/-polyfill-field$/)) 443 | i.attr('name', ''); 444 | 445 | if (i.val() == i.attr('placeholder')) { 446 | 447 | i.removeClass('polyfill-placeholder'); 448 | i.val(''); 449 | 450 | } 451 | 452 | }); 453 | 454 | }) 455 | .on('reset', function(event) { 456 | 457 | event.preventDefault(); 458 | 459 | $this.find('select') 460 | .val($('option:first').val()); 461 | 462 | $this.find('input,textarea') 463 | .each(function() { 464 | 465 | var i = $(this), 466 | x; 467 | 468 | i.removeClass('polyfill-placeholder'); 469 | 470 | switch (this.type) { 471 | 472 | case 'submit': 473 | case 'reset': 474 | break; 475 | 476 | case 'password': 477 | i.val(i.attr('defaultValue')); 478 | 479 | x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 480 | 481 | if (i.val() == '') { 482 | i.hide(); 483 | x.show(); 484 | } 485 | else { 486 | i.show(); 487 | x.hide(); 488 | } 489 | 490 | break; 491 | 492 | case 'checkbox': 493 | case 'radio': 494 | i.attr('checked', i.attr('defaultValue')); 495 | break; 496 | 497 | case 'text': 498 | case 'textarea': 499 | i.val(i.attr('defaultValue')); 500 | 501 | if (i.val() == '') { 502 | i.addClass('polyfill-placeholder'); 503 | i.val(i.attr('placeholder')); 504 | } 505 | 506 | break; 507 | 508 | default: 509 | i.val(i.attr('defaultValue')); 510 | break; 511 | 512 | } 513 | }); 514 | 515 | }); 516 | 517 | return $this; 518 | 519 | }; 520 | 521 | /** 522 | * Moves elements to/from the first positions of their respective parents. 523 | * @param {jQuery} $elements Elements (or selector) to move. 524 | * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. 525 | */ 526 | $.prioritize = function($elements, condition) { 527 | 528 | var key = '__prioritize'; 529 | 530 | // Expand $elements if it's not already a jQuery object. 531 | if (typeof $elements != 'jQuery') 532 | $elements = $($elements); 533 | 534 | // Step through elements. 535 | $elements.each(function() { 536 | 537 | var $e = $(this), $p, 538 | $parent = $e.parent(); 539 | 540 | // No parent? Bail. 541 | if ($parent.length == 0) 542 | return; 543 | 544 | // Not moved? Move it. 545 | if (!$e.data(key)) { 546 | 547 | // Condition is false? Bail. 548 | if (!condition) 549 | return; 550 | 551 | // Get placeholder (which will serve as our point of reference for when this element needs to move back). 552 | $p = $e.prev(); 553 | 554 | // Couldn't find anything? Means this element's already at the top, so bail. 555 | if ($p.length == 0) 556 | return; 557 | 558 | // Move element to top of parent. 559 | $e.prependTo($parent); 560 | 561 | // Mark element as moved. 562 | $e.data(key, $p); 563 | 564 | } 565 | 566 | // Moved already? 567 | else { 568 | 569 | // Condition is true? Bail. 570 | if (condition) 571 | return; 572 | 573 | $p = $e.data(key); 574 | 575 | // Move element back to its original location (using our placeholder). 576 | $e.insertAfter($p); 577 | 578 | // Unmark element as moved. 579 | $e.removeData(key); 580 | 581 | } 582 | 583 | }); 584 | 585 | }; 586 | 587 | })(jQuery); -------------------------------------------------------------------------------- /app/assets/js/linkify.min.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n};!function(e){function a(n,e){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},t=Object.create(n.prototype);for(var o in a)t[o]=a[o];return t.constructor=e,e.prototype=t,e}function t(n){n=n||{},this.defaultProtocol=n.hasOwnProperty("defaultProtocol")?n.defaultProtocol:h.defaultProtocol,this.events=n.hasOwnProperty("events")?n.events:h.events,this.format=n.hasOwnProperty("format")?n.format:h.format,this.formatHref=n.hasOwnProperty("formatHref")?n.formatHref:h.formatHref,this.nl2br=n.hasOwnProperty("nl2br")?n.nl2br:h.nl2br,this.tagName=n.hasOwnProperty("tagName")?n.tagName:h.tagName,this.target=n.hasOwnProperty("target")?n.target:h.target,this.validate=n.hasOwnProperty("validate")?n.validate:h.validate,this.ignoreTags=[],this.attributes=n.attributes||n.linkAttributes||h.attributes,this.className=n.hasOwnProperty("className")?n.className:n.linkClass||h.className;for(var e=n.hasOwnProperty("ignoreTags")?n.ignoreTags:h.ignoreTags,a=0;a=r)return[];for(;o1&&void 0!==arguments[1]?arguments[1]:null,a=this.next(new n(""));return a===this.defaultTransition?(a=new this.constructor(e),this.on(n,a)):e&&(a.T=e),a},test:function(n,e){return n instanceof e}}),d=l();d.prototype={toString:function(){return this.v+""}};var x=u(),y=u("@"),v=u(":"),k=u("."),w=u(),j=u(),z=u("\n"),O=u(),q=u("+"),N=u("#"),S=u(),T=u("mailto:"),A=u("?"),L=u("/"),P=u("_"),E=u(),C=u(),R=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:d,DOMAIN:x,AT:y,COLON:v,DOT:k,PUNCTUATION:w,LOCALHOST:j,NL:z,NUM:O,PLUS:q,POUND:N,QUERY:A,PROTOCOL:S,MAILTO:T,SLASH:L,UNDERSCORE:P,SYM:E,TLD:C,WS:R,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abarth|abb|abbott|abbvie|abc|able|abogado|abudhabi|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|aetna|af|afamilycompany|afl|africa|ag|agakhan|agency|ai|aig|aigo|airbus|airforce|airtel|akdn|al|alfaromeo|alibaba|alipay|allfinanz|allstate|ally|alsace|alstom|am|americanexpress|americanfamily|amex|amfam|amica|amsterdam|analytics|android|anquan|anz|ao|aol|apartments|app|apple|aq|aquarelle|ar|arab|aramco|archi|army|arpa|art|arte|as|asda|asia|associates|at|athleta|attorney|au|auction|audi|audible|audio|auspost|author|auto|autos|avianca|aw|aws|ax|axa|az|azure|ba|baby|baidu|banamex|bananarepublic|band|bank|bar|barcelona|barclaycard|barclays|barefoot|bargains|baseball|basketball|bauhaus|bayern|bb|bbc|bbt|bbva|bcg|bcn|bd|be|beats|beauty|beer|bentley|berlin|best|bestbuy|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|blanco|blockbuster|blog|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bofa|bom|bond|boo|book|booking|boots|bosch|bostik|boston|bot|boutique|box|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|calvinklein|cam|camera|camp|cancerresearch|canon|capetown|capital|capitalone|car|caravan|cards|care|career|careers|cars|cartier|casa|case|caseih|cash|casino|cat|catering|catholic|cba|cbn|cbre|cbs|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chintai|chloe|christmas|chrome|chrysler|church|ci|cipriani|circle|cisco|citadel|citi|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|comcast|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cookingchannel|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruise|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|data|date|dating|datsun|day|dclk|dds|de|deal|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|dhl|diamonds|diet|digital|direct|directory|discount|discover|dish|diy|dj|dk|dm|dnp|do|docs|doctor|dodge|dog|doha|domains|dot|download|drive|dtv|dubai|duck|dunlop|duns|dupont|durban|dvag|dvr|dz|earth|eat|ec|eco|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epost|epson|equipment|er|ericsson|erni|es|esq|estate|esurance|et|etisalat|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|extraspace|fage|fail|fairwinds|faith|family|fan|fans|farm|farmers|fashion|fast|fedex|feedback|ferrari|ferrero|fi|fiat|fidelity|fido|film|final|finance|financial|fire|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|flir|florist|flowers|fly|fm|fo|foo|food|foodnetwork|football|ford|forex|forsale|forum|foundation|fox|fr|free|fresenius|frl|frogans|frontdoor|frontier|ftr|fujitsu|fujixerox|fun|fund|furniture|futbol|fyi|ga|gal|gallery|gallo|gallup|game|games|gap|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|george|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glade|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|godaddy|gold|goldpoint|golf|goo|goodhands|goodyear|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|grocery|group|gs|gt|gu|guardian|gucci|guge|guide|guitars|guru|gw|gy|hair|hamburg|hangout|haus|hbo|hdfc|hdfcbank|health|healthcare|help|helsinki|here|hermes|hgtv|hiphop|hisamitsu|hitachi|hiv|hk|hkt|hm|hn|hockey|holdings|holiday|homedepot|homegoods|homes|homesense|honda|honeywell|horse|hospital|host|hosting|hot|hoteles|hotels|hotmail|house|how|hr|hsbc|ht|htc|hu|hughes|hyatt|hyundai|ibm|icbc|ice|icu|id|ie|ieee|ifm|ikano|il|im|imamat|imdb|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|intel|international|intuit|investments|io|ipiranga|iq|ir|irish|is|iselect|ismaili|ist|istanbul|it|itau|itv|iveco|iwc|jaguar|java|jcb|jcp|je|jeep|jetzt|jewelry|jio|jlc|jll|jm|jmp|jnj|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|juniper|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kindle|kitchen|kiwi|km|kn|koeln|komatsu|kosher|kp|kpmg|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|ladbrokes|lamborghini|lamer|lancaster|lancia|lancome|land|landrover|lanxess|lasalle|lat|latino|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|lefrak|legal|lego|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|lilly|limited|limo|lincoln|linde|link|lipsy|live|living|lixil|lk|loan|loans|locker|locus|loft|lol|london|lotte|lotto|love|lpl|lplfinancial|lr|ls|lt|ltd|ltda|lu|lundbeck|lupin|luxe|luxury|lv|ly|ma|macys|madrid|maif|maison|makeup|man|management|mango|map|market|marketing|markets|marriott|marshalls|maserati|mattel|mba|mc|mckinsey|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|merckmsd|metlife|mg|mh|miami|microsoft|mil|mini|mint|mit|mitsubishi|mk|ml|mlb|mls|mm|mma|mn|mo|mobi|mobile|mobily|moda|moe|moi|mom|monash|money|monster|mopar|mormon|mortgage|moscow|moto|motorcycles|mov|movie|movistar|mp|mq|mr|ms|msd|mt|mtn|mtr|mu|museum|mutual|mv|mw|mx|my|mz|na|nab|nadex|nagoya|name|nationwide|natura|navy|nba|nc|ne|nec|net|netbank|netflix|network|neustar|new|newholland|news|next|nextdirect|nexus|nf|nfl|ng|ngo|nhk|ni|nico|nike|nikon|ninja|nissan|nissay|nl|no|nokia|northwesternmutual|norton|now|nowruz|nowtv|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|observer|off|office|okinawa|olayan|olayangroup|oldnavy|ollo|om|omega|one|ong|onl|online|onyourside|ooo|open|oracle|orange|org|organic|origins|osaka|otsuka|ott|ovh|pa|page|panasonic|panerai|paris|pars|partners|parts|party|passagens|pay|pccw|pe|pet|pf|pfizer|pg|ph|pharmacy|phd|philips|phone|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pioneer|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pnc|pohl|poker|politie|porn|post|pr|pramerica|praxi|press|prime|pro|prod|productions|prof|progressive|promo|properties|property|protection|pru|prudential|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|qvc|racing|radio|raid|re|read|realestate|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|reliance|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|richardli|ricoh|rightathome|ril|rio|rip|rmit|ro|rocher|rocks|rodeo|rogers|room|rs|rsvp|ru|rugby|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsclub|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|save|saxo|sb|sbi|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scjohnson|scor|scot|sd|se|search|seat|secure|security|seek|select|sener|services|ses|seven|sew|sex|sexy|sfr|sg|sh|shangrila|sharp|shaw|shell|shia|shiksha|shoes|shop|shopping|shouji|show|showtime|shriram|si|silk|sina|singles|site|sj|sk|ski|skin|sky|skype|sl|sling|sm|smart|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|srt|st|stada|staples|star|starhub|statebank|statefarm|statoil|stc|stcgroup|stockholm|storage|store|stream|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiftcover|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|talk|taobao|target|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|tdk|team|tech|technology|tel|telecity|telefonica|temasek|tennis|teva|tf|tg|th|thd|theater|theatre|tiaa|tickets|tienda|tiffany|tips|tires|tirol|tj|tjmaxx|tjx|tk|tkmaxx|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tr|trade|trading|training|travel|travelchannel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubank|ubs|uconnect|ug|uk|unicom|university|uno|uol|ups|us|uy|uz|va|vacations|vana|vanguard|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|vig|viking|villas|vin|vip|virgin|visa|vision|vista|vistaprint|viva|vivo|vlaanderen|vn|vodka|volkswagen|volvo|vote|voting|voto|voyage|vu|vuelos|wales|walmart|walter|wang|wanggou|warman|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weibo|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|winners|wme|wolterskluwer|woodside|work|works|world|wow|ws|wtc|wtf|xbox|xerox|xfinity|xihuan|xin|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--30rr7y|xn--3bst00m|xn--3ds443g|xn--3e0b707e|xn--3hcrj9c|xn--3oq18vl8pn36a|xn--3pxu8k|xn--42c2d9a|xn--45br5cyl|xn--45brj9c|xn--45q11c|xn--4gbrim|xn--54b7fta0cc|xn--55qw42g|xn--55qx5d|xn--5su34j936bgsg|xn--5tzm5g|xn--6frz82g|xn--6qq986b3xl|xn--80adxhks|xn--80ao21a|xn--80aqecdr1a|xn--80asehdb|xn--80aswg|xn--8y0a063a|xn--90a3ac|xn--90ae|xn--90ais|xn--9dbq2a|xn--9et52u|xn--9krt00a|xn--b4w605ferd|xn--bck1b9a5dre4c|xn--c1avg|xn--c2br7g|xn--cck2b3b|xn--cg4bki|xn--clchc0ea0b2g2a9gcd|xn--czr694b|xn--czrs0t|xn--czru2d|xn--d1acj3b|xn--d1alf|xn--e1a4c|xn--eckvdtc9d|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fhbei|xn--fiq228c5hs|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--fjq720a|xn--flw351e|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--fzys8d69uvgm|xn--g2xx48c|xn--gckr3f0f|xn--gecrj9c|xn--gk3at1e|xn--h2breg3eve|xn--h2brj9c|xn--h2brj9c8c|xn--hxt814e|xn--i1b6b1a6a2e|xn--imr513n|xn--io0a7i|xn--j1aef|xn--j1amh|xn--j6w193g|xn--jlq61u9w7b|xn--jvr189m|xn--kcrx77d1x4a|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--kput3i|xn--l1acc|xn--lgbbat1ad8j|xn--mgb9awbf|xn--mgba3a3ejt|xn--mgba3a4f16a|xn--mgba7c0bbn0a|xn--mgbaakc7dvf|xn--mgbaam7a8h|xn--mgbab2bd|xn--mgbai9azgqp6j|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a|xn--mgbbh1a71e|xn--mgbc0a9azcg|xn--mgbca7dzdo|xn--mgberp4a5d4ar|xn--mgbgu82a|xn--mgbi4ecexp|xn--mgbpl2fh|xn--mgbt3dhd|xn--mgbtx2b|xn--mgbx4cd0ab|xn--mix891f|xn--mk1bu44c|xn--mxtq1m|xn--ngbc5azd|xn--ngbe9e0a|xn--ngbrx|xn--node|xn--nqv7f|xn--nqv7fs00ema|xn--nyqy26a|xn--o3cw4h|xn--ogbpf8fl|xn--p1acf|xn--p1ai|xn--pbt977c|xn--pgbs0dh|xn--pssy2u|xn--q9jyb4c|xn--qcka1pmc|xn--qxam|xn--rhqv96g|xn--rovu88b|xn--rvc1e0am3e|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--tckwe|xn--tiq49xqyj|xn--unup4y|xn--vermgensberater-ctb|xn--vermgensberatung-pwb|xn--vhquv|xn--vuq861b|xn--w4r85el8fhu5dnra|xn--w4rs40l|xn--wgbh1c|xn--wgbl6a|xn--xhq521b|xn--xkc2al3hye2a|xn--xkc2dl3a5ee0h|xn--y9a3aq|xn--yfro4i67o|xn--ygbi2ammx|xn--zfr164b|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|you|youtube|yt|yun|za|zappos|zara|zero|zip|zippo|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ","᠎"],F=[],J=function(n){return new m(n)},V=J(),$=J(O),nn=J(x),en=J(),an=J(R);V.on("@",J(y)).on(".",J(k)).on("+",J(q)).on("#",J(N)).on("?",J(A)).on("/",J(L)).on("_",J(P)).on(":",J(v)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(w)),V.on("\n",J(z)).on(Z,an),an.on(Z,an);for(var tn=0;tn=0&&l++,s++,o++;if(!(l<0)){o-=l,s-=l;var u=c.emit();t.push(new u(n.substr(o-s,s)))}}return t},vn=V,kn=Object.freeze({State:m,TOKENS:Y,run:yn,start:vn}),wn=l();wn.prototype={type:"token",isLink:!1,toString:function(){for(var n=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(n)}}};var jn=a(wn,l(),{type:"email",isLink:!0}),zn=a(wn,l(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),On=a(wn,l(),{type:"text"}),qn=a(wn,l(),{type:"nl"}),Nn=a(wn,l(),{type:"url",isLink:!0,toHref:function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,a=!1,t=this.v,o=[],r=0;t[r]instanceof S;)e=!0,o.push(t[r].toString().toLowerCase()),r++;for(;t[r]instanceof L;)a=!0,o.push(t[r].toString()),r++;for(;g(t[r]);)o.push(t[r].toString().toLowerCase()),r++;for(;r=0&&u++,a++,c++;if(u<0)for(var g=a-c;g0&&(t.push(new On(o)),o=[]),a-=u,c-=u;var h=l.emit();t.push(new h(n.slice(a-c,a)))}}return o.length>0&&t.push(new On(o)),t},me=Object.freeze({State:f,TOKENS:Sn,run:pe,start:An});Array.isArray||(Array.isArray=function(n){return"[object Array]"===Object.prototype.toString.call(n)});var fe=function(n){return pe(yn(n))},de=function(n){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=fe(n),t=[],o=0;o1&&void 0!==arguments[1]?arguments[1]:null,a=fe(n);return 1===a.length&&a[0].isLink&&(!e||a[0].type===e)};e.find=de,e.inherits=a,e.options=b,e.parser=me,e.scanner=kn,e.test=xe,e.tokenize=fe}(self.linkify=self.linkify||{})}(); --------------------------------------------------------------------------------