├── .gitignore ├── ABOUT ├── LICENSE ├── README.md ├── __init__.py ├── cache └── .gitkeep ├── controllers ├── api.py ├── appadmin.py └── default.py ├── cron ├── crontab └── crontab.example ├── databases └── .gitkeep ├── errors └── .gitkeep ├── languages ├── ar.py ├── ca.py ├── cs.py ├── de.py ├── default.py ├── en.py ├── es.py ├── fr-ca.py ├── fr.py ├── hi.py ├── hu.py ├── id.py ├── it.py ├── my-mm.py ├── my.py ├── nl.py ├── pl.py ├── plural-cs.py ├── plural-en.py ├── plural-es.py ├── plural-ru.py ├── plural-uk.py ├── pt-br.py ├── pt.py ├── ro.py ├── ru.py ├── sk.py ├── tr.py ├── uk.py ├── zh-cn.py ├── zh-tw.py └── zh.py ├── mix-manifest.json ├── models ├── db.py └── menu.py ├── modules └── __init__.py ├── package-lock.json ├── package.json ├── private └── appconfig.ini ├── progress.log ├── resources └── assets │ ├── .DS_Store │ ├── icons │ ├── lock.svg │ └── user.svg │ ├── img │ ├── favicon-32x32.png │ └── v.png │ ├── js │ ├── .DS_Store │ ├── app.js │ ├── components │ │ ├── App.vue │ │ ├── FeedbackMessage.vue │ │ ├── Icon.vue │ │ ├── Loading.vue │ │ ├── NavMenu.vue │ │ ├── PageFooter.vue │ │ ├── ProgressBar.vue │ │ ├── ToolBar.vue │ │ ├── form │ │ │ ├── EmailInput.vue │ │ │ ├── PasswordInput.vue │ │ │ ├── SubmitButton.vue │ │ │ └── TextInput.vue │ │ └── index.js │ ├── layouts │ │ ├── app.vue │ │ └── default.vue │ ├── pages │ │ ├── .DS_Store │ │ ├── auth │ │ │ ├── login.vue │ │ │ ├── password │ │ │ │ ├── email.vue │ │ │ │ └── reset.vue │ │ │ └── register.vue │ │ ├── errors │ │ │ └── 404.vue │ │ ├── home.vue │ │ ├── settings │ │ │ ├── index.vue │ │ │ ├── password.vue │ │ │ └── profile.vue │ │ └── welcome.vue │ ├── plugins │ │ ├── axios.js │ │ ├── index.js │ │ ├── validation.js │ │ └── vue-i18n.js │ ├── router │ │ ├── index.js │ │ └── routes.js │ └── store │ │ ├── index.js │ │ ├── modules │ │ ├── auth.js │ │ ├── brand.js │ │ └── message.js │ │ └── mutation-types.js │ └── stylus │ └── app.styl ├── sessions └── .gitkeep ├── static ├── 403.html ├── 404.html ├── 500.html ├── 503.html ├── css │ ├── bootstrap-theme.min.css │ ├── bootstrap.min.css │ ├── calendar.css │ ├── web2py-bootstrap3.css │ ├── web2py-bootstrap4.css │ └── web2py.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── images │ ├── background.jpg │ ├── facebook.png │ ├── favicon.ico │ ├── favicon.png │ ├── gplus-32.png │ └── twitter.png ├── img │ ├── favicon-32x32.png │ └── v.png ├── js │ ├── analytics.min.js │ ├── bootstrap.min.js │ ├── calendar.js │ ├── jquery.js │ ├── modernizr-2.8.3.min.js │ ├── respond-1.4.2.min.js │ ├── share.js │ ├── web2py-bootstrap3.js │ ├── web2py-bootstrap4.js │ └── web2py.js └── public │ └── lang │ └── en.json ├── uploads └── .gitkeep ├── views ├── __init__.py ├── appadmin.html ├── default │ ├── index.html │ └── user.html ├── generic.html ├── generic.ics ├── generic.json ├── generic.jsonp ├── generic.load ├── generic.map ├── generic.pdf ├── generic.rss ├── generic.xml ├── layout.html └── web2py_ajax.html └── webpack.mix.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | sessions 3 | errors 4 | *.pyc 5 | databases 6 | static/public/js 7 | static/public/css 8 | static/public/img 9 | -------------------------------------------------------------------------------- /ABOUT: -------------------------------------------------------------------------------- 1 | Write something about this app. 2 | Developed with web2py. 3 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## web2py vuejs vuetify 2 | 3 | This is a project to integrate formally Web2py with Vue.js 4 | 5 | Include: 6 | - [Web2py](http://web2py.com) 7 | - [Vue.js](https://vuejs.org) 8 | - [Vuetify](https://vuetifyjs.com) 9 | - [vee-validate](https://github.com/baianat/vee-validate) 10 | - [axios](https://github.com/axios/axios) 11 | - [vue-i18n](https://github.com/kazupon/vue-i18n) 12 | - [vue-router](https://router.vuejs.org) 13 | - more... 14 | 15 | ## Install 16 | 17 | Enter Web2py applications folder 18 | ```sh 19 | $ cd applications 20 | ``` 21 | Clone this repo 22 | ``` 23 | $ git clone https://github.com/robertop23/web2py_vuejs_vuetify 24 | ``` 25 | Enter web2py_vuejs_vuetify folder 26 | ``` 27 | $ cd web2py_vuejs_vuetify 28 | ``` 29 | Install npm dependencies 30 | ``` 31 | $ npm install 32 | ``` 33 | Create and watch your vue app and related Files 34 | ``` 35 | $ npm run watch 36 | ``` 37 | 38 | The Vue files are inside resources folder 39 | 40 | ## TODO: 41 | 42 | - Make all auth process 43 | - Fix vue routing 44 | - login 45 | - logout 46 | - register 47 | - reset password 48 | - Test 49 | - Join web2py translations with inner translations? 50 | - Join Web2py Menu with vue menu? 51 | - Better looking Frontpage 52 | 53 | ## Contributing: 54 | 55 | Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/robertop23/web2py_vuejs_vuetify/issues/new). 56 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/cache/.gitkeep -------------------------------------------------------------------------------- /controllers/api.py: -------------------------------------------------------------------------------- 1 | import json 2 | from gluon.tools import AuthJWT, AuthAPI 3 | import requests 4 | import hashlib 5 | from gluon.contrib.appconfig import AppConfig 6 | from gluon.tools import Mail 7 | import uuid 8 | 9 | myconf = AppConfig() 10 | 11 | myjwt = AuthJWT(auth, secret_key='secret') 12 | 13 | mail = Mail() 14 | mail.settings.server = myconf.take('smtp.server') 15 | mail.settings.sender = myconf.take('smtp.sender') 16 | mail.settings.login = myconf.take('smtp.login') 17 | 18 | 19 | def api_requires_extension(func): 20 | def wrapper(*args): 21 | if request.extension != 'html': 22 | response.view = 'generic.' + request.extension 23 | else: 24 | response.view = 'generic.json' 25 | return func(*args) 26 | return wrapper 27 | 28 | 29 | @api_requires_extension 30 | @myjwt.allows_jwt() 31 | def api_requires_login(func): 32 | def wrapper(*args): 33 | if not auth.is_logged_in(): 34 | raise HTTP(401) 35 | return func(*args) 36 | return wrapper 37 | 38 | # User API 39 | 40 | 41 | def token(): 42 | return myjwt.jwt_token_manager() 43 | 44 | 45 | @api_requires_extension 46 | def login(): 47 | email = request.vars.email 48 | password = request.vars.password 49 | remember = request.vars.remember 50 | # remember_me = request.vars.remember 51 | authentication = AuthAPI(db).login(email=email, password=password) 52 | if authentication['message'] == 'Logged in': 53 | data = {'username': email, 'password': password, 'remember': remember} 54 | token_url = 'http://{}:{}/{}/api/token'.format( 55 | request.env.remote_addr, request.env.server_port, request.application) 56 | r = requests.post(token_url, data=data) 57 | if r.status_code == 200: 58 | # Get Token and contruct the header 59 | token = r.json()['token'] 60 | authentication['token'] = token 61 | return authentication 62 | else: 63 | raise HTTP(400, 'Cannot get token') 64 | else: 65 | error = ['{}'.format(v) for k, v in authentication['errors'].iteritems()][0] 66 | raise HTTP(400, error.replace('_', ' ').lower().capitalize()) 67 | 68 | 69 | @api_requires_login 70 | def logout(): 71 | authentication = AuthAPI(db).logout(next=None) 72 | if authentication['message'] == 'Logged out': 73 | return authentication 74 | else: 75 | error = ['{}'.format(k, v) for k, v in authentication['errors'].iteritems()][0] 76 | raise HTTP(400, error.replace('_', ' ').lower().capitalize()) 77 | 78 | 79 | @api_requires_login 80 | def user(): 81 | avatar = 'https://www.gravatar.com/avatar/{}.jpg?s=200&d=mm'.format( 82 | hashlib.md5(auth.user.email.lower()).hexdigest()) 83 | user_data = {'first_name': auth.user.first_name, 84 | 'last_name': auth.user.last_name, 'email': auth.user.email, 'avatar': avatar} 85 | return user_data 86 | 87 | 88 | @api_requires_extension 89 | def register(): 90 | first_name = request.vars.first_name 91 | last_name = request.vars.last_name 92 | email = request.vars.email 93 | password = request.vars.password 94 | authentication = AuthAPI(db).register(first_name=first_name, 95 | last_name=last_name, 96 | email=email, 97 | password=password, 98 | registration_key=None) 99 | if authentication['message'] == 'Registration successful': 100 | return authentication 101 | else: 102 | error = ['{}'.format(k, v) for k, v in authentication['errors'].iteritems()][0] 103 | raise HTTP(400, error.replace('_', ' ').lower().capitalize()) 104 | 105 | 106 | @api_requires_login 107 | def profile(): 108 | first_name = request.vars.first_name 109 | last_name = request.vars.last_name 110 | authentication = AuthAPI(db).profile(first_name=first_name, last_name=last_name) 111 | if authentication['message'] == 'Profile updated': 112 | avatar = 'https://www.gravatar.com/avatar/{}.jpg?s=200&d=mm'.format( 113 | hashlib.md5(auth.user.email).hexdigest()) 114 | authentication['user']['avatar'] = avatar 115 | return authentication 116 | else: 117 | error = ['{}'.format(v) for k, v in authentication['errors'].iteritems()][0] 118 | raise HTTP(400, error.replace('_', ' ').lower().capitalize()) 119 | 120 | 121 | @api_requires_login 122 | def change_password(): 123 | old_password = request.vars.old_password 124 | new_password = request.vars.new_password 125 | new_password2 = request.vars.new_password2 126 | authentication = AuthAPI(db).change_password(old_password=old_password, 127 | new_password=new_password, 128 | new_password2=new_password) 129 | if authentication['message'] == 'Password changed': 130 | return authentication 131 | else: 132 | error = ['{}'.format(v) for k, v in authentication['errors'].iteritems()][0] 133 | raise HTTP(400, error.replace('_', ' ').lower().capitalize()) 134 | 135 | 136 | def request_reset_password(): 137 | email = request.vars.email 138 | user = db(db.auth_user.email == email).select().first() 139 | if user: 140 | key = uuid.uuid4() 141 | result = user.update_record(reset_password_key=key) 142 | db.commit() 143 | if result: 144 | site_url = '{}:{}/{}'.format(request.env.remote_addr, 145 | request.env.server_port, request.application) 146 | message = 'To reset your password please click this link http://{}/?token={}'.format( 147 | site_url, key) 148 | if mail.send(to=email, 149 | subject='password reset', 150 | message=message): 151 | return {'status': 'reset password code sended'} 152 | else: 153 | raise HTTP(400, 'error sending email') 154 | else: 155 | raise HTTP(400, 'error requesting reset password code') 156 | else: 157 | raise HTTP(400, 'invalid email') 158 | 159 | return dict() 160 | 161 | 162 | @api_requires_extension 163 | def reset(): 164 | token = request.vars.token 165 | password = request.vars.password 166 | password_confirmation = request.vars.password_confirmation 167 | user = db(db.auth_user.reset_password_key == token).select().first() 168 | if user: 169 | if password == password_confirmation: 170 | result = user.update_record(password=CRYPT( 171 | key=auth.settings.hmac_key)(password)[0], reset_password_key='') 172 | db.commit() 173 | if result: 174 | return {'status': 'password updated', 'user': {'email': user.email}} 175 | else: 176 | raise HTTP(400, 'error while update password') 177 | else: 178 | raise HTTP(400, 'password and password confirmation mismatch') 179 | else: 180 | raise HTTP(400, 'invalid/expired reset token') 181 | 182 | 183 | # Test jwt 184 | 185 | 186 | @myjwt.allows_jwt(required=True, verify_expiration=True) 187 | def unprotected(): 188 | if auth.user: 189 | return '%s$%s' % (request.now, auth.user_id) 190 | 191 | return "No auth info!" 192 | 193 | 194 | @api_requires_login 195 | def myapi(): 196 | return 'hello %s' % auth.user.email 197 | -------------------------------------------------------------------------------- /controllers/default.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # ------------------------------------------------------------------------- 3 | # This is a sample controller 4 | # this file is released under public domain and you can use without limitations 5 | # ------------------------------------------------------------------------- 6 | auth.settings.allow_basic_login = True 7 | # ---- example index page ---- 8 | 9 | 10 | def index(): 11 | response.flash = T("Hello World") 12 | return dict(message=T('Welcome to web2py!')) 13 | 14 | # ---- API (example) ----- 15 | 16 | 17 | @auth.allows_jwt() 18 | @auth.requires_login() 19 | def api_get_user_email(): 20 | if not request.env.request_method == 'GET': 21 | raise HTTP(403) 22 | return response.json({'status': 'success', 'email': 'roberto'}) 23 | 24 | # ---- Smart Grid (example) ----- 25 | 26 | 27 | @auth.requires_membership('admin') # can only be accessed by members of admin groupd 28 | def grid(): 29 | response.view = 'generic.html' # use a generic view 30 | tablename = request.args(0) 31 | if not tablename in db.tables: 32 | raise HTTP(403) 33 | grid = SQLFORM.smartgrid(db[tablename], args=[tablename], deletable=False, editable=False) 34 | return dict(grid=grid) 35 | 36 | # ---- Embedded wiki (example) ---- 37 | 38 | 39 | def wiki(): 40 | auth.wikimenu() # add the wiki to the menu 41 | return auth.wiki() 42 | 43 | # ---- Action for login/register/etc (required for auth) ----- 44 | 45 | 46 | def user(): 47 | """ 48 | exposes: 49 | http://..../[app]/default/user/login 50 | http://..../[app]/default/user/logout 51 | http://..../[app]/default/user/register 52 | http://..../[app]/default/user/profile 53 | http://..../[app]/default/user/retrieve_password 54 | http://..../[app]/default/user/change_password 55 | http://..../[app]/default/user/bulk_register 56 | use @auth.requires_login() 57 | @auth.requires_membership('group name') 58 | @auth.requires_permission('read','table name',record_id) 59 | to decorate functions that need access control 60 | also notice there is http://..../[app]/appadmin/manage/auth to allow administrator to manage users 61 | """ 62 | return dict(form=auth()) 63 | 64 | # ---- action to server uploaded static content (required) --- 65 | 66 | 67 | @cache.action() 68 | def download(): 69 | """ 70 | allows downloading of uploaded files 71 | http://..../[app]/default/download/[filename] 72 | """ 73 | return response.download(request, db) 74 | -------------------------------------------------------------------------------- /cron/crontab: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /cron/crontab.example: -------------------------------------------------------------------------------- 1 | #crontab -------------------------------------------------------------------------------- /databases/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/databases/.gitkeep -------------------------------------------------------------------------------- /errors/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/errors/.gitkeep -------------------------------------------------------------------------------- /languages/ar.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'ar', 4 | '!langname!': 'Arabic', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN', 6 | '%s %%(shop)': '%s %%(shop)', 7 | '%s %%(shop[0])': '%s %%(shop[0])', 8 | '%s %%{quark[0]}': '%s %%{quark[0]}', 9 | '%s %%{row} deleted': '%s %%{row} deleted', 10 | '%s %%{row} updated': '%s %%{row} updated', 11 | '%s %%{shop[0]}': '%s %%{shop[0]}', 12 | '%s %%{shop}': '%s %%{shop}', 13 | '%s selected': '%s selected', 14 | '%Y-%m-%d': '%Y-%m-%d', 15 | '%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', 16 | '(**%.0d MB**)': '(**%.0d MB**)', 17 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 18 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 19 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 20 | '?': '?', 21 | '@markmin\x01**Hello World**': '**مرحباً بالعالم**', 22 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 23 | 'About': 'نبذة', 24 | 'Access Control': 'متحكمات الوصول', 25 | 'admin': 'admin', 26 | 'Administrative Interface': 'واجهة التحكم', 27 | 'Ajax Recipes': 'وصفات أجاكس', 28 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 29 | 'appadmin is disabled because insecure channel': 'appadmin is disabled because insecure channel', 30 | 'Are you sure you want to delete this object?': 'هل أنت متأكد بحذف هذا الكائن ؟', 31 | 'Available Databases and Tables': 'Available Databases and Tables', 32 | 'Buy this book': 'أشتري هذا الكتاب', 33 | "Buy web2py's book": "Buy web2py's book", 34 | 'cache': 'cache', 35 | 'Cache': 'Cache', 36 | 'Cache Cleared': 'Cache Cleared', 37 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 38 | 'Cache Keys': 'Cache Keys', 39 | 'Cannot be empty': 'لا يمكن بأن يكون خالي', 40 | 'Check to delete': 'أختر للحذف', 41 | 'Clear CACHE?': 'Clear CACHE?', 42 | 'Clear DISK': 'Clear DISK', 43 | 'Clear RAM': 'Clear RAM', 44 | 'Client IP': 'IP المستخدم', 45 | 'Community': 'المجتمع', 46 | 'Components and Plugins': 'العناصر والإضافات', 47 | 'Config.ini': 'Config.ini', 48 | 'Controller': 'متحكم', 49 | 'Copyright': 'الحقوق', 50 | 'Created By': 'أنشئ بواسطة', 51 | 'Created On': 'أنشئ في', 52 | 'Current request': 'Current request', 53 | 'Current response': 'Current response', 54 | 'Current session': 'Current session', 55 | 'customize me!': 'التخصيص', 56 | 'data uploaded': 'data uploaded', 57 | 'Database': 'قاعدة البيانات', 58 | 'Database %s select': 'Database %s select', 59 | 'Database Administration (appadmin)': 'Database Administration (appadmin)', 60 | 'db': 'db', 61 | 'DB Model': 'نموذج قاعدة البيانات', 62 | 'Delete:': 'Delete:', 63 | 'Demo': 'تجربة', 64 | 'Deployment Recipes': 'الوصفات المنشورة', 65 | 'Description': 'الوصف', 66 | 'design': 'design', 67 | 'Design': 'Design', 68 | 'DISK': 'DISK', 69 | 'Disk Cache Keys': 'Disk Cache Keys', 70 | 'Disk Cleared': 'Disk Cleared', 71 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 72 | 'Documentation': 'المستندات', 73 | "Don't know what to do?": 'لا تعلم ماذا ستفعل ؟', 74 | 'done!': 'done!', 75 | 'Download': 'تحميل', 76 | 'E-mail': 'البريد الإلكتروني', 77 | 'Edit current record': 'Edit current record', 78 | 'Email and SMS': 'البريد الإلكتروني والرسالة النصية', 79 | 'enter an integer between %(min)g and %(max)g': 'أدخل عدد صحيح بين %(min)g و %(man)g', 80 | 'enter date and time as %(format)s': 'أدخل التاريخ والوقت كالنمط %(format)', 81 | 'Errors': 'الأخطاء', 82 | 'export as csv file': 'export as csv file', 83 | 'FAQ': 'الأسئلة الشائعة', 84 | 'First name': 'الأسم الأول', 85 | 'Forms and Validators': 'الإستمارات والمدققات', 86 | 'Free Applications': 'تطبيقات مجانية', 87 | 'Graph Model': 'Graph Model', 88 | 'Group %(group_id)s created': 'المجموعة %(group_id)s قد أنشئت', 89 | 'Group ID': 'هوية المجموعة', 90 | 'Group uniquely assigned to user %(id)s': 'المجموعة مخصصة للمستخدم %(id)s', 91 | 'Groups': 'مجموعات', 92 | 'Hello World': 'مرحباً بالعالم', 93 | 'Hello World ## comment': ' مرحباً بالعالم', 94 | 'Hello World## comment': 'مرحباً بالعالم', 95 | 'Helping web2py': 'Helping web2py', 96 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 97 | 'Home': 'الرئيسية', 98 | 'How did you get here?': 'كيف أستطعت الوصول إلى هنا ؟', 99 | 'import': 'import', 100 | 'Import/Export': 'Import/Export', 101 | 'Internal State': 'Internal State', 102 | 'Introduction': 'مقدمة', 103 | 'Invalid email': 'بريد إلكتروني غير صالح', 104 | 'Invalid Query': 'Invalid Query', 105 | 'invalid request': 'invalid request', 106 | 'Is Active': 'نشط', 107 | 'Key': 'Key', 108 | 'Last name': 'أسم العائلة', 109 | 'Layout': 'النسق', 110 | 'Layout Plugins': 'نسّق الإضافات', 111 | 'Layouts': 'لأنساق', 112 | 'Live Chat': 'المحادثة الحيّة', 113 | 'Log In': 'Log In', 114 | 'Logged in': 'تم تسجيل الدخول', 115 | 'Logged out': 'تم تسجيل الخروج', 116 | 'Login': 'تسجيل الدخول', 117 | 'Logout': 'تسجيل الخروج', 118 | 'Lost Password': 'فقدت كلمة المرور', 119 | 'Lost password?': 'هل فقدت كلمة المرور ؟', 120 | 'Manage %(action)s': 'Manage %(action)s', 121 | 'Manage Access Control': 'Manage Access Control', 122 | 'Manage Cache': 'Manage Cache', 123 | 'Memberships': 'Memberships', 124 | 'Menu Model': 'قالب القوائم', 125 | 'Modified By': 'عًدلت بواسطة', 126 | 'Modified On': 'عُدلت في', 127 | 'My Sites': 'موقعي', 128 | 'Name': 'الأسم', 129 | 'New Record': 'New Record', 130 | 'new record inserted': 'new record inserted', 131 | 'next %s rows': 'next %s rows', 132 | 'No databases in this application': 'No databases in this application', 133 | 'Number of entries: **%s**': 'Number of entries: **%s**', 134 | 'Object or table name': 'أسم الكائن أو الجدول', 135 | 'Online book': 'Online book', 136 | 'Online examples': 'أمثلة على الأنترنت', 137 | 'or import from csv file': 'or import from csv file', 138 | 'Origin': 'أصل', 139 | 'Other Plugins': 'إضافات أخرى', 140 | 'Other Recipes': 'وصفات أخرى', 141 | 'Overview': 'نظرة عامة', 142 | 'Password': 'كلمة المرور', 143 | "Password fields don't match": 'حقول كلمة المرور لا تتطابق', 144 | 'Permission': 'Permission', 145 | 'Permissions': 'Permissions', 146 | 'please input your password again': 'الرجاء إعادة إدخال كلمة المرور', 147 | 'Plugins': 'الإضافات', 148 | 'Powered by': 'مدعوم بواسطة', 149 | 'Preface': 'المدخل', 150 | 'previous %s rows': 'previous %s rows', 151 | 'Profile': 'الملف الشخصي', 152 | 'pygraphviz library not found': 'pygraphviz library not found', 153 | 'Python': 'بايثون', 154 | 'Query:': 'Query:', 155 | 'Quick Examples': 'أمثلة سريعة', 156 | 'RAM': 'RAM', 157 | 'RAM Cache Keys': 'RAM Cache Keys', 158 | 'Ram Cleared': 'Ram Cleared', 159 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 160 | 'Recipes': 'وصفات', 161 | 'Record': 'Record', 162 | 'record does not exist': 'record does not exist', 163 | 'Record ID': 'هوية السجل ', 164 | 'Record id': 'Record id', 165 | 'Register': 'التسجيل', 166 | 'Registration identifier': 'مُعرف التسجيل', 167 | 'Registration key': 'رمز التسجيل', 168 | 'Registration successful': 'تم التسجيل بنجاح', 169 | 'Remember me (for 30 days)': 'تذكرني ( إلى 30 يوم)', 170 | 'Reset Password key': 'إعادة ظبط مفتاح كلمة المرور', 171 | 'Role': 'دور', 172 | 'Roles': 'Roles', 173 | 'Rows in Table': 'Rows in Table', 174 | 'Rows selected': 'Rows selected', 175 | 'Save model as...': 'Save model as...', 176 | 'Semantic': 'دليل لفظي', 177 | 'Services': 'خدمات', 178 | 'Sign Up': 'Sign Up', 179 | 'Size of cache:': 'Size of cache:', 180 | 'state': 'state', 181 | 'Statistics': 'Statistics', 182 | 'Stylesheet': 'أسلوب النمط', 183 | 'submit': 'submit', 184 | 'Support': 'الدعم', 185 | 'Table': 'Table', 186 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.', 187 | 'The Core': 'النواة', 188 | 'The output of the file is a dictionary that was rendered by the view %s': 'نتاج هذا الملف هو قاموس قًدم بواسطة العارض %s', 189 | 'The Views': 'المشاهدات', 190 | 'This App': 'هذا التطبيق', 191 | 'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)', 192 | 'Timestamp': 'البصمة الزمنية', 193 | 'Traceback': 'Traceback', 194 | 'Twitter': 'تويتر', 195 | 'unable to parse csv file': 'unable to parse csv file', 196 | 'Update:': 'Update:', 197 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.', 198 | 'User': 'User', 199 | 'User %(id)s Logged-in': 'المستخدم %(id)s قد سجل دخوله', 200 | 'User %(id)s Logged-out': 'المستخدم %(id)s قد سجل خروجه', 201 | 'User %(id)s Registered': 'المستخدم %(id)s مسجل', 202 | 'User ID': 'هوية المستخدم', 203 | 'Users': 'Users', 204 | 'value already in database or empty': 'القيمة موجودة مسبقاً أو فارغة', 205 | 'Verify Password': 'تأكيد كلمة المرور', 206 | 'Videos': 'الفيديوهات', 207 | 'View': 'العرض', 208 | 'Welcome': 'مرحباً', 209 | 'Welcome to web2py!': 'مرحباً بكم في ويب2 باي !', 210 | 'Which called the function %s located in the file %s': 'الدالة المسماة %s موجودة في ملف %s', 211 | 'Working...': 'Working...', 212 | 'You are successfully running web2py': 'أستطعت تثبيت web2py بنجاح !', 213 | 'You can modify this application and adapt it to your needs': 'تستطيع تعديل هذا التطبيق لما يناسب إحتياجك', 214 | 'You visited the url %s': ' ملقد زرت الرابط %s', 215 | } 216 | -------------------------------------------------------------------------------- /languages/default.py: -------------------------------------------------------------------------------- 1 | # coding: utf8 2 | { 3 | '!langcode!': 'en-us', 4 | '!langname!': 'English (US)', 5 | '%s %%(shop)': '%s %%(shop)', 6 | '%s %%(shop[0])': '%s %%(shop[0])', 7 | '%s %%{quark[0]}': '%s %%{quark[0]}', 8 | '%s %%{shop[0]}': '%s %%{shop[0]}', 9 | '%s %%{shop}': '%s %%{shop}', 10 | '%Y-%m-%d': '%Y-%m-%d', 11 | '%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', 12 | '@markmin\x01**Hello World**': '**Hello World**', 13 | 'About': 'About', 14 | 'Access Control': 'Access Control', 15 | 'Administrative Interface': 'Administrative Interface', 16 | 'Ajax Recipes': 'Ajax Recipes', 17 | 'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?', 18 | 'Buy this book': 'Buy this book', 19 | 'Cannot be empty': 'Cannot be empty', 20 | 'Check to delete': 'Check to delete', 21 | 'Client IP': 'Client IP', 22 | 'Community': 'Community', 23 | 'Components and Plugins': 'Components and Plugins', 24 | 'Controller': 'Controller', 25 | 'Copyright': 'Copyright', 26 | 'Created By': 'Created By', 27 | 'Created On': 'Created On', 28 | 'customize me!': 'customize me!', 29 | 'Database': 'Database', 30 | 'DB Model': 'DB Model', 31 | 'Demo': 'Demo', 32 | 'Deployment Recipes': 'Deployment Recipes', 33 | 'Description': 'Description', 34 | 'Documentation': 'Documentation', 35 | "Don't know what to do?": "Don't know what to do?", 36 | 'Download': 'Download', 37 | 'E-mail': 'E-mail', 38 | 'Email and SMS': 'Email and SMS', 39 | 'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g', 40 | 'enter date and time as %(format)s': 'enter date and time as %(format)s', 41 | 'Errors': 'Errors', 42 | 'FAQ': 'FAQ', 43 | 'First name': 'First name', 44 | 'Forms and Validators': 'Forms and Validators', 45 | 'Free Applications': 'Free Applications', 46 | 'Group %(group_id)s created': 'Group %(group_id)s created', 47 | 'Group ID': 'Group ID', 48 | 'Group uniquely assigned to user %(id)s': 'Group uniquely assigned to user %(id)s', 49 | 'Groups': 'Groups', 50 | 'Hello World': 'Hello World', 51 | 'Hello World ## comment': 'Hello World ', 52 | 'Hello World## comment': 'Hello World', 53 | 'Home': 'Home', 54 | 'How did you get here?': 'How did you get here?', 55 | 'Introduction': 'Introduction', 56 | 'Invalid email': 'Invalid email', 57 | 'Is Active': 'Is Active', 58 | 'Last name': 'Last name', 59 | 'Layout': 'Layout', 60 | 'Layout Plugins': 'Layout Plugins', 61 | 'Layouts': 'Layouts', 62 | 'Live Chat': 'Live Chat', 63 | 'Logged in': 'Logged in', 64 | 'Logged out': 'Logged out', 65 | 'Login': 'Login', 66 | 'Logout': 'Logout', 67 | 'Lost Password': 'Lost Password', 68 | 'Lost password?': 'Lost password?', 69 | 'Menu Model': 'Menu Model', 70 | 'Modified By': 'Modified By', 71 | 'Modified On': 'Modified On', 72 | 'My Sites': 'My Sites', 73 | 'Name': 'Name', 74 | 'Object or table name': 'Object or table name', 75 | 'Online examples': 'Online examples', 76 | 'Origin': 'Origin', 77 | 'Other Plugins': 'Other Plugins', 78 | 'Other Recipes': 'Other Recipes', 79 | 'Overview': 'Overview', 80 | 'Password': 'Password', 81 | "Password fields don't match": "Password fields don't match", 82 | 'please input your password again': 'please input your password again', 83 | 'Plugins': 'Plugins', 84 | 'Powered by': 'Powered by', 85 | 'Preface': 'Preface', 86 | 'Profile': 'Profile', 87 | 'Python': 'Python', 88 | 'Quick Examples': 'Quick Examples', 89 | 'Recipes': 'Recipes', 90 | 'Record ID': 'Record ID', 91 | 'Register': 'Register', 92 | 'Registration identifier': 'Registration identifier', 93 | 'Registration key': 'Registration key', 94 | 'Registration successful': 'Registration successful', 95 | 'Remember me (for 30 days)': 'Remember me (for 30 days)', 96 | 'Reset Password key': 'Reset Password key', 97 | 'Role': 'Role', 98 | 'Semantic': 'Semantic', 99 | 'Services': 'Services', 100 | 'Stylesheet': 'Stylesheet', 101 | 'Support': 'Support', 102 | 'The Core': 'The Core', 103 | 'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s', 104 | 'The Views': 'The Views', 105 | 'This App': 'This App', 106 | 'Timestamp': 'Timestamp', 107 | 'Twitter': 'Twitter', 108 | 'User %(id)s Logged-in': 'User %(id)s Logged-in', 109 | 'User %(id)s Logged-out': 'User %(id)s Logged-out', 110 | 'User %(id)s Registered': 'User %(id)s Registered', 111 | 'User ID': 'User ID', 112 | 'value already in database or empty': 'value already in database or empty', 113 | 'Verify Password': 'Verify Password', 114 | 'Videos': 'Videos', 115 | 'View': 'View', 116 | 'Welcome': 'Welcome', 117 | 'Welcome to web2py!': 'Welcome to web2py!', 118 | 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 119 | 'You are successfully running web2py': 'You are successfully running web2py', 120 | 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 121 | 'You visited the url %s': 'You visited the url %s', 122 | } 123 | -------------------------------------------------------------------------------- /languages/en.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'en-us', 4 | '!langname!': 'English (US)', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN', 6 | '%s %%{row} deleted': '%s %%{row} deleted', 7 | '%s %%{row} updated': '%s %%{row} updated', 8 | '%s selected': '%s selected', 9 | '%Y-%m-%d': '%Y-%m-%d', 10 | '%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', 11 | '(**%.0d MB**)': '(**%.0d MB**)', 12 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 13 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 14 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 15 | '?': '?', 16 | '@markmin\x01An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 17 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 18 | 'About': 'About', 19 | 'Access Control': 'Access Control', 20 | 'admin': 'admin', 21 | 'Ajax Recipes': 'Ajax Recipes', 22 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 23 | 'appadmin is disabled because insecure channel': 'appadmin is disabled because insecure channel', 24 | 'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?', 25 | 'Available Databases and Tables': 'Available Databases and Tables', 26 | "Buy web2py's book": "Buy web2py's book", 27 | 'cache': 'cache', 28 | 'Cache': 'Cache', 29 | 'Cache Cleared': 'Cache Cleared', 30 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 31 | 'Cache Keys': 'Cache Keys', 32 | 'Cannot be empty': 'Cannot be empty', 33 | 'Change Password': 'Change Password', 34 | 'Check to delete': 'Check to delete', 35 | 'Clear CACHE?': 'Clear CACHE?', 36 | 'Clear DISK': 'Clear DISK', 37 | 'Clear RAM': 'Clear RAM', 38 | 'Community': 'Community', 39 | 'Components and Plugins': 'Components and Plugins', 40 | 'Config.ini': 'Config.ini', 41 | 'Controller': 'Controller', 42 | 'Copyright': 'Copyright', 43 | 'Current request': 'Current request', 44 | 'Current response': 'Current response', 45 | 'Current session': 'Current session', 46 | 'data uploaded': 'data uploaded', 47 | 'Database': 'Database', 48 | 'Database %s select': 'Database %s select', 49 | 'Database Administration (appadmin)': 'Database Administration (appadmin)', 50 | 'db': 'db', 51 | 'DB Model': 'DB Model', 52 | 'Delete:': 'Delete:', 53 | 'Demo': 'Demo', 54 | 'Deployment Recipes': 'Deployment Recipes', 55 | 'design': 'design', 56 | 'Design': 'Design', 57 | 'DISK': 'DISK', 58 | 'Disk Cache Keys': 'Disk Cache Keys', 59 | 'Disk Cleared': 'Disk Cleared', 60 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 61 | 'Documentation': 'Documentation', 62 | "Don't know what to do?": "Don't know what to do?", 63 | 'done!': 'done!', 64 | 'Download': 'Download', 65 | 'E-mail': 'E-mail', 66 | 'Edit current record': 'Edit current record', 67 | 'Email and SMS': 'Email and SMS', 68 | 'Enter an integer between %(min)g and %(max)g': 'Enter an integer between %(min)g and %(max)g', 69 | 'Errors': 'Errors', 70 | 'export as csv file': 'export as csv file', 71 | 'FAQ': 'FAQ', 72 | 'First name': 'First name', 73 | 'Forms and Validators': 'Forms and Validators', 74 | 'Free Applications': 'Free Applications', 75 | 'Graph Model': 'Graph Model', 76 | 'Groups': 'Groups', 77 | 'Hello World': 'Hello World', 78 | 'Helping web2py': 'Helping web2py', 79 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 80 | 'Home': 'Home', 81 | 'How did you get here?': 'How did you get here?', 82 | 'import': 'import', 83 | 'Import/Export': 'Import/Export', 84 | 'Internal State': 'Internal State', 85 | 'Introduction': 'Introduction', 86 | 'Invalid login': 'Invalid login', 87 | 'Invalid password': 'Invalid password', 88 | 'Invalid Query': 'Invalid Query', 89 | 'invalid request': 'invalid request', 90 | 'Invalid user': 'Invalid user', 91 | 'Key': 'Key', 92 | 'Last name': 'Last name', 93 | 'Layout': 'Layout', 94 | 'Live Chat': 'Live Chat', 95 | 'Log In': 'Log In', 96 | 'Logged in': 'Logged in', 97 | 'Logged out': 'Logged out', 98 | 'Login': 'Login', 99 | 'Logout': 'Logout', 100 | 'Lost Password': 'Lost Password', 101 | 'Manage %(action)s': 'Manage %(action)s', 102 | 'Manage Access Control': 'Manage Access Control', 103 | 'Manage Cache': 'Manage Cache', 104 | 'Memberships': 'Memberships', 105 | 'Menu Model': 'Menu Model', 106 | 'My Sites': 'My Sites', 107 | 'New Record': 'New Record', 108 | 'new record inserted': 'new record inserted', 109 | 'next %s rows': 'next %s rows', 110 | 'No databases in this application': 'No databases in this application', 111 | 'Number of entries: **%s**': 'Number of entries: **%s**', 112 | 'Online book': 'Online book', 113 | 'Online examples': 'Online examples', 114 | 'or import from csv file': 'or import from csv file', 115 | 'Other Recipes': 'Other Recipes', 116 | 'Overview': 'Overview', 117 | 'Password': 'Password', 118 | 'Permission': 'Permission', 119 | 'Permissions': 'Permissions', 120 | 'Plugins': 'Plugins', 121 | 'Powered by': 'Powered by', 122 | 'Preface': 'Preface', 123 | 'previous %s rows': 'previous %s rows', 124 | 'Profile': 'Profile', 125 | 'pygraphviz library not found': 'pygraphviz library not found', 126 | 'Python': 'Python', 127 | 'Query:': 'Query:', 128 | 'Quick Examples': 'Quick Examples', 129 | 'RAM': 'RAM', 130 | 'RAM Cache Keys': 'RAM Cache Keys', 131 | 'Ram Cleared': 'Ram Cleared', 132 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 133 | 'Recipes': 'Recipes', 134 | 'Record': 'Record', 135 | 'record does not exist': 'record does not exist', 136 | 'Record id': 'Record id', 137 | 'Registration identifier': 'Registration identifier', 138 | 'Registration key': 'Registration key', 139 | 'Remember me (for 30 days)': 'Remember me (for 30 days)', 140 | 'Reset Password key': 'Reset Password key', 141 | 'Role': 'Role', 142 | 'Roles': 'Roles', 143 | 'Rows in Table': 'Rows in Table', 144 | 'Rows selected': 'Rows selected', 145 | 'Save model as...': 'Save model as...', 146 | 'Services': 'Services', 147 | 'Sign Up': 'Sign Up', 148 | 'Sign up': 'Sign up', 149 | 'Size of cache:': 'Size of cache:', 150 | 'state': 'state', 151 | 'Statistics': 'Statistics', 152 | 'Stylesheet': 'Stylesheet', 153 | 'submit': 'submit', 154 | 'Submit': 'Submit', 155 | 'Support': 'Support', 156 | 'Table': 'Table', 157 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.', 158 | 'The Core': 'The Core', 159 | 'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s', 160 | 'The Views': 'The Views', 161 | 'This App': 'This App', 162 | 'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)', 163 | 'Traceback': 'Traceback', 164 | 'Twitter': 'Twitter', 165 | 'unable to parse csv file': 'unable to parse csv file', 166 | 'Update:': 'Update:', 167 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.', 168 | 'User': 'User', 169 | 'Users': 'Users', 170 | 'Videos': 'Videos', 171 | 'View': 'View', 172 | 'Welcome to web2py!': 'Welcome to web2py!', 173 | 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 174 | 'Working...': 'Working...', 175 | 'You are successfully running web2py': 'You are successfully running web2py', 176 | 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 177 | 'You visited the url %s': 'You visited the url %s', 178 | } 179 | -------------------------------------------------------------------------------- /languages/hi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'hi-in', 4 | '!langname!': 'हिन्दी', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN', 6 | '%s %%{row} deleted': '%s पंक्तियाँ मिटाएँ', 7 | '%s %%{row} updated': '%s पंक्तियाँ अद्यतन', 8 | '%s selected': '%s चुना हुआ', 9 | '%Y-%m-%d': '%Y-%m-%d', 10 | '%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', 11 | '(**%.0d MB**)': '(**%.0d MB**)', 12 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 13 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 14 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 15 | '?': '?', 16 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 17 | 'About': 'About', 18 | 'Access Control': 'Access Control', 19 | 'admin': 'admin', 20 | 'Administrative Interface': 'Administrative Interface', 21 | 'Administrative interface': 'प्रशासनिक इंटरफेस के लिए यहाँ क्लिक करें', 22 | 'Ajax Recipes': 'Ajax Recipes', 23 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 24 | 'appadmin is disabled because insecure channel': 'अप आडमिन (appadmin) अक्षम है क्योंकि असुरक्षित चैनल', 25 | 'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?', 26 | 'Available Databases and Tables': 'उपलब्ध डेटाबेस और तालिका', 27 | 'Buy this book': 'Buy this book', 28 | "Buy web2py's book": "Buy web2py's book", 29 | 'cache': 'cache', 30 | 'Cache': 'Cache', 31 | 'Cache Cleared': 'Cache Cleared', 32 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 33 | 'Cache Keys': 'Cache Keys', 34 | 'Cannot be empty': 'खाली नहीं हो सकता', 35 | 'Change Password': 'पासवर्ड बदलें', 36 | 'change password': 'change password', 37 | 'Check to delete': 'हटाने के लिए चुनें', 38 | 'Clear CACHE?': 'Clear CACHE?', 39 | 'Clear DISK': 'Clear DISK', 40 | 'Clear RAM': 'Clear RAM', 41 | 'Community': 'Community', 42 | 'Components and Plugins': 'Components and Plugins', 43 | 'Config.ini': 'Config.ini', 44 | 'Controller': 'Controller', 45 | 'Copyright': 'Copyright', 46 | 'Current request': 'वर्तमान अनुरोध', 47 | 'Current response': 'वर्तमान प्रतिक्रिया', 48 | 'Current session': 'वर्तमान सेशन', 49 | 'customize me!': 'मुझे अनुकूलित (कस्टमाइज़) करें!', 50 | 'data uploaded': 'डाटा अपलोड सम्पन्न ', 51 | 'Database': 'डेटाबेस', 52 | 'Database %s select': 'डेटाबेस %s चुनी हुई', 53 | 'Database Administration (appadmin)': 'Database Administration (appadmin)', 54 | 'db': 'db', 55 | 'DB Model': 'DB Model', 56 | 'Delete:': 'मिटाना:', 57 | 'Demo': 'Demo', 58 | 'Deployment Recipes': 'Deployment Recipes', 59 | 'design': 'रचना करें', 60 | 'Design': 'Design', 61 | 'DISK': 'DISK', 62 | 'Disk Cache Keys': 'Disk Cache Keys', 63 | 'Disk Cleared': 'Disk Cleared', 64 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 65 | 'Documentation': 'Documentation', 66 | "Don't know what to do?": "Don't know what to do?", 67 | 'done!': 'हो गया!', 68 | 'Download': 'Download', 69 | 'Edit': 'Edit', 70 | 'Edit current record': 'वर्तमान रेकॉर्ड संपादित करें ', 71 | 'edit profile': 'edit profile', 72 | 'Edit Profile': 'प्रोफ़ाइल संपादित करें', 73 | 'Edit This App': 'Edit This App', 74 | 'Email and SMS': 'Email and SMS', 75 | 'Errors': 'Errors', 76 | 'export as csv file': 'csv फ़ाइल के रूप में निर्यात', 77 | 'FAQ': 'FAQ', 78 | 'Forms and Validators': 'Forms and Validators', 79 | 'Free Applications': 'Free Applications', 80 | 'Graph Model': 'Graph Model', 81 | 'Groups': 'Groups', 82 | 'Hello from MyApp': 'Hello from MyApp', 83 | 'Hello World': 'Hello World', 84 | 'Helping web2py': 'Helping web2py', 85 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 86 | 'Home': 'Home', 87 | 'How did you get here?': 'How did you get here?', 88 | 'import': 'import', 89 | 'Import/Export': 'आयात / निर्यात', 90 | 'Index': 'Index', 91 | 'insert new': 'नया डालें', 92 | 'insert new %s': 'नया %s डालें', 93 | 'Internal State': 'आंतरिक स्थिति', 94 | 'Introduction': 'Introduction', 95 | 'Invalid Query': 'अमान्य प्रश्न', 96 | 'invalid request': 'अवैध अनुरोध', 97 | 'Key': 'Key', 98 | 'Layout': 'Layout', 99 | 'Layout Plugins': 'Layout Plugins', 100 | 'Layouts': 'Layouts', 101 | 'Live Chat': 'Live Chat', 102 | 'Log In': 'Log In', 103 | 'login': 'login', 104 | 'Login': 'लॉग इन', 105 | 'logout': 'logout', 106 | 'Logout': 'लॉग आउट', 107 | 'Lost Password': 'पासवर्ड खो गया', 108 | 'Main Menu': 'Main Menu', 109 | 'Manage %(action)s': 'Manage %(action)s', 110 | 'Manage Access Control': 'Manage Access Control', 111 | 'Manage Cache': 'Manage Cache', 112 | 'Memberships': 'Memberships', 113 | 'Menu Model': 'Menu Model', 114 | 'My Sites': 'My Sites', 115 | 'New Record': 'नया रेकॉर्ड', 116 | 'new record inserted': 'नया रेकॉर्ड डाला', 117 | 'next %s rows': 'next %s rows', 118 | 'next 100 rows': 'अगले 100 पंक्तियाँ', 119 | 'No databases in this application': 'इस अनुप्रयोग में कोई डेटाबेस नहीं हैं', 120 | 'Number of entries: **%s**': 'Number of entries: **%s**', 121 | 'Online book': 'Online book', 122 | 'Online examples': 'ऑनलाइन उदाहरण के लिए यहाँ क्लिक करें', 123 | 'or import from csv file': 'या csv फ़ाइल से आयात', 124 | 'Other Plugins': 'Other Plugins', 125 | 'Other Recipes': 'Other Recipes', 126 | 'Overview': 'Overview', 127 | 'Permission': 'Permission', 128 | 'Permissions': 'Permissions', 129 | 'Plugins': 'Plugins', 130 | 'Powered by': 'Powered by', 131 | 'Preface': 'Preface', 132 | 'previous %s rows': 'previous %s rows', 133 | 'previous 100 rows': 'पिछले 100 पंक्तियाँ', 134 | 'pygraphviz library not found': 'pygraphviz library not found', 135 | 'Python': 'Python', 136 | 'Query:': 'प्रश्न:', 137 | 'Quick Examples': 'Quick Examples', 138 | 'RAM': 'RAM', 139 | 'RAM Cache Keys': 'RAM Cache Keys', 140 | 'Ram Cleared': 'Ram Cleared', 141 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 142 | 'Recipes': 'Recipes', 143 | 'Record': 'Record', 144 | 'record does not exist': 'रिकॉर्ड मौजूद नहीं है', 145 | 'Record id': 'रिकॉर्ड पहचानकर्ता (आईडी)', 146 | 'Register': 'पंजीकृत (रजिस्टर) करना ', 147 | 'register': 'register', 148 | 'Role': 'Role', 149 | 'Roles': 'Roles', 150 | 'Rows in Table': 'तालिका में पंक्तियाँ ', 151 | 'Rows selected': 'चयनित (चुने गये) पंक्तियाँ ', 152 | 'Save model as...': 'Save model as...', 153 | 'Semantic': 'Semantic', 154 | 'Services': 'Services', 155 | 'Sign Up': 'Sign Up', 156 | 'Size of cache:': 'Size of cache:', 157 | 'state': 'स्थिति', 158 | 'Statistics': 'Statistics', 159 | 'Stylesheet': 'Stylesheet', 160 | 'submit': 'submit', 161 | 'Support': 'Support', 162 | 'Sure you want to delete this object?': 'सुनिश्चित हैं कि आप इस वस्तु को हटाना चाहते हैं?', 163 | 'Table': 'तालिका', 164 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.', 165 | 'The Core': 'The Core', 166 | 'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s', 167 | 'The Views': 'The Views', 168 | 'This App': 'This App', 169 | 'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)', 170 | 'Traceback': 'Traceback', 171 | 'Twitter': 'Twitter', 172 | 'unable to parse csv file': 'csv फ़ाइल पार्स करने में असमर्थ', 173 | 'Update:': 'अद्यतन करना:', 174 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.', 175 | 'User': 'User', 176 | 'Users': 'Users', 177 | 'Videos': 'Videos', 178 | 'View': 'View', 179 | 'Welcome %s': 'Welcome %s', 180 | 'Welcome to web2py': 'वेब२पाइ (web2py) में आपका स्वागत है', 181 | 'Welcome to web2py!': 'Welcome to web2py!', 182 | 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 183 | 'Working...': 'Working...', 184 | 'You are successfully running web2py': 'You are successfully running web2py', 185 | 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 186 | 'You visited the url %s': 'You visited the url %s', 187 | } 188 | -------------------------------------------------------------------------------- /languages/hu.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'hu', 4 | '!langname!': 'Magyar', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN', 6 | '%s %%{row} deleted': '%s sorok törlődtek', 7 | '%s %%{row} updated': '%s sorok frissítődtek', 8 | '%s selected': '%s kiválasztott', 9 | '%Y-%m-%d': '%Y.%m.%d.', 10 | '%Y-%m-%d %H:%M:%S': '%Y.%m.%d. %H:%M:%S', 11 | '(**%.0d MB**)': '(**%.0d MB**)', 12 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 13 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 14 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 15 | '?': '?', 16 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 17 | 'About': 'About', 18 | 'Access Control': 'Access Control', 19 | 'admin': 'admin', 20 | 'Administrative Interface': 'Administrative Interface', 21 | 'Administrative interface': 'az adminisztrációs felületért kattints ide', 22 | 'Ajax Recipes': 'Ajax Recipes', 23 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 24 | 'appadmin is disabled because insecure channel': 'az appadmin a biztonságtalan csatorna miatt letiltva', 25 | 'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?', 26 | 'Available Databases and Tables': 'Elérhető adatbázisok és táblák', 27 | 'Buy this book': 'Buy this book', 28 | "Buy web2py's book": "Buy web2py's book", 29 | 'cache': 'gyorsítótár', 30 | 'Cache': 'Cache', 31 | 'Cache Cleared': 'Cache Cleared', 32 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 33 | 'Cache Keys': 'Cache Keys', 34 | 'Cannot be empty': 'Nem lehet üres', 35 | 'change password': 'jelszó megváltoztatása', 36 | 'Check to delete': 'Törléshez válaszd ki', 37 | 'Clear CACHE?': 'Clear CACHE?', 38 | 'Clear DISK': 'Clear DISK', 39 | 'Clear RAM': 'Clear RAM', 40 | 'Client IP': 'Client IP', 41 | 'Community': 'Community', 42 | 'Components and Plugins': 'Components and Plugins', 43 | 'Config.ini': 'Config.ini', 44 | 'Controller': 'Controller', 45 | 'Copyright': 'Copyright', 46 | 'Current request': 'Jelenlegi lekérdezés', 47 | 'Current response': 'Jelenlegi válasz', 48 | 'Current session': 'Jelenlegi folyamat', 49 | 'customize me!': 'változtass meg!', 50 | 'data uploaded': 'adat feltöltve', 51 | 'Database': 'adatbázis', 52 | 'Database %s select': 'adatbázis %s kiválasztás', 53 | 'Database Administration (appadmin)': 'Database Administration (appadmin)', 54 | 'db': 'db', 55 | 'DB Model': 'DB Model', 56 | 'Delete:': 'Töröl:', 57 | 'Demo': 'Demo', 58 | 'Deployment Recipes': 'Deployment Recipes', 59 | 'Description': 'Description', 60 | 'design': 'design', 61 | 'Design': 'Design', 62 | 'DISK': 'DISK', 63 | 'Disk Cache Keys': 'Disk Cache Keys', 64 | 'Disk Cleared': 'Disk Cleared', 65 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 66 | 'Documentation': 'Documentation', 67 | "Don't know what to do?": "Don't know what to do?", 68 | 'done!': 'kész!', 69 | 'Download': 'Download', 70 | 'E-mail': 'E-mail', 71 | 'Edit': 'Szerkeszt', 72 | 'Edit current record': 'Aktuális bejegyzés szerkesztése', 73 | 'edit profile': 'profil szerkesztése', 74 | 'Edit This App': 'Alkalmazást szerkeszt', 75 | 'Email and SMS': 'Email and SMS', 76 | 'Errors': 'Errors', 77 | 'export as csv file': 'exportál csv fájlba', 78 | 'FAQ': 'FAQ', 79 | 'First name': 'First name', 80 | 'Forms and Validators': 'Forms and Validators', 81 | 'Free Applications': 'Free Applications', 82 | 'Graph Model': 'Graph Model', 83 | 'Group ID': 'Group ID', 84 | 'Groups': 'Groups', 85 | 'Hello World': 'Hello Világ', 86 | 'Helping web2py': 'Helping web2py', 87 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 88 | 'Home': 'Home', 89 | 'How did you get here?': 'How did you get here?', 90 | 'import': 'import', 91 | 'Import/Export': 'Import/Export', 92 | 'Index': 'Index', 93 | 'insert new': 'új beillesztése', 94 | 'insert new %s': 'új beillesztése %s', 95 | 'Internal State': 'Internal State', 96 | 'Introduction': 'Introduction', 97 | 'Invalid email': 'Invalid email', 98 | 'Invalid Query': 'Hibás lekérdezés', 99 | 'invalid request': 'hibás kérés', 100 | 'Key': 'Key', 101 | 'Last name': 'Last name', 102 | 'Layout': 'Szerkezet', 103 | 'Layout Plugins': 'Layout Plugins', 104 | 'Layouts': 'Layouts', 105 | 'Live Chat': 'Live Chat', 106 | 'Log In': 'Log In', 107 | 'login': 'belép', 108 | 'logout': 'kilép', 109 | 'lost password': 'elveszett jelszó', 110 | 'Lost Password': 'Lost Password', 111 | 'Main Menu': 'Főmenü', 112 | 'Manage %(action)s': 'Manage %(action)s', 113 | 'Manage Access Control': 'Manage Access Control', 114 | 'Manage Cache': 'Manage Cache', 115 | 'Memberships': 'Memberships', 116 | 'Menu Model': 'Menü model', 117 | 'My Sites': 'My Sites', 118 | 'Name': 'Name', 119 | 'New Record': 'Új bejegyzés', 120 | 'new record inserted': 'új bejegyzés felvéve', 121 | 'next %s rows': 'next %s rows', 122 | 'next 100 rows': 'következő 100 sor', 123 | 'No databases in this application': 'Nincs adatbázis ebben az alkalmazásban', 124 | 'Number of entries: **%s**': 'Number of entries: **%s**', 125 | 'Online book': 'Online book', 126 | 'Online examples': 'online példákért kattints ide', 127 | 'or import from csv file': 'vagy betöltés csv fájlból', 128 | 'Origin': 'Origin', 129 | 'Other Plugins': 'Other Plugins', 130 | 'Other Recipes': 'Other Recipes', 131 | 'Overview': 'Overview', 132 | 'Password': 'Password', 133 | 'Permission': 'Permission', 134 | 'Permissions': 'Permissions', 135 | 'Plugins': 'Plugins', 136 | 'Powered by': 'Powered by', 137 | 'Preface': 'Preface', 138 | 'previous %s rows': 'previous %s rows', 139 | 'previous 100 rows': 'előző 100 sor', 140 | 'pygraphviz library not found': 'pygraphviz library not found', 141 | 'Python': 'Python', 142 | 'Query:': 'Lekérdezés:', 143 | 'Quick Examples': 'Quick Examples', 144 | 'RAM': 'RAM', 145 | 'RAM Cache Keys': 'RAM Cache Keys', 146 | 'Ram Cleared': 'Ram Cleared', 147 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 148 | 'Recipes': 'Recipes', 149 | 'Record': 'bejegyzés', 150 | 'record does not exist': 'bejegyzés nem létezik', 151 | 'Record ID': 'Record ID', 152 | 'Record id': 'bejegyzés id', 153 | 'Register': 'Register', 154 | 'register': 'regisztráció', 155 | 'Registration key': 'Registration key', 156 | 'Reset Password key': 'Reset Password key', 157 | 'Role': 'Role', 158 | 'Roles': 'Roles', 159 | 'Rows in Table': 'Sorok a táblában', 160 | 'Rows selected': 'Kiválasztott sorok', 161 | 'Save model as...': 'Save model as...', 162 | 'Semantic': 'Semantic', 163 | 'Services': 'Services', 164 | 'Sign Up': 'Sign Up', 165 | 'Size of cache:': 'Size of cache:', 166 | 'state': 'állapot', 167 | 'Statistics': 'Statistics', 168 | 'Stylesheet': 'Stylesheet', 169 | 'submit': 'submit', 170 | 'Support': 'Support', 171 | 'Sure you want to delete this object?': 'Biztos törli ezt az objektumot?', 172 | 'Table': 'tábla', 173 | 'Table name': 'Table name', 174 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.', 175 | 'The Core': 'The Core', 176 | 'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s', 177 | 'The Views': 'The Views', 178 | 'This App': 'This App', 179 | 'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)', 180 | 'Timestamp': 'Timestamp', 181 | 'Traceback': 'Traceback', 182 | 'Twitter': 'Twitter', 183 | 'unable to parse csv file': 'nem lehet a csv fájlt beolvasni', 184 | 'Update:': 'Frissít:', 185 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.', 186 | 'User': 'User', 187 | 'User ID': 'User ID', 188 | 'Users': 'Users', 189 | 'Videos': 'Videos', 190 | 'View': 'Nézet', 191 | 'Welcome %s': 'Welcome %s', 192 | 'Welcome to web2py': 'Isten hozott a web2py-ban', 193 | 'Welcome to web2py!': 'Welcome to web2py!', 194 | 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 195 | 'Working...': 'Working...', 196 | 'You are successfully running web2py': 'You are successfully running web2py', 197 | 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 198 | 'You visited the url %s': 'You visited the url %s', 199 | } 200 | -------------------------------------------------------------------------------- /languages/pl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'pl', 4 | '!langname!': 'Polska', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Uaktualnij" jest dodatkowym wyrażeniem postaci "pole1=\'nowawartość\'". Nie możesz uaktualnić lub usunąć wyników z JOIN:', 6 | '%s %%{row} deleted': 'Wierszy usuniętych: %s', 7 | '%s %%{row} updated': 'Wierszy uaktualnionych: %s', 8 | '%s selected': '%s wybranych', 9 | '%Y-%m-%d': '%Y-%m-%d', 10 | '%Y-%m-%d %H:%M:%S': '%Y-%m-%d %H:%M:%S', 11 | '(**%.0d MB**)': '(**%.0d MB**)', 12 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 13 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 14 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 15 | '?': '?', 16 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 17 | 'About': 'About', 18 | 'Access Control': 'Access Control', 19 | 'admin': 'admin', 20 | 'Administrative Interface': 'Administrative Interface', 21 | 'Administrative interface': 'Kliknij aby przejść do panelu administracyjnego', 22 | 'Ajax Recipes': 'Ajax Recipes', 23 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 24 | 'appadmin is disabled because insecure channel': 'administracja aplikacji wyłączona z powodu braku bezpiecznego połączenia', 25 | 'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?', 26 | 'Authentication': 'Uwierzytelnienie', 27 | 'Available Databases and Tables': 'Dostępne bazy danych i tabele', 28 | 'Buy this book': 'Buy this book', 29 | "Buy web2py's book": "Buy web2py's book", 30 | 'cache': 'cache', 31 | 'Cache': 'Cache', 32 | 'Cache Cleared': 'Cache Cleared', 33 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 34 | 'Cache Keys': 'Cache Keys', 35 | 'Cannot be empty': 'Nie może być puste', 36 | 'Change Password': 'Zmień hasło', 37 | 'change password': 'change password', 38 | 'Check to delete': 'Zaznacz aby usunąć', 39 | 'Check to delete:': 'Zaznacz aby usunąć:', 40 | 'Clear CACHE?': 'Clear CACHE?', 41 | 'Clear DISK': 'Clear DISK', 42 | 'Clear RAM': 'Clear RAM', 43 | 'Client IP': 'IP klienta', 44 | 'Community': 'Community', 45 | 'Components and Plugins': 'Components and Plugins', 46 | 'Config.ini': 'Config.ini', 47 | 'Controller': 'Kontroler', 48 | 'Copyright': 'Copyright', 49 | 'Current request': 'Aktualne żądanie', 50 | 'Current response': 'Aktualna odpowiedź', 51 | 'Current session': 'Aktualna sesja', 52 | 'customize me!': 'dostosuj mnie!', 53 | 'data uploaded': 'dane wysłane', 54 | 'Database': 'baza danych', 55 | 'Database %s select': 'wybór z bazy danych %s', 56 | 'Database Administration (appadmin)': 'Database Administration (appadmin)', 57 | 'db': 'baza danych', 58 | 'DB Model': 'Model bazy danych', 59 | 'Delete:': 'Usuń:', 60 | 'Demo': 'Demo', 61 | 'Deployment Recipes': 'Deployment Recipes', 62 | 'Description': 'Opis', 63 | 'design': 'projektuj', 64 | 'Design': 'Design', 65 | 'DISK': 'DISK', 66 | 'Disk Cache Keys': 'Disk Cache Keys', 67 | 'Disk Cleared': 'Disk Cleared', 68 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 69 | 'Documentation': 'Documentation', 70 | "Don't know what to do?": "Don't know what to do?", 71 | 'done!': 'zrobione!', 72 | 'Download': 'Download', 73 | 'E-mail': 'Adres e-mail', 74 | 'Edit': 'Edycja', 75 | 'Edit current record': 'Edytuj obecny rekord', 76 | 'edit profile': 'edit profile', 77 | 'Edit Profile': 'Edytuj profil', 78 | 'Edit This App': 'Edytuj tę aplikację', 79 | 'Email and SMS': 'Email and SMS', 80 | 'Errors': 'Errors', 81 | 'export as csv file': 'eksportuj jako plik csv', 82 | 'FAQ': 'FAQ', 83 | 'First name': 'Imię', 84 | 'Forms and Validators': 'Forms and Validators', 85 | 'Free Applications': 'Free Applications', 86 | 'Function disabled': 'Funkcja wyłączona', 87 | 'Graph Model': 'Graph Model', 88 | 'Group ID': 'ID grupy', 89 | 'Groups': 'Groups', 90 | 'Hello World': 'Witaj Świecie', 91 | 'Helping web2py': 'Helping web2py', 92 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 93 | 'Home': 'Home', 94 | 'How did you get here?': 'How did you get here?', 95 | 'import': 'import', 96 | 'Import/Export': 'Importuj/eksportuj', 97 | 'Index': 'Indeks', 98 | 'insert new': 'wstaw nowy rekord tabeli', 99 | 'insert new %s': 'wstaw nowy rekord do tabeli %s', 100 | 'Internal State': 'Stan wewnętrzny', 101 | 'Introduction': 'Introduction', 102 | 'Invalid email': 'Błędny adres email', 103 | 'Invalid Query': 'Błędne zapytanie', 104 | 'invalid request': 'Błędne żądanie', 105 | 'Key': 'Key', 106 | 'Last name': 'Nazwisko', 107 | 'Layout': 'Układ', 108 | 'Layout Plugins': 'Layout Plugins', 109 | 'Layouts': 'Layouts', 110 | 'Live Chat': 'Live Chat', 111 | 'Log In': 'Log In', 112 | 'login': 'login', 113 | 'Login': 'Zaloguj', 114 | 'logout': 'logout', 115 | 'Logout': 'Wyloguj', 116 | 'Lost Password': 'Przypomnij hasło', 117 | 'Main Menu': 'Menu główne', 118 | 'Manage %(action)s': 'Manage %(action)s', 119 | 'Manage Access Control': 'Manage Access Control', 120 | 'Manage Cache': 'Manage Cache', 121 | 'Memberships': 'Memberships', 122 | 'Menu Model': 'Model menu', 123 | 'My Sites': 'My Sites', 124 | 'Name': 'Nazwa', 125 | 'New Record': 'Nowy rekord', 126 | 'new record inserted': 'nowy rekord został wstawiony', 127 | 'next %s rows': 'next %s rows', 128 | 'next 100 rows': 'następne 100 wierszy', 129 | 'No databases in this application': 'Brak baz danych w tej aplikacji', 130 | 'Number of entries: **%s**': 'Number of entries: **%s**', 131 | 'Online book': 'Online book', 132 | 'Online examples': 'Kliknij aby przejść do interaktywnych przykładów', 133 | 'or import from csv file': 'lub zaimportuj z pliku csv', 134 | 'Origin': 'Źródło', 135 | 'Other Plugins': 'Other Plugins', 136 | 'Other Recipes': 'Other Recipes', 137 | 'Overview': 'Overview', 138 | 'Password': 'Hasło', 139 | "Password fields don't match": 'Pola hasła nie są zgodne ze sobą', 140 | 'Permission': 'Permission', 141 | 'Permissions': 'Permissions', 142 | 'Plugins': 'Plugins', 143 | 'Powered by': 'Zasilane przez', 144 | 'Preface': 'Preface', 145 | 'previous %s rows': 'previous %s rows', 146 | 'previous 100 rows': 'poprzednie 100 wierszy', 147 | 'pygraphviz library not found': 'pygraphviz library not found', 148 | 'Python': 'Python', 149 | 'Query:': 'Zapytanie:', 150 | 'Quick Examples': 'Quick Examples', 151 | 'RAM': 'RAM', 152 | 'RAM Cache Keys': 'RAM Cache Keys', 153 | 'Ram Cleared': 'Ram Cleared', 154 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 155 | 'Recipes': 'Recipes', 156 | 'Record': 'rekord', 157 | 'record does not exist': 'rekord nie istnieje', 158 | 'Record ID': 'ID rekordu', 159 | 'Record id': 'id rekordu', 160 | 'Register': 'Zarejestruj', 161 | 'register': 'register', 162 | 'Registration key': 'Klucz rejestracji', 163 | 'Role': 'Rola', 164 | 'Roles': 'Roles', 165 | 'Rows in Table': 'Wiersze w tabeli', 166 | 'Rows selected': 'Wybrane wiersze', 167 | 'Save model as...': 'Save model as...', 168 | 'Semantic': 'Semantic', 169 | 'Services': 'Services', 170 | 'Sign Up': 'Sign Up', 171 | 'Size of cache:': 'Size of cache:', 172 | 'state': 'stan', 173 | 'Statistics': 'Statistics', 174 | 'Stylesheet': 'Arkusz stylów', 175 | 'submit': 'submit', 176 | 'Submit': 'Wyślij', 177 | 'Support': 'Support', 178 | 'Sure you want to delete this object?': 'Czy na pewno chcesz usunąć ten obiekt?', 179 | 'Table': 'tabela', 180 | 'Table name': 'Nazwa tabeli', 181 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"Zapytanie" jest warunkiem postaci "db.tabela1.pole1==\'wartość\'". Takie coś jak "db.tabela1.pole1==db.tabela2.pole2" oznacza SQL JOIN.', 182 | 'The Core': 'The Core', 183 | 'The output of the file is a dictionary that was rendered by the view %s': 'The output of the file is a dictionary that was rendered by the view %s', 184 | 'The Views': 'The Views', 185 | 'This App': 'This App', 186 | 'Time in Cache (h:m:s)': 'Time in Cache (h:m:s)', 187 | 'Timestamp': 'Znacznik czasu', 188 | 'Traceback': 'Traceback', 189 | 'Twitter': 'Twitter', 190 | 'unable to parse csv file': 'nie można sparsować pliku csv', 191 | 'Update:': 'Uaktualnij:', 192 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Użyj (...)&(...) jako AND, (...)|(...) jako OR oraz ~(...) jako NOT do tworzenia bardziej skomplikowanych zapytań.', 193 | 'User': 'User', 194 | 'User %(id)s Registered': 'Użytkownik %(id)s został zarejestrowany', 195 | 'User ID': 'ID użytkownika', 196 | 'Users': 'Users', 197 | 'Verify Password': 'Potwierdź hasło', 198 | 'Videos': 'Videos', 199 | 'View': 'Widok', 200 | 'Welcome %s': 'Welcome %s', 201 | 'Welcome to web2py': 'Witaj w web2py', 202 | 'Welcome to web2py!': 'Welcome to web2py!', 203 | 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 204 | 'Working...': 'Working...', 205 | 'You are successfully running web2py': 'You are successfully running web2py', 206 | 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 207 | 'You visited the url %s': 'You visited the url %s', 208 | } 209 | -------------------------------------------------------------------------------- /languages/plural-cs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'den': ['dny', 'dn\\xc5\\xaf'], 4 | 'dnem': ['dny', 'dny'], 5 | 'hodina': ['hodiny', 'hodin'], 6 | 'hodinou': ['hodinami', 'hodinami'], 7 | 'minuta': ['minuty', 'minut'], 8 | 'minutou': ['minutami', 'minutami'], 9 | 'měsíc': ['m\\xc4\\x9bs\\xc3\\xadce', 'm\\xc4\\x9bs\\xc3\\xadc\\xc5\\xaf'], 10 | 'měsícem': ['m\\xc4\\x9bs\\xc3\\xadci', 'm\\xc4\\x9bs\\xc3\\xadci'], 11 | 'rok': ['roky', 'let'], 12 | 'rokem': ['roky', 'lety'], 13 | 'soubor': ['soubory', 'soubor\\xc5\\xaf'], 14 | 'týden': ['t\\xc3\\xbddny', 't\\xc3\\xbddn\\xc5\\xaf'], 15 | 'týdnem': ['t\\xc3\\xbddny', 't\\xc3\\xbddny'], 16 | 'vteřina': ['vte\\xc5\\x99iny', 'vte\\xc5\\x99in'], 17 | 'vteřinou': ['vte\\xc5\\x99inami', 'vte\\xc5\\x99inami'], 18 | 'záznam': ['z\\xc3\\xa1znamy', 'z\\xc3\\xa1znam\\xc5\\xaf'], 19 | } 20 | -------------------------------------------------------------------------------- /languages/plural-en.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'account': ['accounts'], 4 | 'book': ['books'], 5 | 'is': ['are'], 6 | 'man': ['men'], 7 | 'miss': ['misses'], 8 | 'person': ['people'], 9 | 'quark': ['quarks'], 10 | 'shop': ['shops'], 11 | 'this': ['these'], 12 | 'was': ['were'], 13 | 'woman': ['women'], 14 | } 15 | -------------------------------------------------------------------------------- /languages/plural-es.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'actualizada': ['actualizadas'], 4 | 'eliminada': ['eliminadas'], 5 | 'fila': ['filas'], 6 | 'seleccionado': ['seleccionados'], 7 | } 8 | -------------------------------------------------------------------------------- /languages/plural-ru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'выбрана': ['\\xd0\\xb2\\xd1\\x8b\\xd0\\xb1\\xd1\\x80\\xd0\\xb0\\xd0\\xbd\\xd1\\x8b', '\\xd0\\xb2\\xd1\\x8b\\xd0\\xb1\\xd1\\x80\\xd0\\xb0\\xd0\\xbd\\xd0\\xbe'], 4 | 'год': ['\\xd0\\xb3\\xd0\\xbe\\xd0\\xb4\\xd0\\xb0', '\\xd0\\xbb\\xd0\\xb5\\xd1\\x82'], 5 | 'день': ['\\xd0\\xb4\\xd0\\xbd\\xd1\\x8f', '\\xd0\\xb4\\xd0\\xbd\\xd0\\xb5\\xd0\\xb9'], 6 | 'запись': ['\\xd0\\xb7\\xd0\\xb0\\xd0\\xbf\\xd0\\xb8\\xd1\\x81\\xd0\\xb8', '\\xd0\\xb7\\xd0\\xb0\\xd0\\xbf\\xd0\\xb8\\xd1\\x81\\xd0\\xb5\\xd0\\xb9'], 7 | 'изменена': ['\\xd0\\xb8\\xd0\\xb7\\xd0\\xbc\\xd0\\xb5\\xd0\\xbd\\xd0\\xb5\\xd0\\xbd\\xd1\\x8b', '\\xd0\\xb8\\xd0\\xb7\\xd0\\xbc\\xd0\\xb5\\xd0\\xbd\\xd0\\xb5\\xd0\\xbd\\xd0\\xbe'], 8 | 'месяц': ['\\xd0\\xbc\\xd0\\xb5\\xd1\\x81\\xd1\\x8f\\xd1\\x86\\xd0\\xb0', '\\xd0\\xbc\\xd0\\xb5\\xd1\\x81\\xd1\\x8f\\xd1\\x86\\xd0\\xb5\\xd0\\xb2'], 9 | 'минуту': ['\\xd0\\xbc\\xd0\\xb8\\xd0\\xbd\\xd1\\x83\\xd1\\x82\\xd1\\x8b', '\\xd0\\xbc\\xd0\\xb8\\xd0\\xbd\\xd1\\x83\\xd1\\x82'], 10 | 'неделю': ['\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd0\\xb8', '\\xd0\\xbd\\xd0\\xb5\\xd0\\xb4\\xd0\\xb5\\xd0\\xbb\\xd1\\x8c'], 11 | 'секунду': ['\\xd1\\x81\\xd0\\xb5\\xd0\\xba\\xd1\\x83\\xd0\\xbd\\xd0\\xb4\\xd1\\x8b', '\\xd1\\x81\\xd0\\xb5\\xd0\\xba\\xd1\\x83\\xd0\\xbd\\xd0\\xb4'], 12 | 'строка': ['\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb8', '\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba'], 13 | 'удалена': ['\\xd1\\x83\\xd0\\xb4\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd1\\x8b', '\\xd1\\x83\\xd0\\xb4\\xd0\\xb0\\xd0\\xbb\\xd0\\xb5\\xd0\\xbd\\xd0\\xbe'], 14 | 'час': ['\\xd1\\x87\\xd0\\xb0\\xd1\\x81\\xd0\\xb0', '\\xd1\\x87\\xd0\\xb0\\xd1\\x81\\xd0\\xbe\\xd0\\xb2'], 15 | } 16 | -------------------------------------------------------------------------------- /languages/plural-uk.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'байт': ['\\xd0\\xb1\\xd0\\xb0\\xd0\\xb9\\xd1\\x82\\xd0\\xb8', '\\xd0\\xb1\\xd0\\xb0\\xd0\\xb9\\xd1\\x82\\xd1\\x96\\xd0\\xb2'], 4 | 'годину': ['\\xd0\\xb3\\xd0\\xbe\\xd0\\xb4\\xd0\\xb8\\xd0\\xbd\\xd0\\xb8', '\\xd0\\xb3\\xd0\\xbe\\xd0\\xb4\\xd0\\xb8\\xd0\\xbd'], 5 | 'день': ['\\xd0\\xb4\\xd0\\xbd\\xd1\\x96', '\\xd0\\xb4\\xd0\\xbd\\xd1\\x96\\xd0\\xb2'], 6 | 'елемент': ['\\xd0\\xb5\\xd0\\xbb\\xd0\\xb5\\xd0\\xbc\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd0\\xb8', '\\xd0\\xb5\\xd0\\xbb\\xd0\\xb5\\xd0\\xbc\\xd0\\xb5\\xd0\\xbd\\xd1\\x82\\xd1\\x96\\xd0\\xb2'], 7 | 'запис': ['\\xd0\\xb7\\xd0\\xb0\\xd0\\xbf\\xd0\\xb8\\xd1\\x81\\xd0\\xb8', '\\xd0\\xb7\\xd0\\xb0\\xd0\\xbf\\xd0\\xb8\\xd1\\x81\\xd1\\x96\\xd0\\xb2'], 8 | 'місяць': ['\\xd0\\xbc\\xd1\\x96\\xd1\\x81\\xd1\\x8f\\xd1\\x86\\xd1\\x96', '\\xd0\\xbc\\xd1\\x96\\xd1\\x81\\xd1\\x8f\\xd1\\x86\\xd1\\x96\\xd0\\xb2'], 9 | 'поцілювання': ['\\xd0\\xbf\\xd0\\xbe\\xd1\\x86\\xd1\\x96\\xd0\\xbb\\xd1\\x8e\\xd0\\xb2\\xd0\\xb0\\xd0\\xbd\\xd0\\xbd\\xd1\\x8f', '\\xd0\\xbf\\xd0\\xbe\\xd1\\x86\\xd1\\x96\\xd0\\xbb\\xd1\\x8e\\xd0\\xb2\\xd0\\xb0\\xd0\\xbd\\xd1\\x8c'], 10 | 'рядок': ['\\xd1\\x80\\xd1\\x8f\\xd0\\xb4\\xd0\\xba\\xd0\\xb8', '\\xd1\\x80\\xd1\\x8f\\xd0\\xb4\\xd0\\xba\\xd1\\x96\\xd0\\xb2'], 11 | 'рік': ['\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb8', '\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd1\\x96\\xd0\\xb2'], 12 | 'секунду': ['\\xd1\\x81\\xd0\\xb5\\xd0\\xba\\xd1\\x83\\xd0\\xbd\\xd0\\xb4\\xd0\\xb8', '\\xd1\\x81\\xd0\\xb5\\xd0\\xba\\xd1\\x83\\xd0\\xbd\\xd0\\xb4'], 13 | 'схибнення': ['\\xd1\\x81\\xd1\\x85\\xd0\\xb8\\xd0\\xb1\\xd0\\xbd\\xd0\\xb5\\xd0\\xbd\\xd0\\xbd\\xd1\\x8f', '\\xd1\\x81\\xd1\\x85\\xd0\\xb8\\xd0\\xb1\\xd0\\xbd\\xd0\\xb5\\xd0\\xbd\\xd1\\x8c'], 14 | 'тиждень': ['\\xd1\\x82\\xd0\\xb8\\xd0\\xb6\\xd0\\xbd\\xd1\\x96', '\\xd1\\x82\\xd0\\xb8\\xd0\\xb6\\xd0\\xbd\\xd1\\x96\\xd0\\xb2'], 15 | 'хвилину': ['\\xd1\\x85\\xd0\\xb2\\xd0\\xb8\\xd0\\xbb\\xd0\\xb8\\xd0\\xbd\\xd0\\xb8', '\\xd1\\x85\\xd0\\xb2\\xd0\\xb8\\xd0\\xbb\\xd0\\xb8\\xd0\\xbd'], 16 | } 17 | -------------------------------------------------------------------------------- /languages/sk.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | '!langcode!': 'sk', 4 | '!langname!': 'Slovenský', 5 | '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"update" je voliteľný výraz ako "field1=\'newvalue\'". Nemôžete upravovať alebo zmazať výsledky JOINu', 6 | '%s %%{row} deleted': '%s zmazaných záznamov', 7 | '%s %%{row} updated': '%s upravených záznamov', 8 | '%s selected': '%s označených', 9 | '%Y-%m-%d': '%d.%m.%Y', 10 | '%Y-%m-%d %H:%M:%S': '%d.%m.%Y %H:%M:%S', 11 | '(**%.0d MB**)': '(**%.0d MB**)', 12 | '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}', 13 | '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', 14 | '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 15 | '?': '?', 16 | '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', 17 | 'About': 'O nás', 18 | 'Access Control': 'Kontrola prístupu', 19 | 'admin': 'admin', 20 | 'Administrative Interface': 'Administrátorské rozhranie', 21 | 'Administrative interface': 'pre administrátorské rozhranie kliknite sem', 22 | 'Ajax Recipes': 'Ajax recepty', 23 | 'An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page', 24 | 'appadmin is disabled because insecure channel': 'appadmin je zakázaný bez zabezpečeného spojenia', 25 | 'Are you sure you want to delete this object?': 'Ste si istý, že chcete vymazať tento objekt?', 26 | 'Available Databases and Tables': 'Dostupné databázy a tabuľky', 27 | 'Buy this book': 'Kúpte si túto knihu', 28 | "Buy web2py's book": "Kúpte si web2py's knihu", 29 | 'cache': 'cache', 30 | 'Cache': 'Cache', 31 | 'Cache Cleared': 'Cache vymazané', 32 | 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 33 | 'Cache Keys': 'Cache kľúče', 34 | 'Cannot be empty': 'Nemôže byť prázdne', 35 | 'Check to delete': 'Označiť na zmazanie', 36 | 'Clear CACHE?': 'Vyčistiť CACHE?', 37 | 'Clear DISK': 'Vyčistiť DISK', 38 | 'Clear RAM': 'Vyčistiť RAM', 39 | 'Community': 'komunita', 40 | 'Components and Plugins': 'Komponenty a pluginy', 41 | 'Config.ini': 'Config.ini', 42 | 'Controller': 'Kontrolér', 43 | 'Copyright': 'Copyright', 44 | 'Current request': 'Aktuálna požiadavka', 45 | 'Current response': 'Aktuálna odpoveď', 46 | 'Current session': 'Aktuálne sedenie', 47 | 'customize me!': 'prispôsob ma!', 48 | 'data uploaded': 'údaje naplnené', 49 | 'Database': 'Databáza', 50 | 'Database %s select': 'Databáza %s výber', 51 | 'Database Administration (appadmin)': 'Správa databázy (appadmin)', 52 | 'db': 'db', 53 | 'DB Model': 'DB Model', 54 | 'Delete:': 'Zmazať:', 55 | 'Demo': 'Demo', 56 | 'Deployment Recipes': 'Recepty pre nasadenie', 57 | 'Description': 'Popis', 58 | 'design': 'návrh', 59 | 'Design': 'Návrh', 60 | 'DISK': 'DISK', 61 | 'Disk Cache Keys': 'Disk Cache Keys', 62 | 'Disk Cleared': 'Disk vyčistený', 63 | 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 64 | 'Documentation': 'Dokumentácia', 65 | "Don't know what to do?": 'Neviete, čo robiť?', 66 | 'done!': 'hotovo!', 67 | 'Download': 'Stiahnuť', 68 | 'Edit': 'Upraviť', 69 | 'Edit current record': 'Upraviť aktuálny záznam', 70 | 'Edit Profile': 'Upraviť profil', 71 | 'Email and SMS': 'Email a SMS', 72 | 'Errors': 'Chyby', 73 | 'export as csv file': 'exportovať do csv súboru', 74 | 'FAQ': 'FAQ', 75 | 'First name': 'Krstné meno', 76 | 'Forms and Validators': 'Formuláre a schvalovače', 77 | 'Free Applications': 'Aplikácie zadarmo', 78 | 'Graph Model': 'Model grafu', 79 | 'Group ID': 'ID skupiny', 80 | 'Groups': 'Skupiny', 81 | 'Hello World': 'Ahoj svet', 82 | 'Helping web2py': 'Pomáhať web2py', 83 | 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', 84 | 'Home': 'Domov', 85 | 'How did you get here?': 'Ako ste sa sem dostali?', 86 | 'import': 'import', 87 | 'Import/Export': 'Import/Export', 88 | 'Index': 'Index', 89 | 'insert new': 'vložiť nový', 90 | 'insert new %s': 'vložiť nový%s', 91 | 'Internal State': 'Vnútorný stav', 92 | 'Introduction': 'Úvod', 93 | 'Invalid email': 'Neplatný email', 94 | 'Invalid password': 'Nesprávne heslo', 95 | 'Invalid Query': 'Neplatná otázka', 96 | 'invalid request': 'Neplatná požiadavka', 97 | 'Key': 'Kľúč', 98 | 'Last name': 'Priezvisko', 99 | 'Layout': 'Usporiadanie', 100 | 'Layout Plugins': 'Pluginy pre usporiadanie', 101 | 'Layouts': 'Usporiadania', 102 | 'Live Chat': 'Živý Chat', 103 | 'Log In': 'Prihlásiť sa', 104 | 'Logged in': 'Prihlásený', 105 | 'Logged out': 'Odhlásený', 106 | 'login': 'prihlásiť', 107 | 'logout': 'odhlásiť', 108 | 'Lost Password': 'Stratené heslo?', 109 | 'lost password?': 'stratené heslo?', 110 | 'Manage %(action)s': 'Spravovať %(action)s', 111 | 'Manage Access Control': 'Spravovať kontrolu prístupu', 112 | 'Manage Cache': 'Spravovať cache', 113 | 'Memberships': 'Členstvá', 114 | 'Menu Model': 'Model menu', 115 | 'My Sites': 'Moje stránky', 116 | 'Name': 'Meno', 117 | 'New password': 'Nové heslo', 118 | 'New Record': 'Nový záznam', 119 | 'new record inserted': 'nový záznam bol vložený', 120 | 'next %s rows': 'next %s rows', 121 | 'next 100 rows': 'ďalších 100 riadkov', 122 | 'No databases in this application': 'V tejto aplikácii nie sú databázy', 123 | 'Number of entries: **%s**': 'Number of entries: **%s**', 124 | 'Old password': 'Staré heslo', 125 | 'Online book': 'Online kniha', 126 | 'Online examples': 'online príklady', 127 | 'or import from csv file': 'alebo naimportovať z csv súboru', 128 | 'Origin': 'Pôvod', 129 | 'Other Plugins': 'Ostatné pluginy', 130 | 'Other Recipes': 'Ostatné recepty', 131 | 'Overview': 'Náhľad', 132 | 'password': 'heslo', 133 | 'Password': 'Heslo', 134 | 'Permission': 'Povolenie', 135 | 'Permissions': 'Povolenia', 136 | 'Plugins': 'Pluginy', 137 | 'Powered by': 'Beží na', 138 | 'Preface': 'Predslov', 139 | 'previous %s rows': 'predchádzajúce %s riadky', 140 | 'previous 100 rows': 'predchádzajúcich 100 riadkov', 141 | 'pygraphviz library not found': 'knižnica pygraphviz nenájdená', 142 | 'Python': 'Python', 143 | 'Query:': 'Otázka:', 144 | 'Quick Examples': 'Rýchle príklady', 145 | 'RAM': 'RAM', 146 | 'RAM Cache Keys': 'RAM cache kľúče', 147 | 'Ram Cleared': 'Ram vyčistená', 148 | 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 149 | 'Recipes': 'Recepty', 150 | 'Record': 'Záznam', 151 | 'record does not exist': 'záznam neexistuje', 152 | 'Record ID': 'ID záznamu', 153 | 'Record id': 'id záznamu', 154 | 'Register': 'Zaregistrovať sa', 155 | 'register': 'registrovať', 156 | 'Registration key': 'Registračný kľúč', 157 | 'Remember me (for 30 days)': 'Zapamätaj si ma (na 30 dní)', 158 | 'Reset Password key': 'Nastaviť registračný kľúč', 159 | 'Role': 'Rola', 160 | 'Roles': 'Role', 161 | 'Rows in Table': 'Riadkov v tabuľke', 162 | 'Rows selected': 'Označených riadkov', 163 | 'Save model as...': 'Uložiť model ako...', 164 | 'Semantic': 'Významový', 165 | 'Services': 'Služby', 166 | 'Sign Up': 'Prihlásiť sa', 167 | 'Size of cache:': 'Veľkosť cache:', 168 | 'state': 'stav', 169 | 'Statistics': 'Štatistiky', 170 | 'Stylesheet': 'Stylesheet', 171 | 'submit': 'odoslať', 172 | 'Submit': 'Odoslať', 173 | 'Support': 'Podpora', 174 | 'Sure you want to delete this object?': 'Ste si istí, že chcete zmazať tento objekt?', 175 | 'Table': 'Tabuľka', 176 | 'Table name': 'Názov tabuľky', 177 | 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': '"query" je podmienka ako "db.table1.field1==\'value\'". Niečo ako "db.table1.field1==db.table2.field2" má za výsledok SQL JOIN.', 178 | 'The Core': 'Jadro', 179 | 'The output of the file is a dictionary that was rendered by the view %s': 'Výstup zo súboru je slovník, ktorý bol vykreslený v zobrazení %s', 180 | 'The Views': 'Zobrazenia', 181 | 'This App': 'Táto aplikácia', 182 | 'This is a copy of the scaffolding application': 'Toto je kópia skeletu aplikácie', 183 | 'Time in Cache (h:m:s)': 'Čas v cache (h:m:s)', 184 | 'Timestamp': 'Časová pečiatka', 185 | 'Traceback': 'Vystopovať', 186 | 'Twitter': 'Twitter', 187 | 'unable to parse csv file': 'nedá sa načítať csv súbor', 188 | 'Update:': 'Upraviť:', 189 | 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Použite (...)&(...) pre AND, (...)|(...) pre OR a ~(...) pre NOT na poskladanie komplexnejších otázok.', 190 | 'User': 'User', 191 | 'User %(id)s Logged-in': 'Používateľ %(id)s prihlásený', 192 | 'User %(id)s Logged-out': 'Používateľ %(id)s odhlásený', 193 | 'User %(id)s Password changed': 'Používateľ %(id)s zmenil heslo', 194 | 'User %(id)s Profile updated': 'Používateľ %(id)s upravil profil', 195 | 'User %(id)s Registered': 'Používateľ %(id)s sa zaregistroval', 196 | 'User ID': 'ID používateľa', 197 | 'Users': 'Používatelia', 198 | 'Verify Password': 'Zopakujte heslo', 199 | 'Videos': 'Videá', 200 | 'View': 'Zobraziť', 201 | 'Welcome to web2py': 'Vitajte vo web2py', 202 | 'Welcome to web2py!': 'Vitajte vo web2py!', 203 | 'Which called the function %s located in the file %s': 'Ktorý zavolal funkciu %s nachádzajúci sa v súbore %s', 204 | 'Working...': 'Pracuje...', 205 | 'You are successfully running web2py': 'Úspešne ste spustili web2py', 206 | 'You can modify this application and adapt it to your needs': 'Môžete upraviť túto aplikáciu a prispôsobiť ju svojim potrebám', 207 | 'You visited the url %s': 'Navštívili ste URL %s', 208 | } 209 | -------------------------------------------------------------------------------- /mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/static/public/js/app.js": "/static/public/js/app.js", 3 | "/static/public/css/app.css": "/static/public/css/app.css" 4 | } -------------------------------------------------------------------------------- /models/db.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # ------------------------------------------------------------------------- 4 | # AppConfig configuration made easy. Look inside private/appconfig.ini 5 | # Auth is for authenticaiton and access control 6 | # ------------------------------------------------------------------------- 7 | from gluon.contrib.appconfig import AppConfig 8 | from gluon.tools import Auth 9 | 10 | # ------------------------------------------------------------------------- 11 | # This scaffolding model makes your app work on Google App Engine too 12 | # File is released under public domain and you can use without limitations 13 | # ------------------------------------------------------------------------- 14 | 15 | if request.global_settings.web2py_version < "2.15.5": 16 | raise HTTP(500, "Requires web2py 2.15.5 or newer") 17 | 18 | # ------------------------------------------------------------------------- 19 | # if SSL/HTTPS is properly configured and you want all HTTP requests to 20 | # be redirected to HTTPS, uncomment the line below: 21 | # ------------------------------------------------------------------------- 22 | # request.requires_https() 23 | 24 | # ------------------------------------------------------------------------- 25 | # once in production, remove reload=True to gain full speed 26 | # ------------------------------------------------------------------------- 27 | configuration = AppConfig(reload=True) 28 | 29 | if not request.env.web2py_runtime_gae: 30 | # --------------------------------------------------------------------- 31 | # if NOT running on Google App Engine use SQLite or other DB 32 | # --------------------------------------------------------------------- 33 | db = DAL(configuration.get('db.uri'), 34 | pool_size=configuration.get('db.pool_size'), 35 | migrate_enabled=configuration.get('db.migrate'), 36 | check_reserved=['all']) 37 | else: 38 | # --------------------------------------------------------------------- 39 | # connect to Google BigTable (optional 'google:datastore://namespace') 40 | # --------------------------------------------------------------------- 41 | db = DAL('google:datastore+ndb') 42 | # --------------------------------------------------------------------- 43 | # store sessions and tickets there 44 | # --------------------------------------------------------------------- 45 | session.connect(request, response, db=db) 46 | # --------------------------------------------------------------------- 47 | # or store session in Memcache, Redis, etc. 48 | # from gluon.contrib.memdb import MEMDB 49 | # from google.appengine.api.memcache import Client 50 | # session.connect(request, response, db = MEMDB(Client())) 51 | # --------------------------------------------------------------------- 52 | 53 | # ------------------------------------------------------------------------- 54 | # by default give a view/generic.extension to all actions from localhost 55 | # none otherwise. a pattern can be 'controller/function.extension' 56 | # ------------------------------------------------------------------------- 57 | response.generic_patterns = [] 58 | if request.is_local and not configuration.get('app.production'): 59 | response.generic_patterns.append('*') 60 | 61 | # ------------------------------------------------------------------------- 62 | # choose a style for forms 63 | # ------------------------------------------------------------------------- 64 | response.formstyle = 'bootstrap4_inline' 65 | response.form_label_separator = '' 66 | 67 | # ------------------------------------------------------------------------- 68 | # (optional) optimize handling of static files 69 | # ------------------------------------------------------------------------- 70 | # response.optimize_css = 'concat,minify,inline' 71 | # response.optimize_js = 'concat,minify,inline' 72 | 73 | # ------------------------------------------------------------------------- 74 | # (optional) static assets folder versioning 75 | # ------------------------------------------------------------------------- 76 | # response.static_version = '0.0.0' 77 | 78 | # ------------------------------------------------------------------------- 79 | # Here is sample code if you need for 80 | # - email capabilities 81 | # - authentication (registration, login, logout, ... ) 82 | # - authorization (role based authorization) 83 | # - services (xml, csv, json, xmlrpc, jsonrpc, amf, rss) 84 | # - old style crud actions 85 | # (more options discussed in gluon/tools.py) 86 | # ------------------------------------------------------------------------- 87 | 88 | # host names must be a list of allowed host names (glob syntax allowed) 89 | auth = Auth(db, host_names=configuration.get('host.names'), 90 | jwt={'secret_key': 'secret'}, csrf_prevention=False) 91 | 92 | # ------------------------------------------------------------------------- 93 | # create all tables needed by auth, maybe add a list of extra fields 94 | # ------------------------------------------------------------------------- 95 | auth.settings.extra_fields['auth_user'] = [] 96 | auth.define_tables(username=False, signature=False) 97 | 98 | # ------------------------------------------------------------------------- 99 | # configure email 100 | # ------------------------------------------------------------------------- 101 | mail = auth.settings.mailer 102 | mail.settings.server = 'logging' if request.is_local else configuration.get('smtp.server') 103 | mail.settings.sender = configuration.get('smtp.sender') 104 | mail.settings.login = configuration.get('smtp.login') 105 | mail.settings.tls = configuration.get('smtp.tls') or False 106 | mail.settings.ssl = configuration.get('smtp.ssl') or False 107 | 108 | # ------------------------------------------------------------------------- 109 | # configure auth policy 110 | # ------------------------------------------------------------------------- 111 | auth.settings.registration_requires_verification = False 112 | auth.settings.registration_requires_approval = False 113 | auth.settings.reset_password_requires_verification = True 114 | 115 | # ------------------------------------------------------------------------- 116 | # read more at http://dev.w3.org/html5/markup/meta.name.html 117 | # ------------------------------------------------------------------------- 118 | response.meta.author = configuration.get('app.author') 119 | response.meta.description = configuration.get('app.description') 120 | response.meta.keywords = configuration.get('app.keywords') 121 | response.meta.generator = configuration.get('app.generator') 122 | 123 | # ------------------------------------------------------------------------- 124 | # your http://google.com/analytics id 125 | # ------------------------------------------------------------------------- 126 | response.google_analytics_id = configuration.get('google.analytics_id') 127 | 128 | # ------------------------------------------------------------------------- 129 | # maybe use the scheduler 130 | # ------------------------------------------------------------------------- 131 | if configuration.get('scheduler.enabled'): 132 | from gluon.scheduler import Scheduler 133 | scheduler = Scheduler(db, heartbeat=configure.get('heartbeat')) 134 | 135 | # ------------------------------------------------------------------------- 136 | # Define your tables below (or better in another model file) for example 137 | # 138 | # >>> db.define_table('mytable', Field('myfield', 'string')) 139 | # 140 | # Fields can be 'string','text','password','integer','double','boolean' 141 | # 'date','time','datetime','blob','upload', 'reference TABLENAME' 142 | # There is an implicit 'id integer autoincrement' field 143 | # Consult manual for more options, validators, etc. 144 | # 145 | # More API examples for controllers: 146 | # 147 | # >>> db.mytable.insert(myfield='value') 148 | # >>> rows = db(db.mytable.myfield == 'value').select(db.mytable.ALL) 149 | # >>> for row in rows: print row.id, row.myfield 150 | # ------------------------------------------------------------------------- 151 | 152 | # ------------------------------------------------------------------------- 153 | # after defining tables, uncomment below to enable auditing 154 | # ------------------------------------------------------------------------- 155 | # auth.enable_record_versioning(db) 156 | 157 | response.delimiters = ('{%', '%}') 158 | -------------------------------------------------------------------------------- /models/menu.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # this file is released under public domain and you can use without limitations 3 | 4 | # ---------------------------------------------------------------------------------------------------------------------- 5 | # this is the main application menu add/remove items as required 6 | # ---------------------------------------------------------------------------------------------------------------------- 7 | 8 | response.menu = [ 9 | (T('Home'), False, URL('default', 'index'), []) 10 | ] 11 | 12 | # ---------------------------------------------------------------------------------------------------------------------- 13 | # provide shortcuts for development. you can remove everything below in production 14 | # ---------------------------------------------------------------------------------------------------------------------- 15 | 16 | if not configuration.get('app.production'): 17 | _app = request.application 18 | response.menu += [ 19 | (T('My Sites'), False, URL('admin', 'default', 'site')), 20 | (T('This App'), False, '#', [ 21 | (T('Design'), False, URL('admin', 'default', 'design/%s' % _app)), 22 | (T('Controller'), False, 23 | URL( 24 | 'admin', 'default', 'edit/%s/controllers/%s.py' % (_app, request.controller))), 25 | (T('View'), False, 26 | URL( 27 | 'admin', 'default', 'edit/%s/views/%s' % (_app, response.view))), 28 | (T('DB Model'), False, 29 | URL( 30 | 'admin', 'default', 'edit/%s/models/db.py' % _app)), 31 | (T('Menu Model'), False, 32 | URL( 33 | 'admin', 'default', 'edit/%s/models/menu.py' % _app)), 34 | (T('Config.ini'), False, 35 | URL( 36 | 'admin', 'default', 'edit/%s/private/appconfig.ini' % _app)), 37 | (T('Layout'), False, 38 | URL( 39 | 'admin', 'default', 'edit/%s/views/layout.html' % _app)), 40 | (T('Stylesheet'), False, 41 | URL( 42 | 'admin', 'default', 'edit/%s/static/css/web2py-bootstrap3.css' % _app)), 43 | (T('Database'), False, URL(_app, 'appadmin', 'index')), 44 | (T('Errors'), False, URL( 45 | 'admin', 'default', 'errors/' + _app)), 46 | (T('About'), False, URL( 47 | 'admin', 'default', 'about/' + _app)), 48 | ]), 49 | ('web2py.com', False, '#', [ 50 | (T('Download'), False, 51 | 'http://www.web2py.com/examples/default/download'), 52 | (T('Support'), False, 53 | 'http://www.web2py.com/examples/default/support'), 54 | (T('Demo'), False, 'http://web2py.com/demo_admin'), 55 | (T('Quick Examples'), False, 56 | 'http://web2py.com/examples/default/examples'), 57 | (T('FAQ'), False, 'http://web2py.com/AlterEgo'), 58 | (T('Videos'), False, 59 | 'http://www.web2py.com/examples/default/videos/'), 60 | (T('Free Applications'), 61 | False, 'http://web2py.com/appliances'), 62 | (T('Plugins'), False, 'http://web2py.com/plugins'), 63 | (T('Recipes'), False, 'http://web2pyslices.com/'), 64 | ]), 65 | (T('Documentation'), False, '#', [ 66 | (T('Online book'), False, 'http://www.web2py.com/book'), 67 | (T('Preface'), False, 68 | 'http://www.web2py.com/book/default/chapter/00'), 69 | (T('Introduction'), False, 70 | 'http://www.web2py.com/book/default/chapter/01'), 71 | (T('Python'), False, 72 | 'http://www.web2py.com/book/default/chapter/02'), 73 | (T('Overview'), False, 74 | 'http://www.web2py.com/book/default/chapter/03'), 75 | (T('The Core'), False, 76 | 'http://www.web2py.com/book/default/chapter/04'), 77 | (T('The Views'), False, 78 | 'http://www.web2py.com/book/default/chapter/05'), 79 | (T('Database'), False, 80 | 'http://www.web2py.com/book/default/chapter/06'), 81 | (T('Forms and Validators'), False, 82 | 'http://www.web2py.com/book/default/chapter/07'), 83 | (T('Email and SMS'), False, 84 | 'http://www.web2py.com/book/default/chapter/08'), 85 | (T('Access Control'), False, 86 | 'http://www.web2py.com/book/default/chapter/09'), 87 | (T('Services'), False, 88 | 'http://www.web2py.com/book/default/chapter/10'), 89 | (T('Ajax Recipes'), False, 90 | 'http://www.web2py.com/book/default/chapter/11'), 91 | (T('Components and Plugins'), False, 92 | 'http://www.web2py.com/book/default/chapter/12'), 93 | (T('Deployment Recipes'), False, 94 | 'http://www.web2py.com/book/default/chapter/13'), 95 | (T('Other Recipes'), False, 96 | 'http://www.web2py.com/book/default/chapter/14'), 97 | (T('Helping web2py'), False, 98 | 'http://www.web2py.com/book/default/chapter/15'), 99 | (T("Buy web2py's book"), False, 100 | 'http://stores.lulu.com/web2py'), 101 | ]), 102 | (T('Community'), False, None, [ 103 | (T('Groups'), False, 104 | 'http://www.web2py.com/examples/default/usergroups'), 105 | (T('Twitter'), False, 'http://twitter.com/web2py'), 106 | (T('Live Chat'), False, 107 | 'http://webchat.freenode.net/?channels=web2py'), 108 | ]), 109 | ] 110 | 111 | -------------------------------------------------------------------------------- /modules/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "phpfixer": "./vendor/bin/phpcbf -w --standard=PSR2 app/*", 5 | "dev": "npm run development", 6 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 7 | "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 8 | "watch-poll": "npm run watch -- --watch-poll", 9 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 10 | "prod": "npm run production", 11 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 12 | "lint": "standard --plugin html resources/assets/js/**/* --fix" 13 | }, 14 | "dependencies": { 15 | "axios": "^0.17.1", 16 | "js-cookie": "^2.2.0", 17 | "vee-validate": "^2.0.3", 18 | "vform": "^0.8.1", 19 | "vue": "^2.5.13", 20 | "vue-i18n": "^7.4.0", 21 | "vue-meta": "^1.4.2", 22 | "vue-router": "^3.0.1", 23 | "vuetify": "^0.17.6", 24 | "vuex": "^3.0.1", 25 | "vuex-persistedstate": "^2.4.2", 26 | "vuex-router-sync": "^5.0.0" 27 | }, 28 | "devDependencies": { 29 | "babel-plugin-transform-async-to-generator": "^6.24.1", 30 | "babel-plugin-transform-object-rest-spread": "^6.26.0", 31 | "babel-plugin-transform-runtime": "^6.23.0", 32 | "cross-env": "^5.0.5", 33 | "eslint": "^3.19.0", 34 | "eslint-plugin-html": "^3.2.2", 35 | "eslint-plugin-vue-libs": "^1.2.1", 36 | "laravel-mix": "^1.7.0", 37 | "standard": "^10.0.3", 38 | "stylint": "^1.5.9", 39 | "stylus": "^0.54.5", 40 | "stylus-loader": "^3.0.1", 41 | "svg-sprite-loader": "^3.2.5", 42 | "vue-template-compiler": "^2.5.13", 43 | "webpack-bundle-analyzer": "^2.9.0" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /private/appconfig.ini: -------------------------------------------------------------------------------- 1 | ; App configuration 2 | [app] 3 | name = web2py-vuejs-vuetify 4 | author = Roberto Perdomo 5 | description = a web2py-vue integration 6 | keywords = web2py, python, framework 7 | generator = Web2py Web Framework 8 | production = false 9 | toolbar = false 10 | 11 | ; Host configuration 12 | [host] 13 | names = localhost:*, 127.0.0.1:*, *:*, * 14 | 15 | ; db configuration 16 | [db] 17 | ;uri = mysql://user:password@1host/db_name 18 | uri = sqlite://storage.sqlite 19 | migrate = true 20 | pool_size = 10 21 | 22 | ; smtp address and credentials 23 | [smtp] 24 | server = smtp.gmail.com:587 25 | sender = you@gmail.com 26 | login = username:password 27 | tls = true 28 | ssl = true 29 | 30 | [scheduler] 31 | enabled = false 32 | heartbeat = 1 33 | 34 | [google] 35 | analytics_id = 36 | -------------------------------------------------------------------------------- /progress.log: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/resources/assets/.DS_Store -------------------------------------------------------------------------------- /resources/assets/icons/lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/assets/icons/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/assets/img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/resources/assets/img/favicon-32x32.png -------------------------------------------------------------------------------- /resources/assets/img/v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/resources/assets/img/v.png -------------------------------------------------------------------------------- /resources/assets/js/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/resources/assets/js/.DS_Store -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuetify from 'vuetify' 3 | import store from '~/store' 4 | import router from '~/router' 5 | import { i18n } from '~/plugins' 6 | import App from '~/components/App' 7 | import '~/components' 8 | 9 | Vue.use(Vuetify) 10 | 11 | Vue.config.productionTip = true 12 | Vue.prototype.$baseURL = window.location.href.split('/').slice(0,4).join('/')+'/' 13 | 14 | new Vue({ 15 | el: '#app', 16 | i18n, 17 | store, 18 | router, 19 | ...App 20 | }) 21 | -------------------------------------------------------------------------------- /resources/assets/js/components/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 65 | -------------------------------------------------------------------------------- /resources/assets/js/components/FeedbackMessage.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 35 | 36 | 41 | -------------------------------------------------------------------------------- /resources/assets/js/components/Icon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 33 | 34 | 63 | -------------------------------------------------------------------------------- /resources/assets/js/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 89 | 90 | 101 | -------------------------------------------------------------------------------- /resources/assets/js/components/NavMenu.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 43 | -------------------------------------------------------------------------------- /resources/assets/js/components/PageFooter.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /resources/assets/js/components/ProgressBar.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | 27 | 38 | -------------------------------------------------------------------------------- /resources/assets/js/components/ToolBar.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 74 | 75 | 81 | -------------------------------------------------------------------------------- /resources/assets/js/components/form/EmailInput.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 26 | -------------------------------------------------------------------------------- /resources/assets/js/components/form/PasswordInput.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 83 | -------------------------------------------------------------------------------- /resources/assets/js/components/form/SubmitButton.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 40 | -------------------------------------------------------------------------------- /resources/assets/js/components/form/TextInput.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 73 | -------------------------------------------------------------------------------- /resources/assets/js/components/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Icon from './Icon' 3 | import EmailInput from './form/EmailInput' 4 | import ProgressBar from './ProgressBar' 5 | import PasswordInput from './form/PasswordInput' 6 | import SubmitButton from './form/SubmitButton' 7 | import TextInput from './form/TextInput' 8 | import { HasError, AlertError, AlertSuccess } from 'vform' 9 | 10 | Vue.component(Icon.name, Icon) 11 | Vue.component(EmailInput.name, EmailInput) 12 | Vue.component(ProgressBar.name, ProgressBar) 13 | Vue.component(PasswordInput.name, PasswordInput) 14 | Vue.component(SubmitButton.name, SubmitButton) 15 | Vue.component(TextInput.name, TextInput) 16 | Vue.component(HasError.name, HasError) 17 | Vue.component(AlertError.name, AlertError) 18 | Vue.component(AlertSuccess.name, AlertSuccess) 19 | -------------------------------------------------------------------------------- /resources/assets/js/layouts/app.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 52 | -------------------------------------------------------------------------------- /resources/assets/js/layouts/default.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /resources/assets/js/pages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/resources/assets/js/pages/.DS_Store -------------------------------------------------------------------------------- /resources/assets/js/pages/auth/login.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 99 | -------------------------------------------------------------------------------- /resources/assets/js/pages/auth/password/email.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 64 | -------------------------------------------------------------------------------- /resources/assets/js/pages/auth/password/reset.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 97 | -------------------------------------------------------------------------------- /resources/assets/js/pages/auth/register.vue: -------------------------------------------------------------------------------- 1 | 77 | 78 | 120 | -------------------------------------------------------------------------------- /resources/assets/js/pages/errors/404.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /resources/assets/js/pages/home.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | -------------------------------------------------------------------------------- /resources/assets/js/pages/settings/index.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 54 | -------------------------------------------------------------------------------- /resources/assets/js/pages/settings/password.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 85 | -------------------------------------------------------------------------------- /resources/assets/js/pages/settings/profile.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 82 | -------------------------------------------------------------------------------- /resources/assets/js/pages/welcome.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 64 | -------------------------------------------------------------------------------- /resources/assets/js/plugins/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import store from '~/store' 3 | import router from '~/router' 4 | import i18n from './vue-i18n' 5 | 6 | axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest' 7 | 8 | axios.interceptors.request.use(request => { 9 | if (store.getters.authToken) { 10 | request.headers.common['Authorization'] = `Bearer ${store.getters.authToken}` 11 | } 12 | return request 13 | }) 14 | 15 | axios.interceptors.response.use(response => response, error => { 16 | const { status, data } = error.response 17 | 18 | if (status >= 500) { 19 | store.dispatch('responseMessage', { 20 | type: 'error', 21 | text: data, 22 | title: i18n.t('error_alert_title'), 23 | modal: true 24 | }) 25 | } 26 | 27 | if (status == 400) { 28 | if (data == 'Token is expired'){ 29 | store.dispatch('responseMessage', { 30 | type: 'warning', 31 | text: i18n.t('token_expired_alert_text'), 32 | }) 33 | .then(async () => { 34 | await store.dispatch('logout') 35 | 36 | router.push({ name: 'login' }) 37 | }) 38 | } 39 | else { 40 | store.dispatch('responseMessage', { 41 | type: 'error', 42 | text: data, 43 | }) 44 | } 45 | } 46 | 47 | if (status === 401 && store.getters.authCheck) { 48 | store.dispatch('responseMessage', { 49 | type: 'warning', 50 | text: i18n.t('token_expired_alert_text'), 51 | title: i18n.t('token_expired_alert_title'), 52 | modal: true 53 | }) 54 | .then(async () => { 55 | await store.dispatch('logout') 56 | 57 | router.push({ name: 'login' }) 58 | }) 59 | } 60 | 61 | return Promise.reject(error) 62 | }) 63 | -------------------------------------------------------------------------------- /resources/assets/js/plugins/index.js: -------------------------------------------------------------------------------- 1 | import './axios' 2 | import './validation' 3 | import i18n from './vue-i18n' 4 | 5 | export { i18n } 6 | -------------------------------------------------------------------------------- /resources/assets/js/plugins/validation.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VeeValidate from 'vee-validate' 3 | 4 | Vue.use(VeeValidate, { delay: 250 }) 5 | 6 | Vue.mixin({ 7 | $_veeValidate: { 8 | validator: 'new' 9 | }, 10 | methods: { 11 | async formHasErrors () { 12 | const valid = await this.$validator.validateAll() 13 | if (valid) { 14 | this.$validator.pause() 15 | } 16 | return !valid 17 | } 18 | } 19 | }) 20 | -------------------------------------------------------------------------------- /resources/assets/js/plugins/vue-i18n.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | 4 | Vue.use(VueI18n) 5 | //const locale = window.navigator.userLanguage || window.navigator.language 6 | 7 | const locale = window.config['locale'] 8 | const translations = window.config.translations 9 | 10 | const i18n = new VueI18n({ 11 | locale, 12 | messages: { 13 | [locale]: translations 14 | } 15 | }) 16 | 17 | export default i18n 18 | -------------------------------------------------------------------------------- /resources/assets/js/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import store from '~/store' 3 | import Meta from 'vue-meta' 4 | import routes from './routes' 5 | import Router from 'vue-router' 6 | import { sync } from 'vuex-router-sync' 7 | 8 | Vue.use(Meta) 9 | Vue.use(Router) 10 | 11 | const router = make( 12 | routes({ authGuard, guestGuard }) 13 | ) 14 | 15 | sync(store, router) 16 | 17 | export default router 18 | 19 | /** 20 | * Create a new router instance. 21 | * 22 | * @param {Array} routes 23 | * @return {Router} 24 | */ 25 | function make (routes) { 26 | const router = new Router({ 27 | routes, 28 | scrollBehavior, 29 | mode: 'history' 30 | }) 31 | 32 | // Register before guard. 33 | router.beforeEach(async (to, from, next) => { 34 | if (!store.getters.authCheck && store.getters.authToken) { 35 | try { 36 | await store.dispatch('fetchUser') 37 | } catch (e) { } 38 | } 39 | 40 | setLayout(router, to) 41 | next() 42 | }) 43 | 44 | // Register after hook. 45 | router.afterEach((to, from) => { 46 | router.app.$nextTick(() => { 47 | router.app.$loading.finish() 48 | }) 49 | }) 50 | 51 | return router 52 | } 53 | 54 | /** 55 | * Set the application layout from the matched page component. 56 | * 57 | * @param {Router} router 58 | * @param {Route} to 59 | */ 60 | function setLayout (router, to) { 61 | // Get the first matched component. 62 | const [component] = router.getMatchedComponents({ ...to }) 63 | 64 | if (component) { 65 | router.app.$nextTick(() => { 66 | // Start the page loading bar. 67 | if (component.loading !== false) { 68 | router.app.$loading.start() 69 | } 70 | 71 | // Set application layout. 72 | router.app.setLayout(component.layout || '') 73 | }) 74 | } 75 | } 76 | 77 | /** 78 | * Redirect to login if guest. 79 | * 80 | * @param {Array} routes 81 | * @return {Array} 82 | */ 83 | function authGuard (routes) { 84 | return beforeEnter(routes, (to, from, next) => { 85 | if (!store.getters.authCheck) { 86 | next({ 87 | name: 'login', 88 | query: { redirect: to.fullPath } 89 | }) 90 | } else { 91 | next() 92 | } 93 | }) 94 | } 95 | 96 | /** 97 | * Redirect home if authenticated. 98 | * 99 | * @param {Array} routes 100 | * @return {Array} 101 | */ 102 | function guestGuard (routes) { 103 | return beforeEnter(routes, (to, from, next) => { 104 | if (store.getters.authCheck) { 105 | next({ name: 'home' }) 106 | } else { 107 | next() 108 | } 109 | }) 110 | } 111 | 112 | /** 113 | * Apply beforeEnter guard to the routes. 114 | * 115 | * @param {Array} routes 116 | * @param {Function} beforeEnter 117 | * @return {Array} 118 | */ 119 | function beforeEnter (routes, beforeEnter) { 120 | return routes.map(route => { 121 | return { ...route, beforeEnter } 122 | }) 123 | } 124 | 125 | /** 126 | * @param {Route} to 127 | * @param {Route} from 128 | * @param {Object|undefined} savedPosition 129 | * @return {Object} 130 | */ 131 | function scrollBehavior (to, from, savedPosition) { 132 | if (savedPosition) { 133 | return savedPosition 134 | } 135 | 136 | const position = {} 137 | 138 | if (to.hash) { 139 | position.selector = to.hash 140 | } 141 | 142 | if (to.matched.some(m => m.meta.scrollToTop)) { 143 | position.x = 0 144 | position.y = 0 145 | } 146 | 147 | return position 148 | } 149 | -------------------------------------------------------------------------------- /resources/assets/js/router/routes.js: -------------------------------------------------------------------------------- 1 | export default ({ authGuard, guestGuard }) => [ 2 | { path: '/' + window.config.appName + '/', name: 'welcome', component: require('~/pages/welcome.vue') }, 3 | 4 | // Authenticated routes. 5 | ...authGuard([ 6 | { path: '/' + window.config.appName + '/home', name: 'home', component: require('~/pages/home.vue') }, 7 | { path: '/' + window.config.appName + '/settings', 8 | component: require('~/pages/settings/index.vue'), 9 | children: [ 10 | { path: '/' + window.config.appName + '', redirect: { name: 'settings.profile' } }, 11 | { path: '/' + window.config.appName + '/profile', name: 'settings.profile', component: require('~/pages/settings/profile.vue') }, 12 | { path: '/' + window.config.appName + '/password', name: 'settings.password', component: require('~/pages/settings/password.vue') } 13 | ] } 14 | ]), 15 | 16 | // Guest routes. 17 | ...guestGuard([ 18 | { path: '/' + window.config.appName + '/login', name: 'login', component: require('~/pages/auth/login.vue') }, 19 | { path: '/' + window.config.appName + '/register', name: 'register', component: require('~/pages/auth/register.vue') }, 20 | { path: '/' + window.config.appName + '/password/reset', name: 'password.request', component: require('~/pages/auth/password/email.vue') }, 21 | { path: '/' + window.config.appName + '/password/reset/:token', name: 'password.reset', component: require('~/pages/auth/password/reset.vue') } 22 | ]), 23 | 24 | { path: '/' + window.config.appName + '*', component: require('~/pages/errors/404.vue') } 25 | ] 26 | -------------------------------------------------------------------------------- /resources/assets/js/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import createPersistedState from 'vuex-persistedstate' 4 | 5 | Vue.use(Vuex) 6 | 7 | // Load store modules dynamically. 8 | const requireContext = require.context('./modules', false, /.*\.js$/) 9 | 10 | const modules = requireContext.keys() 11 | .map(file => 12 | [file.replace(/(^.\/)|(\.js$)/g, ''), requireContext(file)] 13 | ) 14 | .reduce((modules, [name, module]) => { 15 | modules[name] = module 16 | return modules 17 | }, {}) 18 | 19 | export default new Vuex.Store({ 20 | strict: process.env.NODE_ENV !== 'production', 21 | modules, 22 | plugins: [createPersistedState({ storage: window.sessionStorage })] 23 | }) 24 | -------------------------------------------------------------------------------- /resources/assets/js/store/modules/auth.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import Cookies from 'js-cookie' 3 | import * as types from '../mutation-types' 4 | 5 | // state 6 | export const state = { 7 | user: null, 8 | token: Cookies.get('token_' + window.config.appName), 9 | } 10 | 11 | // mutations 12 | export const mutations = { 13 | [types.SAVE_TOKEN](state, { 14 | token, 15 | remember 16 | }) { 17 | state.token = token 18 | Cookies.set('token_' + window.config.appName, token, { 19 | expires: remember ? 365 : null 20 | }) 21 | }, 22 | 23 | [types.FETCH_USER_SUCCESS](state, { 24 | user 25 | }) { 26 | state.user = user 27 | }, 28 | 29 | [types.FETCH_USER_FAILURE](state) { 30 | state.token = null 31 | Cookies.remove('token_' + window.config.appName) 32 | }, 33 | 34 | [types.LOGOUT](state) { 35 | state.user = null 36 | state.token = null 37 | 38 | Cookies.remove('token_' + window.config.appName) 39 | Cookies.remove('session_id_' + window.config.appName) 40 | }, 41 | 42 | [types.UPDATE_USER](state, { 43 | user 44 | }) { 45 | state.user = user 46 | } 47 | } 48 | 49 | // actions 50 | export const actions = { 51 | saveToken({ 52 | commit, 53 | dispatch 54 | }, payload) { 55 | commit(types.SAVE_TOKEN, payload) 56 | }, 57 | 58 | async fetchUser({ 59 | commit 60 | }) { 61 | try { 62 | const { 63 | data 64 | } = await axios.get('/' + window.config.appName + '/api/user') 65 | commit(types.FETCH_USER_SUCCESS, { 66 | user: data 67 | }) 68 | } catch (e) { 69 | commit(types.FETCH_USER_FAILURE) 70 | } 71 | }, 72 | 73 | async updateUser({ 74 | commit 75 | }, payload) { 76 | commit(types.UPDATE_USER, payload) 77 | }, 78 | 79 | async logout({ 80 | commit 81 | }) { 82 | try { 83 | await axios.get('/' + window.config.appName + '/api/logout') 84 | this.$router.push({ name: 'login' }) 85 | } catch (e) {} 86 | 87 | commit(types.LOGOUT) 88 | } 89 | 90 | } 91 | 92 | // getters 93 | export const getters = { 94 | authUser: state => state.user, 95 | authToken: state => state.token, 96 | authCheck: state => state.user !== null 97 | } 98 | -------------------------------------------------------------------------------- /resources/assets/js/store/modules/brand.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import * as types from '../mutation-types' 3 | 4 | // state 5 | export const state = { 6 | brand: null, 7 | brands: null 8 | } 9 | 10 | // mutations 11 | export const mutations = { 12 | [types.FETCH_BRAND_SUCCESS](state, { 13 | brand 14 | }) { 15 | state.brand = brand 16 | }, 17 | 18 | [types.FETCH_BRAND_FAILURE](state) { 19 | }, 20 | 21 | [types.UPDATE_BRAND](state, { 22 | brand 23 | }) { 24 | state.brand = brand 25 | } 26 | } 27 | 28 | // actions 29 | export const actions = { 30 | 31 | async fetchBrand({ 32 | commit 33 | }) { 34 | try { 35 | const { 36 | data 37 | } = await axios.get('/api/brand') 38 | 39 | commit(types.FETCH_BRAND_SUCCESS, { 40 | brand: data 41 | }) 42 | } catch (e) { 43 | commit(types.FETCH_BRAND_FAILURE) 44 | } 45 | }, 46 | 47 | async updateBrand({ 48 | commit 49 | }, payload) { 50 | commit(types.UPDATE_BRAND, payload) 51 | }, 52 | } 53 | 54 | // getters 55 | export const getters = { 56 | brand: state => state.brand, 57 | } 58 | -------------------------------------------------------------------------------- /resources/assets/js/store/modules/message.js: -------------------------------------------------------------------------------- 1 | import * as types from '../mutation-types' 2 | 3 | // state 4 | export const state = { 5 | type: '', 6 | title: '', 7 | text: '', 8 | modal: false, 9 | show: false 10 | } 11 | 12 | // mutations 13 | export const mutations = { 14 | [types.RESPONSE_MSG] (state, payload) { 15 | Object.assign(state, { ...payload, show: true }) 16 | }, 17 | [types.CLEAR_MSG] (state) { 18 | Object.assign(state, { type: '', text: '', title: '', modal: false, show: false }) 19 | } 20 | } 21 | 22 | // actions 23 | export const actions = { 24 | responseMessage ({ commit, state }, payload) { 25 | commit(types.RESPONSE_MSG, payload) 26 | if (!state.modal) { 27 | setTimeout(() => { commit(types.CLEAR_MSG) }, 6500) 28 | } 29 | }, 30 | clearMessage ({ commit }) { 31 | commit(types.CLEAR_MSG) 32 | } 33 | } 34 | 35 | // getters 36 | export const getters = { 37 | responseMessage: state => { 38 | return { ...state } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /resources/assets/js/store/mutation-types.js: -------------------------------------------------------------------------------- 1 | // auth.js 2 | export const LOGOUT = 'LOGOUT' 3 | export const SAVE_TOKEN = 'SAVE_TOKEN' 4 | export const FETCH_USER = 'FETCH_USER' 5 | export const FETCH_USER_SUCCESS = 'FETCH_USER_SUCCESS' 6 | export const FETCH_USER_FAILURE = 'FETCH_USER_FAILURE' 7 | export const UPDATE_USER = 'UPDATE_USER' 8 | 9 | // feedback.js 10 | export const RESPONSE_MSG = 'RESPONSE_MSG' 11 | export const CLEAR_MSG = 'CLEAR_MSG' 12 | 13 | // brand.js 14 | export const FETCH_BRAND = 'FETCH_BRAND' 15 | export const FETCH_BRAND_SUCCESS = 'FETCH_BRAND_SUCCESS' 16 | export const FETCH_BRAND_FAILURE = 'FETCH_BRAND_FAILURE' 17 | export const UPDATE_BRAND = 'UPDATE_BRAND' 18 | export const FETCH_BRANDS = 'FETCH_BRANDS' 19 | export const FETCH_BRANDS_SUCCESS = 'FETCH_BRANDS_SUCCESS' 20 | export const FETCH_BRANDS_FAILURE = 'FETCH_BRANDS_FAILURE' 21 | -------------------------------------------------------------------------------- /resources/assets/stylus/app.styl: -------------------------------------------------------------------------------- 1 | // @import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons') 2 | @import '~vuetify/src/stylus/main' 3 | @require '~vuetify/src/stylus/settings/_colors' 4 | 5 | a 6 | cursor: pointer 7 | text-decoration: none 8 | 9 | &:hover 10 | text-decoration: underline 11 | 12 | .invalid-feedback 13 | color: $red.accent-2 14 | margin-top: -20px 15 | 16 | .card 17 | .snack__content 18 | max-width: 100vw 19 | min-width: 100vw 20 | -------------------------------------------------------------------------------- /sessions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/sessions/.gitkeep -------------------------------------------------------------------------------- /static/403.html: -------------------------------------------------------------------------------- 1 | 403 2 | -------------------------------------------------------------------------------- /static/404.html: -------------------------------------------------------------------------------- 1 | 404 2 | -------------------------------------------------------------------------------- /static/500.html: -------------------------------------------------------------------------------- 1 | 500 2 | -------------------------------------------------------------------------------- /static/503.html: -------------------------------------------------------------------------------- 1 |

Temporarily down for maintenance

-------------------------------------------------------------------------------- /static/css/calendar.css: -------------------------------------------------------------------------------- 1 | .calendar{z-index:2000;position:relative;display:none;background:#fff;border:2px solid #000;font-size:11px;color:#000;cursor:default;font-family:Arial,Helvetica,sans-serif; 2 | border-radius: 10px; 3 | -moz-border-radius: 10px; 4 | -webkit-border-radius: 10px; 5 | }.calendar table{margin:0px;font-size:11px;color:#000;cursor:default;font-family:tahoma,verdana,sans-serif;}.calendar .button{text-align:center;padding:1px;color:#fff;background:#000;}.calendar .nav{background:#000;color:#fff}.calendar thead .title{font-weight:bold;padding:1px;background:#000;color:#fff;text-align:center;}.calendar thead .name{padding:2px;text-align:center;background:#bbb;}.calendar thead .weekend{color:#f00;}.calendar thead .hilite {background-color:#666;}.calendar thead .active{padding:2px 0 0 2px;background-color:#c4c0b8;}.calendar tbody .day{width:2em;text-align:right;padding:2px 4px 2px 2px;}.calendar tbody .day.othermonth{color:#aaa;}.calendar tbody .day.othermonth.oweekend{color:#faa;}.calendar table .wn{padding:2px 3px 2px 2px;background:#bbb;}.calendar tbody .rowhilite td{background:#ddd;}.calendar tbody td.hilite{background:#bbb;}.calendar tbody td.active{background:#bbb;}.calendar tbody td.selected{font-weight:bold;background:#ddd;}.calendar tbody td.weekend{color:#f00;}.calendar tbody td.today{font-weight:bold;color:#00f;}.calendar tbody .disabled{color:#999;}.calendar tbody .emptycell{visibility:hidden;}.calendar tbody .emptyrow{display:none;}.calendar tfoot .ttip{background:#bbb;padding:1px;background:#000;color:#fff;text-align:center;}.calendar tfoot .hilite{background:#ddd;}.calendar tfoot .active{}.calendar .combo{position:absolute;display:none;width:4em;top:0;left:0;cursor:default;background:#e4e0d8;padding:1px;z-index:2001;}.calendar .combo .label,.calendar .combo .label-IEfix{text-align:center;padding:1px;}.calendar .combo .label-IEfix{width:4em;}.calendar .combo .active{background:#c4c0b8;}.calendar .combo .hilite{background:#048;color:#fea;}.calendar td.time{padding:1px 0;text-align:center;background-color:#bbb;}.calendar td.time .hour,.calendar td.time .minute,.calendar td.time .ampm{padding:0 3px 0 4px;font-weight:bold;}.calendar td.time .ampm{text-align:center;}.calendar td.time .colon{padding:0 2px 0 3px;font-weight:bold;}.calendar td.time span.hilite{}.calendar td.time span.active{border-color:#f00;background-color:#000;color:#0f0;}.hour,.minute{font-size:2em;} 6 | 7 | #CP_hourcont{z-index:2000;padding:0;position:absolute;border:1px dashed #666;background-color:#eee;display:none;}#CP_minutecont{z-index:2000;background-color:#ddd;padding:1px;position:absolute;width:45px;display:none;}.floatleft{float:left;}.CP_hour{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:35px;}.CP_minute{z-index:2000;padding:1px;font-family:Arial,Helvetica,sans-serif;font-size:9px;white-space:nowrap;cursor:pointer;width:auto;}.CP_over{background-color:#fff;z-index:2000} 8 | -------------------------------------------------------------------------------- /static/css/web2py-bootstrap3.css: -------------------------------------------------------------------------------- 1 | div.w2p_flash { 2 | background-image: none; 3 | border-radius: 4px; 4 | -o-border-radius: 4px; 5 | -moz-border-radius: 4px; 6 | -webkit-border-radius: 4px; 7 | color: #333; 8 | font-weight: 400; 9 | min-width: 28px; 10 | max-width: 300px; 11 | opacity: 1; 12 | vertical-align: baseline; 13 | right: auto; 14 | border-width: 1px; 15 | margin: 0 0 20px; 16 | padding: 15px 35px 15px 15px; 17 | } 18 | div.w2p_flash.alert:hover { 19 | opacity: 1; 20 | } 21 | .ie-lte8 div.w2p_flash { 22 | filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0); 23 | } 24 | .ie-lte8 div.w2p_flash:hover { 25 | filter: alpha(opacity=25); 26 | } 27 | .main-container { 28 | margin-top: 20px; 29 | } 30 | 31 | div.error { 32 | width: auto; 33 | background: transparent; 34 | border: none; 35 | background-image: none; 36 | color: red; 37 | display: inline-block; 38 | padding: 5px; 39 | } 40 | div.w2p_flash.alert { 41 | display: none; 42 | position: fixed; 43 | top: 70px; 44 | right: 75px; 45 | cursor: pointer; 46 | z-index: 1000; 47 | background-color: #f9edbe; 48 | border-color: #f0c36d; 49 | } 50 | .w2p-toolbar-hidden { 51 | margin: 10px; 52 | } 53 | ul.w2p_list { 54 | margin-left: 0; 55 | padding-left: 0; 56 | } 57 | .w2p_list li { 58 | margin-bottom: 6px; 59 | } 60 | .w2p_list li input { 61 | display: inline-block; 62 | width: 85%; 63 | margin-right: 4px; 64 | } 65 | .w2p_list li a { 66 | margin-bottom: 2px; 67 | } 68 | div[id^=_autocomplete_] { 69 | margin-top: -10px; 70 | z-index: 1; 71 | } 72 | select.autocomplete { 73 | display: block; 74 | font-size: 14px; 75 | line-height: 1.428571429; 76 | color: #555; 77 | vertical-align: middle; 78 | background-color: #fff; 79 | background-image: none; 80 | border: 1px solid #ccc; 81 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 82 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 83 | -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 84 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 85 | border-color: #428bca; 86 | padding: 6px 12px; 87 | } 88 | #web2py-logo { 89 | color: #c6cecc; 90 | } 91 | #web2py-logo b { 92 | display: inline-block; 93 | margin-top: -1px; 94 | } 95 | #web2py-logo b>span { 96 | font-size: 22px; 97 | color: #FFF; 98 | } 99 | #web2py-logo:hover { 100 | color: #FFF; 101 | } 102 | .footer > .container-fluid { 103 | padding-left: 15px; 104 | padding-right: 15px; 105 | margin: 20px; 106 | } 107 | .background { 108 | background: url(../images/background.jpg) no-repeat center center; 109 | } 110 | body { 111 | padding-top: 60px; 112 | margin-bottom: 60px; 113 | } 114 | header { 115 | -webkit-box-shadow: 0 0 8px 2px #000; 116 | -moz-box-shadow: 0 0 8px 2px #000; 117 | box-shadow: 0 0 8px 2px #000; 118 | margin-bottom: 10px; 119 | } 120 | html { 121 | position: relative; 122 | min-height: 100%; 123 | } 124 | .footer { 125 | position: absolute; 126 | bottom: 0; 127 | width: 100%; 128 | height: 60px; 129 | background: #333; 130 | color: #aaa; 131 | } 132 | header h1 { 133 | color: #FFF!important; 134 | text-shadow: 0 0 7px #000; 135 | } 136 | header .jumbotron { 137 | background-color: transparent; 138 | } 139 | .w2p_flash { 140 | opacity: 0.9!important; 141 | right: 100px; 142 | } 143 | .right { 144 | float: right; 145 | text-align: right; 146 | } 147 | .left { 148 | float: left; 149 | text-align: left; 150 | } 151 | .center { 152 | width: 100%; 153 | text-align: center; 154 | vertical-align: middle; 155 | } 156 | td.w2p_fw { 157 | padding-bottom: 1px; 158 | } 159 | td.w2p_fl { 160 | text-align: left; 161 | } 162 | td.w2p_fl, 163 | td.w2p_fw { 164 | padding-right: 7px; 165 | } 166 | td.w2p_fl, 167 | td.w2p_fc { 168 | padding-top: 4px; 169 | } 170 | div.w2p_export_menu { 171 | margin: 5px 0; 172 | } 173 | div.w2p_export_menu a, 174 | div.w2p_wiki_tags a, 175 | div.w2p_cloud a { 176 | margin-left: 5px; 177 | padding: 2px 5px; 178 | } 179 | #submit_record__row td { 180 | padding-top: .5em; 181 | } 182 | div.error_wrapper { 183 | display: block; 184 | } 185 | .copyright { 186 | float: left; 187 | } 188 | #poweredBy { 189 | float: right; 190 | } 191 | .web2py_grid tbody td { 192 | vertical-align: middle; 193 | padding: 2px 5px; 194 | } 195 | .web2py_grid thead th, 196 | .web2py_grid tfoot td { 197 | background-color: #EAEAEA; 198 | padding: 10px 5px; 199 | } 200 | .web2py_grid tr.odd { 201 | background-color: #F9F9F9; 202 | } 203 | .web2py_grid tr:hover { 204 | background-color: #F5F5F5; 205 | } 206 | .web2py_console form { 207 | width: 100%; 208 | display: inline; 209 | vertical-align: middle; 210 | margin: 0 0 0 5px; 211 | } 212 | .web2py_console form select { 213 | margin: 0; 214 | } 215 | .web2py_search_actions { 216 | float: left; 217 | text-align: left; 218 | width: 100%; 219 | } 220 | .web2py_grid .row_buttons { 221 | min-height: 25px; 222 | vertical-align: middle; 223 | } 224 | .web2py_grid .row_buttons a { 225 | margin: 3px; 226 | } 227 | .web2py_grid .row_buttons a, 228 | .web2py_paginator ul li a, 229 | .web2py_search_actions a, 230 | .web2py_console input[type=submit], 231 | .web2py_console input[type=button], 232 | .web2py_console button { 233 | line-height: 20px; 234 | margin-right: 2px; 235 | display: inline-block; 236 | padding: 6px 12px; 237 | } 238 | .web2py_counter { 239 | margin-top: 5px; 240 | margin-right: 2px; 241 | width: 35%; 242 | float: right; 243 | text-align: right; 244 | } 245 | .web2py_table { 246 | clear: both; 247 | display: block; 248 | } 249 | .web2py_paginator { 250 | text-align: right; 251 | background-color: #f2f2f2; 252 | padding: 5px; 253 | } 254 | .web2py_paginator ul { 255 | list-style-type: none; 256 | margin: 0; 257 | padding: 0; 258 | } 259 | .web2py_paginator .current { 260 | font-weight: 700; 261 | } 262 | .web2py_breadcrumbs ul { 263 | list-style: none; 264 | margin-bottom: 18px; 265 | } 266 | li.w2p_grid_breadcrumb_elem { 267 | display: inline-block; 268 | } 269 | .web2py_console input, 270 | .web2py_console select, 271 | .web2py_console a { 272 | margin: 2px; 273 | padding: 6px 12px; 274 | } 275 | #wiki_page_body { 276 | width: 600px; 277 | height: auto; 278 | min-height: 400px; 279 | } 280 | .ie-lte7 .topbar .container { 281 | z-index: 2; 282 | } 283 | .ie9 #w2p_query_panel { 284 | padding-bottom: 2px; 285 | } 286 | .web2py_console .form-control { 287 | width: 20%; 288 | display: inline; 289 | height: 32px; 290 | } 291 | .web2py_console #w2p_keywords { 292 | width: 50%; 293 | } 294 | .web2py_search_actions a, 295 | .web2py_console input[type=submit], 296 | .web2py_console input[type=button], 297 | .web2py_console button { 298 | padding: 6px 12px; 299 | } 300 | td.w2p_fl, 301 | td.w2p_fw, 302 | td.w2p_fc, 303 | #web2py_user_form td, 304 | .web2py_grid .web2py_form td { 305 | vertical-align: top; 306 | } 307 | #auth_user_remember__row label, 308 | .web2py_paginator ul li { 309 | display: inline; 310 | } 311 | .web2py_grid, 312 | .web2py_grid table { 313 | width: 100%; 314 | } 315 | input[type=checkbox], input[type=radio] { 316 | margin: 4px 4px 0 0; 317 | } 318 | -------------------------------------------------------------------------------- /static/css/web2py-bootstrap4.css: -------------------------------------------------------------------------------- 1 | div.w2p_flash { 2 | background-image: none; 3 | border-radius: 4px; 4 | -o-border-radius: 4px; 5 | -moz-border-radius: 4px; 6 | -webkit-border-radius: 4px; 7 | color: #333; 8 | font-weight: 400; 9 | min-width: 28px; 10 | max-width: 300px; 11 | opacity: 1; 12 | vertical-align: baseline; 13 | right: auto; 14 | border-width: 1px; 15 | margin: 0 0 20px; 16 | padding: 15px 35px 15px 15px; 17 | } 18 | div.w2p_flash.alert:hover { 19 | opacity: 1; 20 | } 21 | .ie-lte8 div.w2p_flash { 22 | filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0); 23 | } 24 | .ie-lte8 div.w2p_flash:hover { 25 | filter: alpha(opacity=25); 26 | } 27 | .main-container { 28 | margin-top: 20px; 29 | } 30 | 31 | div.error { 32 | width: auto; 33 | background: transparent; 34 | border: none; 35 | background-image: none; 36 | color: red; 37 | display: inline-block; 38 | padding: 5px; 39 | } 40 | div.w2p_flash.alert { 41 | display: none; 42 | position: fixed; 43 | top: 70px; 44 | right: 75px; 45 | cursor: pointer; 46 | z-index: 1000; 47 | background-color: #f9edbe; 48 | border-color: #f0c36d; 49 | } 50 | .w2p-toolbar-hidden { 51 | margin: 10px; 52 | } 53 | ul.w2p_list { 54 | margin-left: 0; 55 | padding-left: 0; 56 | } 57 | .w2p_list li { 58 | margin-bottom: 6px; 59 | } 60 | .w2p_list li input { 61 | display: inline-block; 62 | width: 85%; 63 | margin-right: 4px; 64 | } 65 | .w2p_list li a { 66 | margin-bottom: 2px; 67 | } 68 | div[id^=_autocomplete_] { 69 | margin-top: -10px; 70 | z-index: 1; 71 | } 72 | select.autocomplete { 73 | display: block; 74 | font-size: 14px; 75 | line-height: 1.428571429; 76 | color: #555; 77 | vertical-align: middle; 78 | background-color: #fff; 79 | background-image: none; 80 | border: 1px solid #ccc; 81 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 82 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 83 | -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 84 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 85 | border-color: #428bca; 86 | padding: 6px 12px; 87 | } 88 | #web2py-logo { 89 | color: #c6cecc; 90 | } 91 | #web2py-logo b { 92 | display: inline-block; 93 | margin-top: -1px; 94 | } 95 | #web2py-logo b>span { 96 | font-size: 22px; 97 | color: #FFF; 98 | } 99 | #web2py-logo:hover { 100 | color: #FFF; 101 | } 102 | .footer > .container-fluid { 103 | padding-left: 15px; 104 | padding-right: 15px; 105 | margin: 20px; 106 | } 107 | .background { 108 | background: url(../images/background.jpg) no-repeat center center; 109 | } 110 | body { 111 | margin-bottom: 60px; 112 | } 113 | header { 114 | -webkit-box-shadow: 0 0 8px 2px #000; 115 | -moz-box-shadow: 0 0 8px 2px #000; 116 | box-shadow: 0 0 8px 2px #000; 117 | margin-bottom: 10px; 118 | } 119 | html { 120 | position: relative; 121 | min-height: 100%; 122 | } 123 | .footer { 124 | position: absolute; 125 | bottom: 0; 126 | width: 100%; 127 | height: 60px; 128 | background: #f7f7f7; 129 | } 130 | header h1 { 131 | color: #FFF!important; 132 | text-shadow: 0 0 7px #000; 133 | } 134 | header .jumbotron { 135 | background-color: transparent; 136 | } 137 | .w2p_flash { 138 | opacity: 0.9!important; 139 | right: 100px; 140 | } 141 | .right { 142 | float: right; 143 | text-align: right; 144 | } 145 | .left { 146 | float: left; 147 | text-align: left; 148 | } 149 | .center { 150 | width: 100%; 151 | text-align: center; 152 | vertical-align: middle; 153 | } 154 | td.w2p_fw { 155 | padding-bottom: 1px; 156 | } 157 | td.w2p_fl { 158 | text-align: left; 159 | } 160 | td.w2p_fl, 161 | td.w2p_fw { 162 | padding-right: 7px; 163 | } 164 | td.w2p_fl, 165 | td.w2p_fc { 166 | padding-top: 4px; 167 | } 168 | div.w2p_export_menu { 169 | margin: 5px 0; 170 | } 171 | div.w2p_export_menu a, 172 | div.w2p_wiki_tags a, 173 | div.w2p_cloud a { 174 | margin-left: 5px; 175 | padding: 2px 5px; 176 | } 177 | #submit_record__row td { 178 | padding-top: .5em; 179 | } 180 | div.error_wrapper { 181 | display: block; 182 | } 183 | .copyright { 184 | float: left; 185 | } 186 | #poweredBy { 187 | float: right; 188 | } 189 | .web2py_grid tbody td { 190 | vertical-align: middle; 191 | padding: 2px 5px; 192 | } 193 | .web2py_grid thead th, 194 | .web2py_grid tfoot td { 195 | background-color: #EAEAEA; 196 | padding: 10px 5px; 197 | } 198 | .web2py_grid tr.odd { 199 | background-color: #F9F9F9; 200 | } 201 | .web2py_grid tr:hover { 202 | background-color: #F5F5F5; 203 | } 204 | .web2py_console form { 205 | width: 100%; 206 | display: inline; 207 | vertical-align: middle; 208 | margin: 0 0 0 5px; 209 | } 210 | .web2py_console form select { 211 | margin: 0; 212 | } 213 | .web2py_search_actions { 214 | float: left; 215 | text-align: left; 216 | width: 100%; 217 | } 218 | .web2py_grid .row_buttons { 219 | min-height: 25px; 220 | vertical-align: middle; 221 | } 222 | .web2py_grid .row_buttons a { 223 | margin: 3px; 224 | } 225 | .web2py_grid .row_buttons a, 226 | .web2py_paginator ul li a, 227 | .web2py_search_actions a, 228 | .web2py_console input[type=submit], 229 | .web2py_console input[type=button], 230 | .web2py_console button { 231 | line-height: 20px; 232 | margin-right: 2px; 233 | display: inline-block; 234 | padding: 6px 12px; 235 | } 236 | .web2py_counter { 237 | margin-top: 5px; 238 | margin-right: 2px; 239 | width: 35%; 240 | float: right; 241 | text-align: right; 242 | } 243 | .web2py_table { 244 | clear: both; 245 | display: block; 246 | } 247 | .web2py_paginator { 248 | text-align: right; 249 | background-color: #f2f2f2; 250 | padding: 5px; 251 | } 252 | .web2py_paginator ul { 253 | list-style-type: none; 254 | margin: 0; 255 | padding: 0; 256 | } 257 | .web2py_paginator .current { 258 | font-weight: 700; 259 | } 260 | .web2py_breadcrumbs ul { 261 | list-style: none; 262 | margin-bottom: 18px; 263 | } 264 | li.w2p_grid_breadcrumb_elem { 265 | display: inline-block; 266 | } 267 | .web2py_console input, 268 | .web2py_console select, 269 | .web2py_console a { 270 | margin: 2px; 271 | padding: 6px 12px; 272 | } 273 | #wiki_page_body { 274 | width: 600px; 275 | height: auto; 276 | min-height: 400px; 277 | } 278 | .ie-lte7 .topbar .container { 279 | z-index: 2; 280 | } 281 | .ie9 #w2p_query_panel { 282 | padding-bottom: 2px; 283 | } 284 | .web2py_console .form-control { 285 | width: 20%; 286 | display: inline; 287 | height: 32px; 288 | } 289 | .web2py_console #w2p_keywords { 290 | width: 50%; 291 | } 292 | .web2py_search_actions a, 293 | .web2py_console input[type=submit], 294 | .web2py_console input[type=button], 295 | .web2py_console button { 296 | padding: 6px 12px; 297 | } 298 | td.w2p_fl, 299 | td.w2p_fw, 300 | td.w2p_fc, 301 | #web2py_user_form td, 302 | .web2py_grid .web2py_form td { 303 | vertical-align: top; 304 | } 305 | #auth_user_remember__row label, 306 | .web2py_paginator ul li { 307 | display: inline; 308 | } 309 | .web2py_grid, 310 | .web2py_grid table { 311 | width: 100%; 312 | } 313 | input[type=checkbox], input[type=radio] { 314 | margin: 4px 4px 0 0; 315 | } 316 | -------------------------------------------------------------------------------- /static/css/web2py.css: -------------------------------------------------------------------------------- 1 | /** these MUST stay **/ 2 | a {text-decoration:none; white-space:nowrap} 3 | a:hover {text-decoration:underline} 4 | a.button {text-decoration:none} 5 | h1,h2,h3,h4,h5,h6 {margin:0.5em 0 0.25em 0; display:block; 6 | font-family:Helvetica} 7 | h1 {font-size:4.00em} 8 | h2 {font-size:3.00em} 9 | h3 {font-size:2.00em} 10 | h4 {font-size:1.50em} 11 | h5 {font-size:1.25em} 12 | h6 {font-size:1.12em} 13 | th,label {font-weight:bold; white-space:nowrap;} 14 | td,th {text-align:left; padding:2px 5px 2px 5px} 15 | th {vertical-align:middle; border-right:1px solid white} 16 | td {vertical-align:top} 17 | form table tr td label {text-align:left} 18 | p,table,ol,ul {padding:0; margin: 0.75em 0} 19 | p {text-align:justify} 20 | ol, ul {list-style-position:outside; margin-left:2em} 21 | li {margin-bottom:0.5em} 22 | span,input,select,textarea,button,label,a {display:inline} 23 | img {border:0} 24 | blockquote,blockquote p,p blockquote { 25 | font-style:italic; margin:0.5em 30px 0.5em 30px; font-size:0.9em} 26 | i,em {font-style:italic} 27 | strong {font-weight:bold} 28 | small {font-size:0.8em} 29 | code {font-family:Courier} 30 | textarea {width:100%} 31 | video {width:400px} 32 | audio {width:200px} 33 | [type="text"], [type="password"], select { 34 | margin-right: 5px; width: 300px; 35 | } 36 | .w2p_hidden {display:none;visibility:visible} 37 | .right {float:right; text-align:right} 38 | .left {float:left; text-align:left} 39 | .center {width:100%; text-align:center; vertical-align:middle} 40 | /** end **/ 41 | 42 | /* Sticky footer begin */ 43 | 44 | .main { 45 | padding:20px 0 50px 0; 46 | } 47 | 48 | .footer,.push { 49 | height:6em; 50 | padding:1em 0; 51 | clear:both; 52 | } 53 | 54 | .footer-content {position:relative; bottom:-4em; width:100%} 55 | 56 | .auth_navbar { 57 | white-space:nowrap; 58 | } 59 | 60 | /* Sticky footer end */ 61 | 62 | .footer { 63 | border-top:1px #DEDEDE solid; 64 | } 65 | .header { 66 | /* background:; */ 67 | } 68 | 69 | 70 | fieldset {padding:16px; border-top:1px #DEDEDE solid} 71 | fieldset legend {text-transform:uppercase; font-weight:bold; padding:4px 16px 4px 16px; background:#f1f1f1} 72 | 73 | /* fix ie problem with menu */ 74 | 75 | td.w2p_fw {padding-bottom:1px} 76 | td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top} 77 | td.w2p_fl {text-align:left} 78 | td.w2p_fl, td.w2p_fw {padding-right:7px} 79 | td.w2p_fl,td.w2p_fc {padding-top:4px} 80 | div.w2p_export_menu {margin:5px 0} 81 | div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a {margin-left:5px; padding:2px 5px; background-color:#f1f1f1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} 82 | 83 | /* tr#submit_record__row {border-top:1px solid #E5E5E5} */ 84 | #submit_record__row td {padding-top:.5em} 85 | 86 | /* Fix */ 87 | #auth_user_remember__row label {display:inline} 88 | #web2py_user_form td {vertical-align:top} 89 | 90 | /*********** web2py specific ***********/ 91 | div.w2p_flash { 92 | font-weight:bold; 93 | display:none; 94 | position:fixed; 95 | padding:10px; 96 | top:48px; 97 | right:250px; 98 | min-width:280px; 99 | opacity:0.95; 100 | margin:0px 0px 10px 10px; 101 | vertical-align:middle; 102 | cursor:pointer; 103 | color:#fff; 104 | background-color:#000; 105 | border:2px solid #fff; 106 | border-radius:8px; 107 | -o-border-radius: 8px; 108 | -moz-border-radius:8px; 109 | -webkit-border-radius:8px; 110 | background-image: -webkit-linear-gradient(top,#222,#000); 111 | background-image: -o-linear-gradient(top,#222,#000); 112 | background-image: -moz-linear-gradient(90deg, #222, #000); 113 | background-image: linear-gradient(top,#222,#000); 114 | background-repeat: repeat-x; 115 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 116 | -webkit-font-smoothing: antialiased; 117 | z-index:2000; 118 | } 119 | 120 | div.w2p_flash #closeflash{color:inherit; float:right; margin-left:15px;} 121 | .ie-lte7 div.flash #closeflash 122 | {color:expression(this.parentNode.currentStyle['color']);float:none;position:absolute;right:4px;} 123 | 124 | div.w2p_flash:hover { opacity:0.25; } 125 | 126 | div.error_wrapper {display:block} 127 | div.error { 128 | color:red; 129 | padding:5px; 130 | display:inline-block; 131 | } 132 | 133 | .topbar { 134 | padding:10px 0; 135 | width:100%; 136 | color:#959595; 137 | vertical-align:middle; 138 | padding:auto; 139 | background-image:-khtml-gradient(linear,left top,left bottom,from(#333333),to(#222222)); 140 | background-image:-moz-linear-gradient(top,#333333,#222222); 141 | background-image:-ms-linear-gradient(top,#333333,#222222); 142 | background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#333333),color-stop(100%,#222222)); 143 | background-image:-webkit-linear-gradient(top,#333333,#222222); 144 | background-image:-o-linear-gradient(top,#333333,#222222); 145 | background-image:linear-gradient(top,#333333,#222222); 146 | filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); 147 | -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); 148 | -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); 149 | box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); 150 | } 151 | 152 | .topbar a { 153 | color:#e1e1e1; 154 | } 155 | 156 | #navbar {float:right; padding:5px; /* same as superfish */} 157 | 158 | .statusbar { 159 | background-color:#F5F5F5; 160 | margin-top:1em; 161 | margin-bottom:1em; 162 | padding:.5em 1em; 163 | border:1px solid #ddd; 164 | border-radius:5px; 165 | -moz-border-radius:5px; 166 | -webkit-border-radius:5px; 167 | } 168 | 169 | .breadcrumbs {float:left} 170 | 171 | .copyright {float:left} 172 | #poweredBy {float:right} 173 | 174 | /* #MEDIA QUERIES SECTION */ 175 | 176 | /* 177 | *Grid 178 | * 179 | * The default style for SQLFORM.grid even using jquery-iu or another ui framework 180 | * will look better with the declarations below 181 | * if needed to remove base.css consider keeping these following lines in some css file. 182 | */ 183 | /* .web2py_table {border:1px solid #ccc} */ 184 | .web2py_paginator {} 185 | .web2py_grid {width:100%} 186 | .web2py_grid table {width:100%} 187 | .web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;} 188 | .web2py_grid .web2py_form td {vertical-align: top;} 189 | 190 | .web2py_grid thead th,.web2py_grid tfoot td { 191 | background-color:#EAEAEA; 192 | padding:10px 5px 10px 5px; 193 | } 194 | 195 | .web2py_grid tr.odd {background-color:#F9F9F9} 196 | .web2py_grid tr:hover {background-color:#F5F5F5} 197 | 198 | /* 199 | .web2py_breadcrumbs a { 200 | line-height:20px; margin-right:5px; display:inline-block; 201 | padding:3px 5px 3px 5px; 202 | font-family:'lucida grande',tahoma,verdana,arial,sans-serif; 203 | color:#3C3C3D; 204 | text-shadow:1px 1px 0 #FFFFFF; 205 | white-space:nowrap; overflow:visible; cursor:pointer; 206 | background:#ECECEC; 207 | border:1px solid #CACACA; 208 | -webkit-border-radius:2px; -moz-border-radius:2px; 209 | -webkit-background-clip:padding-box; border-radius:2px; 210 | outline:none; position:relative; zoom:1; *display:inline; 211 | } 212 | */ 213 | 214 | .web2py_console form { 215 | width: 100%; 216 | display: inline; 217 | vertical-align: middle; 218 | margin: 0 0 0 5px; 219 | } 220 | 221 | .web2py_console form select { 222 | margin:0; 223 | } 224 | 225 | .web2py_search_actions { 226 | float:left; 227 | text-align:left; 228 | } 229 | 230 | .web2py_grid .row_buttons { 231 | min-height:25px; 232 | vertical-align:middle; 233 | } 234 | .web2py_grid .row_buttons a { 235 | margin:3px; 236 | } 237 | 238 | .web2py_search_actions { 239 | width:100%; 240 | } 241 | 242 | .web2py_grid .row_buttons a, 243 | .web2py_paginator ul li a, 244 | .web2py_search_actions a, 245 | .web2py_console input[type=submit], 246 | .web2py_console input[type=button], 247 | .web2py_console button { 248 | line-height:20px; 249 | margin-right:2px; display:inline-block; 250 | padding:3px 5px 3px 5px; 251 | } 252 | 253 | .web2py_counter { 254 | margin-top:5px; 255 | margin-right:2px; 256 | width:35%; 257 | float:right; 258 | text-align:right; 259 | } 260 | 261 | /*Fix firefox problem*/ 262 | .web2py_table {clear:both; display:block} 263 | 264 | .web2py_paginator { 265 | padding:5px; 266 | text-align:right; 267 | background-color:#f2f2f2; 268 | 269 | } 270 | .web2py_paginator ul { 271 | list-style-type:none; 272 | margin:0px; 273 | padding:0px; 274 | } 275 | 276 | .web2py_paginator ul li { 277 | display:inline; 278 | } 279 | 280 | .web2py_paginator .current { 281 | font-weight:bold; 282 | } 283 | 284 | .web2py_breadcrumbs ul { 285 | list-style:none; 286 | margin-bottom:18px; 287 | } 288 | 289 | li.w2p_grid_breadcrumb_elem { 290 | display:inline-block; 291 | } 292 | 293 | .web2py_console form { vertical-align: middle; } 294 | .web2py_console input, .web2py_console select, 295 | .web2py_console a { margin: 2px; } 296 | 297 | 298 | #wiki_page_body { 299 | width: 600px; 300 | height: auto; 301 | min-height: 400px; 302 | } 303 | 304 | /* fix some IE problems */ 305 | 306 | .ie-lte7 .topbar .container {z-index:2} 307 | .ie-lte8 div.w2p_flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); } 308 | .ie-lte8 div.w2p_flash:hover {filter:alpha(opacity=25);} 309 | .ie9 #w2p_query_panel {padding-bottom:2px} 310 | 311 | .web2py_console .form-control {width: 20%; display: inline;} 312 | .web2py_console #w2p_keywords {width: 50%;} 313 | .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { padding: 6px 12px; } 314 | -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/background.jpg -------------------------------------------------------------------------------- /static/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/facebook.png -------------------------------------------------------------------------------- /static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/favicon.ico -------------------------------------------------------------------------------- /static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/favicon.png -------------------------------------------------------------------------------- /static/images/gplus-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/gplus-32.png -------------------------------------------------------------------------------- /static/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/images/twitter.png -------------------------------------------------------------------------------- /static/img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/img/favicon-32x32.png -------------------------------------------------------------------------------- /static/img/v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/static/img/v.png -------------------------------------------------------------------------------- /static/js/respond-1.4.2.min.js: -------------------------------------------------------------------------------- 1 | /*! Respond.js v1.4.2: min/max-width media query polyfill 2 | * Copyright 2014 Scott Jehl 3 | * Licensed under MIT 4 | * http://j.mp/respondjs */ 5 | 6 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b 4 | (MIT license) 5 | 6 | Example: 7 | 8 | 9 | 10 | **/ 11 | 12 | jQuery(function(){ 13 | var script_source = jQuery('script[src*="share.js"]').attr('src'); 14 | var params = function(name,default_value) { 15 | var match = RegExp('[?&]' + name + '=([^&]*)').exec(script_source); 16 | return match && decodeURIComponent(match[1].replace(/\+/g, ' '))||default_value; 17 | } 18 | var path = params('static','social'); 19 | var url = encodeURIComponent(window.location.href); 20 | var host = window.location.hostname; 21 | var title = escape(jQuery('title').text()); 22 | var twit = 'http://twitter.com/home?status='+title+'%20'+url; 23 | var facebook = 'http://www.facebook.com/sharer.php?u='+url; 24 | var gplus = 'https://plus.google.com/share?url='+url; 25 | var tbar = '
Share
Share on TwitterShare on facebookShare on Google Plus
'; 26 | // Add the share tool bar. 27 | jQuery('body').append(tbar); 28 | var st = jQuery('#socialdrawer'); 29 | st.css({'opacity':'.7','z-index':'3000','background':'#FFF','border':'solid 1px #666','border-width':' 1px 0 0 1px','height':'20px','width':'40px','position':'fixed','bottom':'0','right':'0','padding':'2px 5px','overflow':'hidden','-webkit-border-top-left-radius':' 12px','-moz-border-radius-topleft':' 12px','border-top-left-radius':' 12px','-moz-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','-webkit-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)'}); 30 | jQuery('#socialdrawer a').css({'float':'left','width':'32px','margin':'3px 2px 2px 2px','padding':'0','cursor':'pointer'}); 31 | jQuery('#socialdrawer span').css({'float':'left','margin':'2px 3px','text-shadow':' 1px 1px 1px #FFF','color':'#444','font-size':'12px','line-height':'1em'}); 32 | jQuery('#socialdrawer img').hide(); 33 | // hover 34 | st.click(function(){ 35 | jQuery(this).animate({height:'40px', width:'160px', opacity: 0.95}, 300); 36 | jQuery('#socialdrawer img').show(); 37 | }); 38 | //leave 39 | st.mouseleave(function(){ 40 | st.animate({height:'20px', width: '40px', opacity: .7}, 300); 41 | jQuery('#socialdrawer img').hide(); 42 | return false; 43 | } ); 44 | }); 45 | -------------------------------------------------------------------------------- /static/js/web2py-bootstrap3.js: -------------------------------------------------------------------------------- 1 | (function($, undefined) { 2 | $.web2py.ajax_fields = function(target) { 3 | /* 4 | *this attaches something to a newly loaded fragment/page 5 | * Ideally all events should be bound to the document, so we can avoid calling 6 | * this over and over... all will be bound to the document 7 | */ 8 | /*adds btn class to buttons*/ 9 | $('button:not([class^="btn"])', target).addClass('btn btn-default'); 10 | $("p.w2p-autocomplete-widget input").addClass('form-control'); 11 | $('form input[type="submit"]:not([class^="btn"]), form input[type="button"]:not([class^="btn"])', target).addClass('btn btn-default'); 12 | /* javascript for PasswordWidget*/ 13 | $('input[type=password][data-w2p_entropy]', target).each(function() { 14 | $.web2py.validate_entropy($(this)); 15 | }); 16 | /* javascript for ListWidget*/ 17 | $('ul.w2p_list', target).each(function() { 18 | function pe(ul, e) { 19 | var new_line = ml(ul); 20 | rel(ul); 21 | if ($(e.target).closest('li').is(':visible')) { 22 | /* make sure we didn't delete the element before we insert after */ 23 | new_line.insertAfter($(e.target).closest('li')); 24 | } else { 25 | /* the line we clicked on was deleted, just add to end of list */ 26 | new_line.appendTo(ul); 27 | } 28 | new_line.find(":text").focus(); 29 | return false; 30 | } 31 | 32 | function rl(ul, e) { 33 | if ($(ul).find('li').length > 1) { 34 | /* only remove if we have more than 1 item so the list is never empty */ 35 | $(e.target).closest('li').remove(); 36 | } 37 | } 38 | 39 | function ml(ul) { 40 | /* clone the first field */ 41 | var line = $(ul).find("li:first").clone(true); 42 | line.find(':text').val(''); 43 | return line; 44 | } 45 | 46 | function rel(ul) { 47 | /* keep only as many as needed*/ 48 | $(ul).find("li").each(function() { 49 | var trimmed = $.trim($(this).find(":text").val()); 50 | if (trimmed == '') $(this).remove(); 51 | else $(this).find(":text").val(trimmed); 52 | }); 53 | } 54 | var ul = this; 55 | $(ul).find(":text").addClass('form-control').wrap("
").after('
').keypress(function(e) { 56 | return (e.which == 13) ? pe(ul, e) : true; 57 | }).next().click(function(e) { 58 | pe(ul, e); 59 | e.preventDefault(); 60 | }).next().click(function(e) { 61 | rl(ul, e); 62 | e.preventDefault(); 63 | }); 64 | }); 65 | } 66 | 67 | $(function() { 68 | $(".nav ul.dropdown-menu").each(function() { 69 | var toggle = jQuery(this).parent(); 70 | if (toggle.parent().hasClass("nav")) { 71 | toggle.attr("data-w2pmenulevel", "l0"); 72 | toggle.children("a") 73 | .addClass("dropdown-toggle") 74 | .append(' ') 75 | .attr("data-toggle", "dropdown"); 76 | } else { 77 | toggle.addClass("dropdown-submenu").removeClass("dropdown"); 78 | }; 79 | }); 80 | }); 81 | 82 | })(jQuery); -------------------------------------------------------------------------------- /static/js/web2py-bootstrap4.js: -------------------------------------------------------------------------------- 1 | (function($, undefined) { 2 | $.web2py.ajax_fields = function(target) { 3 | /* 4 | *this attaches something to a newly loaded fragment/page 5 | * Ideally all events should be bound to the document, so we can avoid calling 6 | * this over and over... all will be bound to the document 7 | */ 8 | /*adds btn class to buttons*/ 9 | $('button:not([class^="btn"])', target).addClass('btn btn-default'); 10 | $("p.w2p-autocomplete-widget input").addClass('form-control'); 11 | $('form input[type="submit"]:not([class^="btn"]), form input[type="button"]:not([class^="btn"])', target).addClass('btn btn-default'); 12 | /* javascript for PasswordWidget*/ 13 | $('input[type=password][data-w2p_entropy]', target).each(function() { 14 | $.web2py.validate_entropy($(this)); 15 | }); 16 | /* javascript for ListWidget*/ 17 | $('ul.w2p_list', target).each(function() { 18 | function pe(ul, e) { 19 | var new_line = ml(ul); 20 | rel(ul); 21 | if ($(e.target).closest('li').is(':visible')) { 22 | /* make sure we didn't delete the element before we insert after */ 23 | new_line.insertAfter($(e.target).closest('li')); 24 | } else { 25 | /* the line we clicked on was deleted, just add to end of list */ 26 | new_line.appendTo(ul); 27 | } 28 | new_line.find(":text").focus(); 29 | return false; 30 | } 31 | 32 | function rl(ul, e) { 33 | if ($(ul).find('li').length > 1) { 34 | /* only remove if we have more than 1 item so the list is never empty */ 35 | $(e.target).closest('li').remove(); 36 | } 37 | } 38 | 39 | function ml(ul) { 40 | /* clone the first field */ 41 | var line = $(ul).find("li:first").clone(true); 42 | line.find(':text').val(''); 43 | return line; 44 | } 45 | 46 | function rel(ul) { 47 | /* keep only as many as needed*/ 48 | $(ul).find("li").each(function() { 49 | var trimmed = $.trim($(this).find(":text").val()); 50 | if (trimmed == '') $(this).remove(); 51 | else $(this).find(":text").val(trimmed); 52 | }); 53 | } 54 | var ul = this; 55 | $(ul).find(":text").addClass('form-control').wrap("
").after('
').keypress(function(e) { 56 | return (e.which == 13) ? pe(ul, e) : true; 57 | }).next().click(function(e) { 58 | pe(ul, e); 59 | e.preventDefault(); 60 | }).next().click(function(e) { 61 | rl(ul, e); 62 | e.preventDefault(); 63 | }); 64 | }); 65 | } 66 | 67 | $(function() { 68 | $(".nav ul.dropdown-menu").each(function() { 69 | var toggle = jQuery(this).parent(); 70 | if (toggle.parent().hasClass("nav")) { 71 | toggle.attr("data-w2pmenulevel", "l0"); 72 | toggle.children("a") 73 | .addClass("dropdown-toggle") 74 | .append(' ') 75 | .attr("data-toggle", "dropdown"); 76 | } else { 77 | toggle.addClass("dropdown-submenu").removeClass("dropdown"); 78 | }; 79 | }); 80 | }); 81 | 82 | })(jQuery); -------------------------------------------------------------------------------- /static/public/lang/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "ok": "Ok", 3 | "close": "Close", 4 | "cancel": "Cancel", 5 | "error_alert_title": "Oops...", 6 | "error_alert_text": "Something went wrong! Please try again.", 7 | "token_expired_alert_title": "Session Expired!", 8 | "token_expired_alert_text": "Please log in again to continue.", 9 | "login": "Log In", 10 | "register": "Register", 11 | "page_not_found": "Page Not Found", 12 | "go_home": "Go Home", 13 | "logout": "Logout", 14 | "email": "Email", 15 | "remember_me": "Remember Me", 16 | "password": "Password", 17 | "forgot_password": "Forgot Your Password?", 18 | "confirm_password": "Confirm Password", 19 | "first_name": "Name", 20 | "toggle_navigation": "Toggle navigation", 21 | "home": "Home", 22 | "you_are_logged_in": "You are logged in!", 23 | "reset_password": "Reset Password", 24 | "send_password_reset_link": "Send Password Reset Link", 25 | "settings": "Settings", 26 | "profile": "Profile", 27 | "your_info": "Your Info", 28 | "info_updated": "Your info has been updated!", 29 | "update": "Update", 30 | "your_password": "Your Password", 31 | "password_updated": "Your password has been updated!", 32 | "new_password": "New Password", 33 | "password_length_hint": "At least 6 characters", 34 | "nav_menu_title": "Application Menu", 35 | "last_name": "Last name", 36 | "reset_code_validation": "Reset Password Code Validation", 37 | "reset_code": "Reset Password Code", 38 | "validate_reset": "Validate Reset Password Code" 39 | } 40 | -------------------------------------------------------------------------------- /uploads/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robertop23/web2py_vuejs_vuetify/0130ee8c279940b027ed63ac102487ca3ad1863b/uploads/.gitkeep -------------------------------------------------------------------------------- /views/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/default/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% 7 | from gluon.contrib.appconfig import AppConfig 8 | myconf = AppConfig() 9 | app_title = myconf.take('app.name') 10 | %} 11 | {%= app_title %} 12 | 13 | 14 | {% 15 | response.files.insert(0,URL('static','public/css/app.css')) 16 | %} 17 | 18 | 19 |
20 | 21 | {%# Global configuration object %} 22 | {% import urllib2 %} 23 | {% import json %} 24 | {% lng_file_url = '{}://{}/{}/static/public/lang/en.json'.format(request.env.wsgi_url_scheme, request.env.http_host, request.application) %} 25 | {% language_file = urllib2.urlopen(lng_file_url).read() %} 26 | {% config = {} %} 27 | {% 28 | config['appName'] = request.application 29 | config['locale'] = T.accepted_language 30 | config['translations'] = json.loads(language_file) 31 | config['appTitle'] = app_title 32 | %} 33 | 34 | 35 | {%# Polyfill some features via polyfill.io %} 36 | {% 37 | polyfills = [ 38 | 'Promise', 39 | 'Object.assign', 40 | 'Object.values', 41 | 'Array.prototype.find', 42 | 'Array.prototype.findIndex', 43 | 'Array.prototype.includes', 44 | 'String.prototype.includes', 45 | 'String.prototype.startsWith', 46 | 'String.prototype.endsWith', 47 | ] 48 | %} 49 | 50 | 51 | {%# Load the application scripts %} 52 | {%if request.is_local:%} 53 | {% 54 | response.files.insert(1,URL('static','public/js/app.js')) 55 | %} 56 | {% else: %} 57 | {% 58 | response.files.insert(1,URL('static','js/manifest.js')) 59 | response.files.insert(2,URL('static','js/vendor.js')) 60 | response.files.insert(3,URL('static','js/app.js')) 61 | %} 62 | {% pass %} 63 | {%response.include_files()%} 64 | 65 | 66 | -------------------------------------------------------------------------------- /views/default/user.html: -------------------------------------------------------------------------------- 1 | {%extend 'layout.html'%} 2 | 3 |

4 | {%=T('Sign Up') if request.args(0) == 'register' else T('Log In') if request.args(0) == 'login' else T(request.args(0).replace('_',' ').title())%} 5 |

6 | 7 |
8 |
9 |
10 | {% 11 | if request.args(0)=='login': 12 | if not 'register' in auth.settings.actions_disabled: 13 | form.add_button(T('Sign Up'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn btn-default') 14 | pass 15 | if not 'request_reset_password' in auth.settings.actions_disabled: 16 | form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn btn-default') 17 | pass 18 | pass 19 | =form 20 | %} 21 |
22 |
23 |
24 | 25 | 26 | {%block page_js%} 27 | 35 | {%end page_js%} 36 | -------------------------------------------------------------------------------- /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[next(iter(response._vars))])%} 11 | {%elif len(response._vars)>1:%} 12 | {%=BEAUTIFY(response._vars)%} 13 | {%pass%} 14 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /views/generic.json: -------------------------------------------------------------------------------- 1 | {%from gluon.serializers import json%}{%=XML(json(response._vars))%} 2 | -------------------------------------------------------------------------------- /views/generic.jsonp: -------------------------------------------------------------------------------- 1 | {% 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | ### 5 | 6 | # security check! This file is an example for a jsonp view. 7 | # it is not safe to use as a generic.jsonp because of security implications. 8 | 9 | if response.view == 'generic.jsonp': 10 | raise HTTP(501,'generic.jsonp disabled for security reasons') 11 | 12 | try: 13 | from gluon.serializers import json 14 | result = "%s(%s)" % (request.vars['callback'], json(response._vars)) 15 | response.write(result, escape=False) 16 | response.headers['Content-Type'] = 'application/jsonp' 17 | except (TypeError, ValueError): 18 | raise HTTP(405, 'JSON serialization error') 19 | except ImportError: 20 | raise HTTP(405, 'JSON not available') 21 | except: 22 | raise HTTP(405, 'JSON error') 23 | %} 24 | -------------------------------------------------------------------------------- /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[next(iter(response._vars))]%}{%else:%}{%=BEAUTIFY(response._vars)%}{%pass%} -------------------------------------------------------------------------------- /views/generic.map: -------------------------------------------------------------------------------- 1 | {%""" 2 | this is an example of usage of google map 3 | the web2py action should be something like: 4 | 5 | def map(): 6 | return dict( 7 | googlemap_key='...', 8 | center_latitude = 41.878, 9 | center_longitude = -87.629, 10 | scale = 7, 11 | maker = lambda point: A(row.id,_href='...') 12 | points = db(db.point).select() where a points have latitute and longitude 13 | ) 14 | 15 | the corresponding views/defaut/map.html should be something like: 16 | 17 | \{\{extend 'layout.html'\}\} 18 |
\{\{include 'generic.map'\}\}
19 | 20 | """%} 21 | 22 | 68 |
69 | 70 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /views/generic.xml: -------------------------------------------------------------------------------- 1 | {%from gluon.serializers import xml%}{%=XML(xml(response._vars,quote=False))%} 2 | -------------------------------------------------------------------------------- /views/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 15 | 16 | {%=response.title or request.application%} 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 30 | 31 | {%include 'web2py_ajax.html'%} 32 | {%block head%}{%end%} 33 | 34 | 35 |
{%=response.flash or ''%}
36 | 37 | 86 | 87 | 88 | {%block header%} 89 | {%end%} 90 | 91 | 92 |
93 |
94 | {%block center%} 95 | {%include%} 96 | {%end%} 97 | {%=response.toolbar() if configuration.get('app.toolbar') else ''%} 98 |
99 |
100 | 101 | {%block footer%} 102 |
103 |
104 | 105 |
106 | {%=T('Powered by')%} 107 | web2py 108 |
109 |
110 |
111 | {%end%} 112 | 113 | 114 | 115 | {%block page_js%}{%end page_js%} 116 | {%if response.google_analytics_id:%} 117 | 118 | 119 | 124 | {%pass%} 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /views/web2py_ajax.html: -------------------------------------------------------------------------------- 1 | 11 | {% 12 | response.files.insert(0,URL('static','js/jquery.js')) 13 | response.files.insert(1,URL('static','css/calendar.css')) 14 | response.files.insert(2,URL('static','js/calendar.js')) 15 | response.files.insert(3,URL('static','js/web2py.js')) 16 | response.include_meta() 17 | response.include_files() 18 | %} 19 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | const mix = require('laravel-mix') 4 | // const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') 5 | 6 | mix 7 | .js('resources/assets/js/app.js', 'static/public/js') 8 | .stylus('resources/assets/stylus/app.styl', 'static/public/css') 9 | .sourceMaps() 10 | .disableNotifications() 11 | .copyDirectory('resources/assets/img', 'static/public/img') 12 | 13 | if (mix.inProduction()) { 14 | mix.version() 15 | 16 | mix.extract([ 17 | 'vue', 18 | 'vform', 19 | 'axios', 20 | 'vuex', 21 | 'vue-i18n', 22 | 'vue-meta', 23 | 'js-cookie', 24 | 'vue-router', 25 | 'vuetify', 26 | 'vee-validate', 27 | 'vuex-router-sync' 28 | ]) 29 | } 30 | 31 | mix.webpackConfig({ 32 | plugins: [ 33 | ], 34 | resolve: { 35 | alias: { 36 | '~': path.join(__dirname, './resources/assets/js') 37 | } 38 | } 39 | }) 40 | --------------------------------------------------------------------------------