├── __init__.py
├── cron
├── crontab
└── crontab.example
├── static
├── 403.html
├── 404.html
├── 500.html
├── uploads
│ └── readme.txt
├── css
│ ├── statistics.css
│ ├── border-h.gif
│ ├── border-v.gif
│ ├── jquery.awesome-cropper.css
│ ├── imgareaselect-default.css
│ ├── floatfixed.css
│ ├── tela-login-registro.css
│ ├── base.grey.css
│ ├── calendar.css
│ ├── team.css
│ ├── card_modal.css
│ ├── home-syle.css
│ ├── web2py_bootstrap_nojs.css
│ └── user.css
├── img
│ ├── logo.png
│ ├── clear.png
│ ├── images1.png
│ ├── loading.gif
│ ├── select2.png
│ ├── cor_fundo.png
│ ├── select2x2.png
│ ├── ajax-loader.gif
│ ├── breadcrumb.png
│ ├── menu-active.png
│ ├── scrumfor-me.png
│ ├── scrum_screen1.png
│ ├── scrum_screen2.png
│ ├── scrum_screen3.png
│ ├── scrumformelogo.png
│ ├── no-image_project.jpg
│ ├── select2-spinner.gif
│ ├── serach_icon_gray.png
│ ├── wild_oliva_light.png
│ ├── agenciax4-signature.png
│ ├── glyphicons-halflings.png
│ ├── glyphicons-halflings-white.png
│ └── login_register_background.png
├── audio
│ ├── notify.mp3
│ ├── notify.ogg
│ └── notify.wav
├── font
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.ttf
│ └── fontawesome-webfont.woff
├── fonts
│ ├── playball.eot
│ ├── playball.ttf
│ ├── playball.woff
│ ├── Elusive-Icons.eot
│ ├── Elusive-Icons.ttf
│ └── Elusive-Icons.woff
├── images
│ ├── facebook.png
│ ├── favicon.ico
│ ├── favicon.png
│ ├── gplus-32.png
│ ├── twitter.png
│ ├── scrumfor-me.png
│ ├── glyphicons-halflings.png
│ └── glyphicons-halflings-white.png
└── js
│ ├── delete_project.js
│ ├── board-livesearch.js
│ ├── tela-login-registro.js
│ ├── jquery.ui.touch-punch.min.js
│ ├── web2py_bootstrap.js
│ ├── jquery.livesearch.js
│ ├── board-editable.js
│ ├── bootstrap-custom.min.js
│ ├── highcharts
│ ├── modules
│ │ ├── funnel.js
│ │ └── data.js
│ ├── themes
│ │ ├── skies.js
│ │ ├── grid.js
│ │ ├── dark-green.js
│ │ ├── dark-blue.js
│ │ └── gray.js
│ └── adapters
│ │ ├── mootools-adapter.js
│ │ └── prototype-adapter.js
│ ├── team.js
│ ├── floatfixed.js
│ ├── share.js
│ ├── bootstrap-custom-modal.min.js
│ ├── sprints.js
│ ├── board-card.js
│ ├── realtime.js
│ ├── date.format.js
│ ├── sprints-modal.js
│ ├── base.js
│ └── dd_belatedpng.js
├── views
├── __init__.py
├── default
│ ├── nojs.html
│ ├── breadcrumb.html
│ ├── load_tasks.html
│ ├── statistics.html
│ ├── projects.html
│ ├── project_info.html
│ ├── check_your_email.html
│ ├── chat.html
│ ├── team.html
│ ├── header.html
│ ├── sprints.html
│ └── card.html
├── generic.json
├── generic.xml
├── generic.pdf
├── generic.rss
├── generic.html
├── generic.jsonp
├── generic.ics
├── web2py_ajax.html
├── generic.load
├── reset_password.html
├── verify_email.html
├── invite_project_email.html
└── generic.map
├── modules
├── __init__.py
├── data_config.py
├── realtime.py
├── convertImage.py
└── gravatar.py
├── ABOUT
├── LICENSE
├── controllers
└── setup.py
├── languages
├── plural-en.py
├── plural-ru.py
├── plural-uk.py
├── plural-cs.py
└── default.py
├── .gitignore
├── package.json
├── models
├── 15_my_field_properties.py
├── 05_auth_settings.py
├── 00_db.py
└── 10_define_my_own_tables.py
├── Gruntfile.js
└── README.md
/__init__.py:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/cron/crontab:
--------------------------------------------------------------------------------
1 | #crontab
--------------------------------------------------------------------------------
/static/403.html:
--------------------------------------------------------------------------------
1 | 403
2 |
--------------------------------------------------------------------------------
/static/404.html:
--------------------------------------------------------------------------------
1 | 404
2 |
--------------------------------------------------------------------------------
/static/500.html:
--------------------------------------------------------------------------------
1 | 500
2 |
--------------------------------------------------------------------------------
/views/__init__.py:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/cron/crontab.example:
--------------------------------------------------------------------------------
1 | #crontab
--------------------------------------------------------------------------------
/modules/__init__.py:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/views/default/nojs.html:
--------------------------------------------------------------------------------
1 |
{{=message}}
--------------------------------------------------------------------------------
/static/uploads/readme.txt:
--------------------------------------------------------------------------------
1 | here's all the pictures thumbnails
--------------------------------------------------------------------------------
/ABOUT:
--------------------------------------------------------------------------------
1 | Write something about this app.
2 | Developed with web2py.
3 |
--------------------------------------------------------------------------------
/static/css/statistics.css:
--------------------------------------------------------------------------------
1 | #all_content {
2 | background-color: #fff;
3 | }
--------------------------------------------------------------------------------
/views/generic.json:
--------------------------------------------------------------------------------
1 | {{from gluon.serializers import json}}{{=XML(json(response._vars))}}
2 |
--------------------------------------------------------------------------------
/static/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/logo.png
--------------------------------------------------------------------------------
/static/img/clear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/clear.png
--------------------------------------------------------------------------------
/static/img/images1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/images1.png
--------------------------------------------------------------------------------
/static/img/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/loading.gif
--------------------------------------------------------------------------------
/static/img/select2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/select2.png
--------------------------------------------------------------------------------
/views/generic.xml:
--------------------------------------------------------------------------------
1 | {{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}}
2 |
--------------------------------------------------------------------------------
/static/audio/notify.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/audio/notify.mp3
--------------------------------------------------------------------------------
/static/audio/notify.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/audio/notify.ogg
--------------------------------------------------------------------------------
/static/audio/notify.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/audio/notify.wav
--------------------------------------------------------------------------------
/static/css/border-h.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/css/border-h.gif
--------------------------------------------------------------------------------
/static/css/border-v.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/css/border-v.gif
--------------------------------------------------------------------------------
/static/img/cor_fundo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/cor_fundo.png
--------------------------------------------------------------------------------
/static/img/select2x2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/select2x2.png
--------------------------------------------------------------------------------
/static/font/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/font/FontAwesome.otf
--------------------------------------------------------------------------------
/static/fonts/playball.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/playball.eot
--------------------------------------------------------------------------------
/static/fonts/playball.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/playball.ttf
--------------------------------------------------------------------------------
/static/fonts/playball.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/playball.woff
--------------------------------------------------------------------------------
/static/images/facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/facebook.png
--------------------------------------------------------------------------------
/static/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/favicon.ico
--------------------------------------------------------------------------------
/static/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/favicon.png
--------------------------------------------------------------------------------
/static/images/gplus-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/gplus-32.png
--------------------------------------------------------------------------------
/static/images/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/twitter.png
--------------------------------------------------------------------------------
/static/img/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/ajax-loader.gif
--------------------------------------------------------------------------------
/static/img/breadcrumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/breadcrumb.png
--------------------------------------------------------------------------------
/static/img/menu-active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/menu-active.png
--------------------------------------------------------------------------------
/static/img/scrumfor-me.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/scrumfor-me.png
--------------------------------------------------------------------------------
/static/images/scrumfor-me.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/scrumfor-me.png
--------------------------------------------------------------------------------
/static/img/scrum_screen1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/scrum_screen1.png
--------------------------------------------------------------------------------
/static/img/scrum_screen2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/scrum_screen2.png
--------------------------------------------------------------------------------
/static/img/scrum_screen3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/scrum_screen3.png
--------------------------------------------------------------------------------
/static/img/scrumformelogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/scrumformelogo.png
--------------------------------------------------------------------------------
/static/fonts/Elusive-Icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/Elusive-Icons.eot
--------------------------------------------------------------------------------
/static/fonts/Elusive-Icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/Elusive-Icons.ttf
--------------------------------------------------------------------------------
/static/fonts/Elusive-Icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/fonts/Elusive-Icons.woff
--------------------------------------------------------------------------------
/static/img/no-image_project.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/no-image_project.jpg
--------------------------------------------------------------------------------
/static/img/select2-spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/select2-spinner.gif
--------------------------------------------------------------------------------
/static/img/serach_icon_gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/serach_icon_gray.png
--------------------------------------------------------------------------------
/static/img/wild_oliva_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/wild_oliva_light.png
--------------------------------------------------------------------------------
/static/img/agenciax4-signature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/agenciax4-signature.png
--------------------------------------------------------------------------------
/static/font/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/font/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/static/font/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/font/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/static/font/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/font/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/static/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/static/images/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/glyphicons-halflings.png
--------------------------------------------------------------------------------
/static/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/static/img/login_register_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/img/login_register_background.png
--------------------------------------------------------------------------------
/static/images/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kolaborativa/scrumforme/HEAD/static/images/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The web2py welcome app is licensed under public domain
2 | (except for the css and js files that it includes, which have their own third party licenses).
3 |
4 | You can modify this license when you add your own code.
5 |
--------------------------------------------------------------------------------
/modules/data_config.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | ## Authentication with Facebook
4 |
5 | FACEBOOK_ID = ''
6 | FACEBOOK_SECRET = ''
7 |
8 | ## Authentication for sending mail
9 |
10 | EMAIL_SERVER = 'smtp.gmail.com:587'
11 | CLIENT_EMAIL = 'you@gmail.com'
12 | CLIENT_LOGIN = 'username:password'
--------------------------------------------------------------------------------
/static/js/delete_project.js:
--------------------------------------------------------------------------------
1 | // Delete project
2 | $('.delete_project').click(function(){
3 | var project_id = $(this)[0].dataset['project'];
4 | var remove = confirm(msg.confirmRemove);
5 | if (remove){
6 | window.location = url.delete_project + '?project_id=' + project_id;
7 | }
8 | });
9 |
--------------------------------------------------------------------------------
/modules/realtime.py:
--------------------------------------------------------------------------------
1 | def _update_card(element):
2 | from gluon.contrib.websocket_messaging import websocket_send
3 | import json
4 | # sending websocket message
5 | # js = "console.log('Here boy!!!')"
6 | data = json.dumps(element)
7 | print "novo"
8 | websocket_send('http://localhost:8888', element, 'mykey', 'mygroup')
9 |
--------------------------------------------------------------------------------
/controllers/setup.py:
--------------------------------------------------------------------------------
1 | __author__ = 'Anna Cruz'
2 |
3 |
4 | def install():
5 | '''
6 | This is a function to populate role table before use the application
7 | :return: nothing
8 | '''
9 | roles = ['Product Owner', 'Scrum Master', 'Team', 'Guest']
10 | for role in roles:
11 | db.role.insert(name=role)
12 | return ""
13 |
--------------------------------------------------------------------------------
/views/generic.pdf:
--------------------------------------------------------------------------------
1 | {{
2 | import os
3 | from gluon.contrib.generics import pdf_from_html
4 | filename = '%s/%s.html' % (request.controller,request.function)
5 | if os.path.exists(os.path.join(request.folder,'views',filename)):
6 | html=response.render(filename)
7 | else:
8 | html=BODY(BEAUTIFY(response._vars)).xml()
9 | pass
10 | =pdf_from_html(html)
11 | }}
12 |
--------------------------------------------------------------------------------
/languages/plural-en.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | {
3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
4 | 'account': ['accounts'],
5 | 'book': ['books'],
6 | 'is': ['are'],
7 | 'man': ['men'],
8 | 'miss': ['misses'],
9 | 'person': ['people'],
10 | 'quark': ['quarks'],
11 | 'shop': ['shops'],
12 | 'this': ['these'],
13 | 'was': ['were'],
14 | 'woman': ['women'],
15 | }
16 |
--------------------------------------------------------------------------------
/views/generic.rss:
--------------------------------------------------------------------------------
1 | {{
2 | ###
3 | # response._vars contains the dictionary returned by the controller action
4 | # for this to work the action must return something like
5 | #
6 | # dict(title=...,link=...,description=...,created_on='...',items=...)
7 | #
8 | # items is a list of dictionaries each with title, link, description, pub_date.
9 | ###
10 | from gluon.serializers import rss}}{{=XML(rss(response._vars))}}
11 |
--------------------------------------------------------------------------------
/static/css/jquery.awesome-cropper.css:
--------------------------------------------------------------------------------
1 | .awesome-cropper {
2 | }
3 | .awesome-cropper-drop-area {
4 | }
5 | .awesome-cropper .preview {
6 | }
7 | .awesome-cropper .modal, .awesome-cropper .modal.fade.in {
8 | /*width: 900px;*/
9 | /*width: 60%;*/
10 | /*margin-left: -450px;*/
11 | /*margin-right: -480px;*/
12 | /*top: 10%;*/
13 | }
14 | .awesome-cropper .modal-body {
15 | max-height: none;
16 | /*width: 100%;*/
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # backup, log files and compiled sources
2 | *.*~
3 | *.bak
4 | *.log
5 | *.ogv
6 | *.pyc
7 | *.swp
8 | *.avi
9 |
10 | # sqlite database files and web2py table structs
11 | *.sqlite
12 | *.table
13 |
14 | # web2py cache, errors and sessions files
15 | cache/*
16 | errors/*
17 | sessions/*
18 |
19 | # project ignored files
20 | static/uploads/*.png
21 | static/uploads/*.jpg
22 | static/uploads/*.gif
23 | static/uploads/*.txt
24 |
25 | # ide files
26 | .idea
27 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "scrumforme",
3 | "version": "0.0.1",
4 | "description": "Scrumforme",
5 | "homepage": "http://scrumform.me",
6 | "repository": {
7 | "type": "git",
8 | "url": "https://github.com/gustavox4ids/scrumforme"
9 | },
10 | "engines": {
11 | "node": "0.10.x",
12 | "npm": "1.2.x"
13 | },
14 | "devDependencies": {
15 | "grunt": "~0.4.1",
16 | "grunt-contrib-concat": "~0.3.0",
17 | }
18 | }
--------------------------------------------------------------------------------
/views/default/breadcrumb.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/views/generic.html:
--------------------------------------------------------------------------------
1 | {{extend 'layout.html'}}
2 | {{"""
3 |
4 | You should not modify this file.
5 | It is used as default when a view is not provided for your controllers
6 |
7 | """}}
8 | {{=' '.join(x.capitalize() for x in request.function.split('_'))}}
9 | {{if len(response._vars)==1:}}
10 | {{=BEAUTIFY(response._vars.values()[0])}}
11 | {{elif len(response._vars)>1:}}
12 | {{=BEAUTIFY(response._vars)}}
13 | {{pass}}
14 | {{if request.is_local:}}
15 | {{=response.toolbar()}}
16 | {{pass}}
17 |
--------------------------------------------------------------------------------
/languages/plural-ru.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | {
3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
4 | 'выбрана': ['выбраны','выбрано'],
5 | 'запись': ['записи','записей'],
6 | 'изменена': ['изменены','изменено'],
7 | 'строка': ['строки','строк'],
8 | 'удалена': ['удалены','удалено'],
9 | 'день': ['дня', 'дней'],
10 | 'месяц': ['месяца','месяцев'],
11 | 'неделю': ['недели','недель'],
12 | 'год': ['года','лет'],
13 | 'час': ['часа','часов'],
14 | 'минуту': ['минуты','минут'],
15 | 'секунду': ['секунды','секунд'],
16 | }
17 |
--------------------------------------------------------------------------------
/views/generic.jsonp:
--------------------------------------------------------------------------------
1 | {{
2 | ###
3 | # response._vars contains the dictionary returned by the controller action
4 | ###
5 | try:
6 | from gluon.serializers import json
7 | result = "%s(%s)" % (request.vars['callback'], json(response._vars))
8 | response.write(result, escape=False)
9 | response.headers['Content-Type'] = 'application/jsonp'
10 | except (TypeError, ValueError):
11 | raise HTTP(405, 'JSON serialization error')
12 | except ImportError:
13 | raise HTTP(405, 'JSON not available')
14 | except:
15 | raise HTTP(405, 'JSON error')
16 | }}
--------------------------------------------------------------------------------
/views/generic.ics:
--------------------------------------------------------------------------------
1 | {{
2 | ###
3 | # response._vars contains the dictionary returned by the controller action
4 | # Assuming something like:
5 | #
6 | # db.define_table('event',
7 | # Field('title'),
8 | # Field('start_datetime','datetime'),
9 | # Field('stop_datetime','datetime'))
10 | # events = db(db.event).select()
11 | #
12 | # Aor this to work the action must return something like
13 | #
14 | # dict(events=events, title='title',link=URL('action'),timeshift=0)
15 | #
16 | ###
17 | from gluon.serializers import ics}}{{=XML(ics(**response._vars))}}
18 |
--------------------------------------------------------------------------------
/languages/plural-uk.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | {
3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
4 | 'байт': ['байти','байтів'],
5 | 'годину': ['години','годин'],
6 | 'елемент': ['елементи','елементів'],
7 | 'запис': ['записи','записів'],
8 | 'поцілювання': ['поцілювання','поцілювань'],
9 | 'рядок': ['рядки','рядків'],
10 | 'секунду': ['секунди','секунд'],
11 | 'схибнення': ['схибнення','схибнень'],
12 | 'хвилину': ['хвилини','хвилин'],
13 | 'день': ['дні', 'днів'],
14 | 'місяць': ['місяці','місяців'],
15 | 'тиждень': ['тижні','тижнів'],
16 | 'рік': ['роки','років'],
17 | }
18 |
--------------------------------------------------------------------------------
/modules/convertImage.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | ## Convert string Base64 Images
4 |
5 | def convertBase64String(base64Img,uploadfolder):
6 | if base64Img.startswith("data:image/png;base64,"):
7 | import base64
8 | import random
9 | base64Img = base64Img[22:]
10 | image = base64.b64decode(base64Img)
11 | filename = "projects_thumbnail_%s%s.png" %(random.random(), random.random())
12 |
13 | with open(uploadfolder+filename, 'wb') as imgFile:
14 | imgFile.write(image)
15 |
16 | return filename
17 |
18 | else:
19 | return False
--------------------------------------------------------------------------------
/models/15_my_field_properties.py:
--------------------------------------------------------------------------------
1 | Project.name.requires=IS_NOT_EMPTY(error_message=T('The field name can not be empty!'))
2 | Sprint.name.requires=IS_NOT_EMPTY(error_message=T('The field name can not be empty!'))
3 | Sprint.weeks.requires=IS_NOT_EMPTY(error_message=T('Choose how many weeks for your sprint!'))
4 | Story.title.requires=IS_NOT_EMPTY(error_message=T('This field can not be empty!'))
5 | Story.benefit.requires=IS_NOT_EMPTY(error_message=T('This field can not be empty!'))
6 | Story.story_points.requires=IS_NOT_EMPTY(error_message=T('This field can not be empty!'))
7 | Definition_ready.title.requires=IS_NOT_EMPTY(error_message=T('This field can not be empty!'))
8 |
--------------------------------------------------------------------------------
/languages/plural-cs.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | {
3 | # "singular form (0)": ["first plural form (1)", "second plural form (2)", ...],
4 | 'vteřina': ['vteřiny', 'vteřin'],
5 | 'vteřinou': ['vteřinami', 'vteřinami'],
6 | 'minuta': ['minuty', 'minut'],
7 | 'minutou': ['minutami', 'minutami'],
8 | 'hodina': ['hodiny','hodin'],
9 | 'hodinou': ['hodinami','hodinami'],
10 | 'den': ['dny','dnů'],
11 | 'dnem': ['dny','dny'],
12 | 'týden': ['týdny','týdnů'],
13 | 'týdnem': ['týdny','týdny'],
14 | 'měsíc': ['měsíce','měsíců'],
15 | 'měsícem': ['měsíci','měsíci'],
16 | 'rok': ['roky','let'],
17 | 'rokem': ['roky','lety'],
18 | 'záznam': ['záznamy', 'záznamů'],
19 | 'soubor': ['soubory', 'souborů']
20 | }
21 |
--------------------------------------------------------------------------------
/static/js/board-livesearch.js:
--------------------------------------------------------------------------------
1 | // livesearch
2 | $('input[name="livesearch"]').search('.task', function(on) {
3 | var nofound = $('#nothingfound'),
4 | td = $('.table td'),
5 | ul = $('.table ul');
6 |
7 | on.reset(function(ui) {
8 | nofound.hide();
9 | td.show();
10 | ul.show();
11 | });
12 |
13 | on.empty(function() {
14 | nofound.show();
15 | td.hide();
16 | ul.hide();
17 | });
18 |
19 | on.results(function(results) {
20 | nofound.hide();
21 | td.hide();
22 | ul.hide();
23 | $(results).closest("td").show();
24 | $(results).closest("ul").show();
25 | $(results).closest("tr").find("td").show();
26 | });
27 | });
--------------------------------------------------------------------------------
/views/web2py_ajax.html:
--------------------------------------------------------------------------------
1 |
8 | {{
9 | response.files.insert(0,URL('static','js/jquery.js'))
10 | response.files.insert(1,URL('static','css/calendar.css'))
11 | response.files.insert(2,URL('static','js/calendar.js'))
12 | response.files.insert(3,URL('static','js/web2py.js'))
13 | response.include_meta()
14 | response.include_files()
15 | }}
16 |
--------------------------------------------------------------------------------
/static/js/tela-login-registro.js:
--------------------------------------------------------------------------------
1 | document.addEventListener("DOMContentLoaded", tudo);
2 | function tudo(){
3 | document.getElementById("login_index").addEventListener("click", mostra_login)
4 | document.getElementById("registro_index").addEventListener("click", mostra_registro)
5 | }
6 | function mostra_login(){
7 | document.getElementById("registro").style.display = "none"
8 | document.getElementById("entrar").style.display = "block"
9 | document.getElementById("login_index").style.background = "#34abbd"
10 | document.getElementById("registro_index").style.background = "#197a8b"
11 | }
12 | function mostra_registro(){
13 | document.getElementById("entrar").style.display = "none"
14 | document.getElementById("registro").style.display = "block"
15 | document.getElementById("login_index").style.background = "#197a8b"
16 | document.getElementById("registro_index").style.background = "#34abbd"
17 | }
--------------------------------------------------------------------------------
/static/css/imgareaselect-default.css:
--------------------------------------------------------------------------------
1 | /*
2 | * imgAreaSelect default style
3 | */
4 |
5 | .imgareaselect-border1 {
6 | background: url(border-v.gif) repeat-y left top;
7 | }
8 |
9 | .imgareaselect-border2 {
10 | background: url(border-h.gif) repeat-x left top;
11 | }
12 |
13 | .imgareaselect-border3 {
14 | background: url(border-v.gif) repeat-y right top;
15 | }
16 |
17 | .imgareaselect-border4 {
18 | background: url(border-h.gif) repeat-x left bottom;
19 | }
20 |
21 | .imgareaselect-border1, .imgareaselect-border2,
22 | .imgareaselect-border3, .imgareaselect-border4 {
23 | filter: alpha(opacity=50);
24 | opacity: 0.5;
25 | }
26 |
27 | .imgareaselect-handle {
28 | background-color: #fff;
29 | border: solid 1px #000;
30 | filter: alpha(opacity=50);
31 | opacity: 0.5;
32 | }
33 |
34 | .imgareaselect-outer {
35 | background-color: #000;
36 | filter: alpha(opacity=50);
37 | opacity: 0.5;
38 | }
39 |
40 | .imgareaselect-selection {
41 | }
--------------------------------------------------------------------------------
/views/generic.load:
--------------------------------------------------------------------------------
1 | {{'''
2 | # License: Public Domain
3 | # Author: Iceberg at 21cn dot com
4 |
5 | With this generic.load file, you can use same function to serve two purposes.
6 |
7 | = regular action
8 | - ajax callback (when called with .load)
9 |
10 | Example modified from http://www.web2py.com/AlterEgo/default/show/252:
11 |
12 | def index():
13 | return dict(
14 | part1='hello world',
15 | part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True))
16 |
17 | def auxiliary():
18 | form=SQLFORM.factory(Field('name'))
19 | if form.accepts(request.vars):
20 | response.flash = 'ok'
21 | return dict(message="Hello %s" % form.vars.name)
22 | return dict(form=form)
23 |
24 | Notice:
25 |
26 | - no need to set response.headers['web2py-response-flash']
27 | - no need to return a string
28 | even if the function is called via ajax.
29 |
30 | '''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}}
--------------------------------------------------------------------------------
/static/css/floatfixed.css:
--------------------------------------------------------------------------------
1 | #back-top {
2 | background-color: #222236;
3 | background-color: rgba(0, 0, 0, 0.3);
4 | color: #fff;
5 | font-size: 18px;
6 | width: 40px;
7 | height: 40px;
8 | text-align: center;
9 | line-height: 40px;
10 | position: fixed;
11 | bottom: 60px;
12 | right: 20px;
13 | display: none;
14 | overflow: hidden;
15 | z-index: 1000;
16 | -webkit-border-radius: 20px;
17 | -webkit-background-clip: padding-box;
18 | -moz-border-radius: 20px;
19 | -moz-background-clip: padding;
20 | border-radius: 20px;
21 | background-clip: padding-box;
22 | -webkit-transition: background 0.3s ease-in-out;
23 | -moz-transition: background 0.3s ease-in-out;
24 | -o-transition: background 0.3s ease-in-out;
25 | -ms-transition: background 0.3s ease-in-out;
26 | transition: background 0.3s ease-in-out;
27 | text-decoration: none
28 | }
29 | #back-top:hover,
30 | #back-top:focus {
31 | background-color: #181826;
32 | background-color: rgba(0, 0, 0, 0.5);
33 | color: #fff;
34 | text-decoration: none;
35 | }
36 | .standardClass:after{
37 | content: '^';
38 | }
39 |
40 | .fixed-nav{
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/static/js/jquery.ui.touch-punch.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery UI Touch Punch 0.2.2
3 | *
4 | * Copyright 2011, Dave Furfero
5 | * Dual licensed under the MIT or GPL Version 2 licenses.
6 | *
7 | * Depends:
8 | * jquery.ui.widget.js
9 | * jquery.ui.mouse.js
10 | */
11 | (function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
--------------------------------------------------------------------------------
/views/reset_password.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
{{=T("Reset your password!")}}
13 |
14 | {{=T("Click on the link")}} {{=link}} {{=T("to change your password")}}
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/views/verify_email.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
{{=T("Activate your registration!")}}
13 |
14 | {{=T("Click on the link")}} {{=link}} {{=T("to verify your email")}}
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/models/05_auth_settings.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | def __afterVerify(form):
4 | """Function that creates a person
5 | """
6 | name = '%s %s' % (form.first_name, form.last_name)
7 | person_id = Person.insert(name=name)
8 | db.user_relationship.insert(auth_user_id=form.id, person_id=person_id)
9 |
10 |
11 | def send_email(type_email):
12 | data = {
13 | "verify_email" : {'link' : 'http://'+request.env.http_host+URL(r=request,c='default',f='user',args=['verify_email'])+'/%(key)s', 'render_view' : 'verify_email.html'},
14 | "reset_password" : {'link' : 'http://'+request.env.http_host+URL(r=request,c='default',f='user',args=['reset_password'])+'/%(key)s', 'render_view' : 'reset_password.html'},
15 | }
16 | link = data[type_email]["link"]
17 | context = dict(link=link)
18 |
19 | return response.render(data[type_email]["render_view"], context)
20 |
21 | auth.settings.verify_email_onaccept = lambda form: __afterVerify(form)
22 | auth.messages.verify_email = send_email("verify_email")
23 | auth.messages.reset_password = send_email("reset_password")
24 |
25 | auth.settings.register_fields = ['first_name', 'last_name', 'email', 'password']
26 | auth.settings.register_next= URL('check_your_email')
27 | auth.settings.login_next = URL('projects')
--------------------------------------------------------------------------------
/static/js/web2py_bootstrap.js:
--------------------------------------------------------------------------------
1 | // this code improves bootstrap menus and adds dropdown support
2 | jQuery(function(){
3 | jQuery('.nav>li>a').each(function(){
4 | if(jQuery(this).parent().find('ul').length)
5 | jQuery(this).attr({'class':'dropdown-toggle','data-toggle':'dropdown'}).append(' ');
6 | });
7 | jQuery('.nav li li').each(function(){
8 | if(jQuery(this).find('ul').length)
9 | jQuery(this).addClass('dropdown-submenu');
10 | });
11 | function hoverMenu(){
12 | var wid = document.documentElement.clientWidth; //faster than $(window).width() and cross browser
13 | if (wid>=980){
14 | jQuery('ul.nav a.dropdown-toggle').parent().hover(function(){
15 | mi = jQuery(this).addClass('open');
16 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeIn(400);
17 | }, function(){
18 | mi = jQuery(this);
19 | mi.children('.dropdown-menu').stop(true, true).delay(200).fadeOut(function(){mi.removeClass('open')});
20 | });
21 | };
22 | }
23 | hoverMenu(); // first page load
24 | jQuery(window).resize(hoverMenu); // on resize event
25 | jQuery('ul.nav li.dropdown a').click(function(){window.location=jQuery(this).attr('href');});
26 | // make all buttons bootstrap buttons
27 | jQuery('button, form input[type="submit"], form input[type="button"]').addClass('btn');
28 | });
29 |
--------------------------------------------------------------------------------
/views/default/load_tasks.html:
--------------------------------------------------------------------------------
1 | {{count=0}}
2 | {{for task in tasks:}}
3 |
4 |
5 |
6 | {{if tasks[task]["owner_task"]:}}
7 |
8 | {{else:}}
9 |
10 | {{pass}}
11 |
12 |
13 |
{{=tasks[task]["title"]}}
14 |
15 | {{if tasks[task]["started"]:}}
16 |
17 | {{pass}}
18 | {{if tasks[task]["comments"]:}}
19 |
20 | {{pass}}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | {{count +=1}}
29 | {{pass}}
--------------------------------------------------------------------------------
/views/default/statistics.html:
--------------------------------------------------------------------------------
1 | {{extend 'default/layout_base.html'}}
2 |
3 |
34 |
35 |
40 |
41 |
49 |
50 |
--------------------------------------------------------------------------------
/static/js/jquery.livesearch.js:
--------------------------------------------------------------------------------
1 | (function($) {
2 | $.extend($.expr[':'], {
3 | 'containsi': function(elem, i, match, array) {
4 | return $(elem).text().toLowerCase()
5 | .indexOf((match[3] || "").toLowerCase()) >= 0;
6 | }
7 | });
8 |
9 | var Search = function(block) {
10 | this.callbacks = {};
11 | block(this);
12 | }
13 |
14 | Search.prototype.all = function(fn) { this.callbacks.all = fn; }
15 | Search.prototype.reset = function(fn) { this.callbacks.reset = fn; }
16 | Search.prototype.empty = function(fn) { this.callbacks.empty = fn; }
17 | Search.prototype.results = function(fn) { this.callbacks.results = fn; }
18 |
19 | function query(selector) {
20 | if (val = this.val()) {
21 | return $(selector + ':containsi("' + val + '")');
22 | } else {
23 | return false;
24 | }
25 | }
26 |
27 | $.fn.search = function search(selector, block) {
28 | var search = new Search(block);
29 | var callbacks = search.callbacks;
30 |
31 | function perform() {
32 | if (result = query.call($(this), selector)) {
33 | callbacks.all && callbacks.all.call(this, result);
34 | var method = result.size() > 0 ? 'results' : 'empty';
35 | return callbacks[method] && callbacks[method].call(this, result);
36 | } else {
37 | callbacks.all && callbacks.all.call(this, $(selector));
38 | return callbacks.reset && callbacks.reset.call(this);
39 | };
40 | }
41 |
42 | $(this).on('keypress', perform);
43 | $(this).on('keydown', perform);
44 | $(this).on('keyup', perform);
45 | $(this).bind('blur', perform);
46 | }
47 | })(jQuery);
48 |
--------------------------------------------------------------------------------
/views/default/projects.html:
--------------------------------------------------------------------------------
1 | {{extend 'default/layout_base.html'}}
2 |
11 |
12 |
13 |
14 |
15 | {{if own_projects:}}
16 |
{{=T('My Projects')}} {{=len(own_projects)}}
17 |
18 | {{for i in own_projects:}}
19 |
20 | {{=i.name}}
21 | {{=T("delete")}}
22 |
23 | {{pass}}
24 |
25 | {{pass}}
26 |
27 |
28 | {{if all_shared_with:}}
29 |
{{=T('Projects that I am part')}} {{=len(all_shared_with)}}
30 |
35 | {{pass}}
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/static/js/board-editable.js:
--------------------------------------------------------------------------------
1 | // =============
2 | // PLUGIN HACKS
3 | // =============
4 |
5 | // modify style buttons
6 | $.fn.editableform.buttons =
7 | ' ' +
8 | ' ';
9 | $.fn.editable.defaults.mode = 'inline';
10 |
11 | //apply editable to parent div
12 | $('.table').editable({
13 | selector: 'a.editable',
14 | url: url.create_or_update_itens,
15 | emptytext: msg.field_empty,
16 | rows: 1,
17 | params: function(params) {
18 | // sending parameters indicating whether the item is to upgrade or not
19 | // send the new ID as param
20 | var dbUpdate = $(this).attr("data-update"),
21 | dbID = $(this).attr("data-pk"),
22 | definitionready = $(this).closest('.item_container').attr('data-definitionready');
23 |
24 | if (dbUpdate) {
25 | params.dbUpdate = true;
26 | params.dbID = dbID;
27 | } else {
28 | params.dbUpdate = false;
29 | params.definitionready = definitionready;
30 | }
31 |
32 | params.project_id = info.project_id;
33 | params.page = info.page;
34 | return params;
35 | },
36 | validate: function(value) {
37 | if (value === '') return msg.validation_error;
38 | },
39 | success: function(value, response) {
40 | // get the coming new database ID and update in DOM
41 | $(this).attr("data-pk", value.database_id);
42 | // changes the status of the created item for item update
43 | $(this).attr("data-update", true);
44 | }
45 | });
--------------------------------------------------------------------------------
/static/js/bootstrap-custom.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Bootstrap.js by @fat & @mdo
3 | * plugins: bootstrap-dropdown.js
4 | * Copyright 2012 Twitter, Inc.
5 | * http://www.apache.org/licenses/LICENSE-2.0.txt
6 | */
7 | !function(a){function d(){a(b).each(function(){e(a(this)).removeClass("open")})}function e(b){var c=b.attr("data-target"),d;c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,"")),d=c&&a(c);if(!d||!d.length)d=b.parent();return d}var b="[data-toggle=dropdown]",c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),f,g;if(c.is(".disabled, :disabled"))return;return f=e(c),g=f.hasClass("open"),d(),g||f.toggleClass("open"),c.focus(),!1},keydown:function(c){var d,f,g,h,i,j;if(!/(38|40|27)/.test(c.keyCode))return;d=a(this),c.preventDefault(),c.stopPropagation();if(d.is(".disabled, :disabled"))return;h=e(d),i=h.hasClass("open");if(!i||i&&c.keyCode==27)return c.which==27&&h.find(b).focus(),d.click();f=a("[role=menu] li:not(.divider):visible a",h);if(!f.length)return;j=f.index(f.filter(":focus")),c.keyCode==38&&j>0&&j--,c.keyCode==40&&j
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
{{=T("Hello")}} {{=person.auth_user_id.first_name}},
13 |
14 | {{=T("You have been invited for the project")}} {{=project.name}}.
15 |
16 |
17 | {{=T("Click on the link")}} {{="http://"+request.env.http_host+URL(f="team",args=project.id)}} {{=T("to access the project")}}.
18 |
19 |
20 |
21 |
22 |