Re: [web2py] Re: DAL and schema
On Tuesday, March 27, 2012 5:35:57 PM UTC+7, spyker wrote: On 26 March 2012 20:22, adesst adesantoasman@... wrote: @Johann, i don't know if you would copy paste the diff i've made into PgAdapter, and do some tests and post the results. Pg and Oracle schema works in the same way. I have downloaded and looked at MyDal and the README but I am not sure which 'diff' you refer to. I have looked at your code buit seems a bit risky for my to jump in before I understand fully what you are doing. I will have to spend some time to work through it. I was hoping that you will open a ticket and that the schema-option may become an official part of DAL. Maybe you are working in that direction. Regards Johann -- Because experiencing your loyal love is better than life itself, my lips will praise you. (Psalm 63:3) Sorry about the confusing 'diff', you could check here https://github.com/adesst/web2py, have added postgres. And i did post the issue here https://github.com/web2py/web2py/issues/6 Hope it helps.
[web2py] Re: Validating Registration fields
Thank you so much! That worked like a charm :). I'm guessing this type of construct is valid for other validators as well? On Tuesday, March 27, 2012 5:57:28 PM UTC-7, Anthony wrote: Try IS_EMPTY_OR(IS_IMAGE()) Anthony On Tuesday, March 27, 2012 7:12:45 PM UTC-4, Peter G. wrote: Thanks for the code snippets Anthony--but a minor caveat I didn't realize ahead of time is that the user is free to either upload an image or not. If the user does not upload an image, the IS_IMAGE() validators barks at the user. Is there a easy way of implementing such a logic: if a file is uploaded, check for IS_IMAGE(), otherwise ignore.? On Thursday, March 22, 2012 3:38:01 PM UTC-7, Anthony wrote: On Thursday, March 22, 2012 6:09:25 PM UTC-4, Peter G. wrote: I'm using the auth.settengs.extra_fields to add an extra upload field for the user to upload an avatar, how can I add an IS_IMAGE validator to the upload field so that the user can't upload random files? When you define the field, you can do: Field('avatar', 'upload', requires=IS_IMAGE()) or after the tables have been defined: db.auth_user.avatar.requires = IS_IMAGE() Also, how would I add an IS_ALPHANUMERIC to the built in First name and Last name form fields? Right now there are users registering with names like !@#$%^~ and some such... After the tables have been defined, you can do: db.auth_user.first_name.requires.append(IS_ALPHANUMERIC()) That adds the validator to the existing IS_NOT_EMPTY validator. However, I wouldn't use that validator for names because it doesn't allow valid name characters such as spaces, hyphens, and apostrophes. Anyway, if you prevent fake names with special characters, those users will just create fake names with alphanumeric characters, so either way you don't have a real name. Anthony
[web2py] Re: Modify T() function
Hmm.. I had this idea a long time ago. Never got around to implementing it, though. Here's an email that was sitting in my drafts box for over a year. It's got some additional suggestions, too: The T object and simple internationalization is one of the reasons I chose the Web2Py framework. After toying with it for a bit, I have some suggestions to make it even better: Even the simple Welcome app already has pages of translation strings! How about some tools to organize them? - Optionally hide strings that have already been translated. - Add an optional hint parameter to T(). This string is displayed next to the original string in the admin interface. It simply gives more clues/context for the translation. Example: T(Enter , hint=Noun: also called Return key (not the verb!)) - Add optional translation contexts. These would be useful for grouping strings that belong together, for example those that appear in the same form or page. These could be defined like the authorization decorations over a block of code, or explicitly opened and closed with calls to TCONTEXT(). - Common strings (like yes and no) may end up with multiple contexts--I imagine contexts more like tags. Although the same translation is applied to every context by default, certain contexts could be over-ridden when they don't fit. (For example, contronymshttp://www.rinkworks.com/words/contronyms.shtml may need context-based translation to other languages.) If I end up developing an app that needs heavy-duty localization, I will probably end up implementing some of the ideas from above. John-Kim On Thursday, March 22, 2012 10:18:16 PM UTC+9, Kalpa Welivitigoda wrote: Hi, I am working on a translation enhancement project on sahana-eden[1]. sahana-eden uses the translation feature of web2py. Is it possible to have a modified T() function so that the developer can leave a comment for the translator, for example T(This is a SAMPLE, keep SAMPLE as it is) where the second argument is the comment. Or is there any other mechanism in web2py to accomplish this task. Further the language file in /applications/application name/languages/.py should be in the format source string: target string: comment I may be able to modify my local web2py so that this is accomplished. Rather I would like to see this upstream as for 1) sahana-eden is deployed with web2py framework so it needs it's core functions build into it (patching is not so nice) 2) there will be many other projects existing or about to deploy on web2py which will be benefited with this method. The whole idea is that the translator has more information that will ultimately help to end in a better translation. I'm willing to contribute in code if the developers want me to. [1] eden.sahanafoundation.org Thank you
Re: [web2py] how to redirect from ajax
On your javascript code you can do. location = url http://zerp.ly/rochacbruno Em 28/03/2012 01:01, weheh richard_gor...@verizon.net escreveu: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
[web2py] Viewing tickets outside of admin
Hi, Lately, I've been using pythonanywhere to work on my pet project together with Dropbox. It's very fun, as it allows me to test all kinds of access (mobile, desktop), various environments (work, home), os's etc. Obviously I'm unable to access the admin as I'm not at a local machine and I don't want to enable remote access to the admin. I was wondering since I'm using Dropbx to sync my files, I do have local access to the ticket files themselves. Is there some parser that would allow me to look at the tickets without needing to run web2py locally to have access to the admin? I would even imagine a hook that would automagically parse the ticket into text form and save a text version of it. Thanks, Tsvi
[web2py] Re: Validating Registration fields
On Wednesday, March 28, 2012 5:34:05 AM UTC-4, Peter G. wrote: Thank you so much! That worked like a charm :). I'm guessing this type of construct is valid for other validators as well? Yes, it's documented here: http://web2py.com/books/default/chapter/29/7#Validators
[web2py] Re: Form validation on passwords
I tried your code, and it works fine for me. However, the password Testpwd should actually result in an error because the IS_STRONG() validator defaults to number=1 (i.e., at least one number in the password), and you didn't change that default. So, you should get an error on the password field. If the error isn't showing up, perhaps there's a problem with your view code. Have you created a custom form in the HTML? Anthony On Tuesday, March 27, 2012 11:53:37 PM UTC-4, cyan wrote: Thanks for the pointer. Anthony. So now I have the following in my controller: def register(): form = SQLFORM.factory( Field('email', requires=[IS_NOT_EMPTY(), IS_EMAIL(forced= '^.*\.edu(|\..*)$', error_message='email must be .edu address')]), Field('pwd', requires=[IS_NOT_EMPTY(), IS_STRONG(min=6, special=0, upper= 1, error_message='minimum 6 characters, and at least 1 uppercase character' ), CRYPT()]), Field('re_pwd', requires=IS_EXPR('value==%s' % repr(request.vars.get( 'pwd', None)), error_message='passwords do not match'))) if form.process().accepted: session.email = form.vars.email session.pwd = form.vars.pwd redirect(URL('registered')) return dict(form=form) And, for testing, I input the following: a...@abc.edu Testpwd Testpwd I didn't get any error messages, so presumably all three validations went fine. However, using a debugger revealed that form.accepted is still None after calling process() on the form. I wonder what went wrong here. Thanks. On Tuesday, March 27, 2012 5:54:02 PM UTC-4, Anthony wrote: Here's how auth.register() does it (slightly edited): requires=IS_EXPR('value==%s' % repr(request.vars.get('password', None)), error_message=Password fields don't match) Anthony On Tuesday, March 27, 2012 5:40:29 PM UTC-4, cyan wrote: Hi group, How do I enforce some simple validation for passwords matching on a form in a controller? All I want to do is to check the second password is the same as the first one, and here is some code I've come up so far: form = SQLFORM.factory( Field('email', requires=IS_NOT_EMPTY()), Field('pwd', requires=[IS_NOT_EMPTY(), IS_STRONG(min=6, special=0,upper =1), CRYPT()]), Field('re_pwd', requires=IS_MATCH(???))) I am attempting to use the validator 'IS_MATCH()' for the second password, but not sure how I reference the the input in the first password field of the same form. Any suggestion would be welcome. Thanks.
[web2py] Re: New Google Groups functionality
On question posts, if you're using the web interface, you can now vote responses to the question up or down (the best response will be displayed on top). You'll see a green up arrow and red down arrow at the bottom of each response (except for your own). On Tuesday, March 27, 2012 4:50:49 PM UTC-4, Anthony wrote: Google Groups has added some new functionality that enables us to distinguish between discussion, question, and announcement posts. If you use the (new) web interface to make a post ( https://groups.google.com/forum/?fromgroups#!forum/web2py), it will now default to a question post. However, you can easily change that to discussion or announcement once you are creating the post. It is also now possible to add a comma separated list of tags to each post. Enjoy. Anthony
[web2py] Re: how to redirect from ajax
I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? On Wednesday, March 28, 2012 12:01:05 PM UTC+8, weheh wrote: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
[web2py] Re: SQLFORM deletable=True -- buggy behavior
I've switched over to web2py.js from web2py_ajax.js but the problem of multiple popups is still there. On Thursday, March 22, 2012 9:39:46 PM UTC+8, Anthony wrote: No, I'm only using the web2py_trap_form out of the cookbook. The rest of the web2py_ajax.js file is the same. If the name of the file is web2py_ajax.js, it's probably old -- it was changed to web2py.js quite a while ago. Anthony
Re: [web2py] Re: how to redirect from ajax
On Mar 28, 2012, at 6:18 AM, weheh wrote: I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? Shouldn't you be using a 30x response here? On Wednesday, March 28, 2012 12:01:05 PM UTC+8, weheh wrote: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
[web2py] Re: skeleton.css pre resetting possible css mistake
We did not add that line to skeleton but looks like a mistake in skeleton. Anyway, we'll soon move away from skeleton to bootstrap 2. On Tuesday, 27 March 2012 16:20:16 UTC-5, jep wrote: With web2py 1.99.7 i try to display preformatted code between pre /pre but the result does not look like preformatted text should look like. . In skeleton.css on line 28 i found that pre is being reset to default (inherit) font, I think this might be the cause. After I removed pre from line 28 in skeleton.css it looked ok. Can somebody confirm this is a mistake ?
[web2py] Re: how to redirect from ajax
I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? You need to issue a 303 to get the browser to redirect to the URL in the Location header. But if it is an ajax request, that will only redirect the ajax request itself -- it won't reload the whole page. If you want an ajax call to result in the whole page reloading, you'll have to do that via Javascript at the completion of the ajax call. If you are using the ajax() function to make the ajax call, you could do something like this: In the view: ajax({{=URL('default', 'myfunc')}}, [], :eval) In default.py: def myfunc(): return 'window.location = %s;' % URL('default', 'otherfunc') Anthony
Re: [web2py] unable to parse csv file 'NoneType' object is unsubscriptable with list:reference type field
Please open a ticket. On Tuesday, 27 March 2012 16:04:47 UTC-5, Richard wrote: Same thing with trunk... Richard On Tue, Mar 27, 2012 at 3:52 PM, Richard ml.richard.vez...@gmail.comwrote: This one to : https://groups.google.com/forum/?fromgroups#!topic/web2py/H_QqV2g8IgQ I experimented the problem with 1.99.4 and 1.99.7 What I understand so far is that id_map get None by default, so when it get here : [id_map[ref_table][int(v)] \ for v in bar_decode_string('|35|1|')] It clears that it will raise the exception... I try to call my import function like this : def import_csv(table, file): table.import_from_csv_file(file, id_map = {}) Noting better. Please help. Richard Le mardi 27 mars 2012 15:45:50 UTC-4, Richard a écrit : Seems related : https://groups.google.com/**forum/#!topic/web2py/** nYKsFPumXk0 https://groups.google.com/forum/#!topic/web2py/nYKsFPumXk0 Le mardi 27 mars 2012 15:20:27 UTC-4, Richard a écrit : Hello, Is it possible the table csv import method be broken? When I use list:reference type field I can't import back a exported CSV with the appadmin. I don't understand where the None value could come from... When I try to implement my own csv import function base on this thread : https://groups.google.com/**forum/?fromgroups#!topic/** web2py/lDi0lLK_Wm0https://groups.google.com/forum/?fromgroups#!topic/web2py/lDi0lLK_Wm0 That work fine, until I try to import data with list:reference type field (|id| or |id|id|, etc.) I get this traceback : for v in bar_decode_string(value)] TypeError: 'NoneType' object is unsubscriptable - Function argument list (field=gluon.dal.Field object, value='|35|1|', id_map=None) Code listing 5683. 5684. 5685. 5686. 5687. 5688. 5689. 5690. 5691. 5692. elif field.type.startswith('list:**string'): value = bar_decode_string(value) elif field.type.startswith(list_**reference_s): ref_table = field.type[len(list_reference_**s):].strip() value = [id_map[ref_table][int(v)] \ for v in bar_decode_string(value)] elif field.type.startswith('list:')**: value = bar_decode_integer(value) elif id_map and field.type.startswith('**reference'): try: Variables global bar_decode_string function bar_decode_string value'|35|1|' v '35' What is exactly id_map? I think problem is coming from there... Thanks Richard
[web2py] Re: Viewing tickets outside of admin
Well, the admin web interface has to parse it somehow to render it in the browser, there must be a function in appadmin or in the admin app for that purpose. El miércoles 28 de marzo de 2012 08:33:11 UTC-3, tsvim escribió: Hi, Lately, I've been using pythonanywhere to work on my pet project together with Dropbox. It's very fun, as it allows me to test all kinds of access (mobile, desktop), various environments (work, home), os's etc. Obviously I'm unable to access the admin as I'm not at a local machine and I don't want to enable remote access to the admin. I was wondering since I'm using Dropbx to sync my files, I do have local access to the ticket files themselves. Is there some parser that would allow me to look at the tickets without needing to run web2py locally to have access to the admin? I would even imagine a hook that would automagically parse the ticket into text form and save a text version of it. Thanks, Tsvi
[web2py] Re: SQLFORM deletable=True -- buggy behavior
On Wednesday, March 28, 2012 9:28:03 AM UTC-4, weheh wrote: I've switched over to web2py.js from web2py_ajax.js but the problem of multiple popups is still there. Can you pack up and attach a minimal app that reproduces the problem? Anthony
[web2py] Re: Form validation on passwords
My view code is fairly minimal, but I suspect it is where the bug lies: {{extend 'layout.html'}} form Email address: input type=text name=email /br / Password: input type=password name=pwd /br / Confirm password: input type=password name=re_pwd /br / input type=submit / /form Do I need to kinda specify the error message here as well? Thanks again. On Wednesday, March 28, 2012 8:54:55 AM UTC-4, Anthony wrote: I tried your code, and it works fine for me. However, the password Testpwd should actually result in an error because the IS_STRONG() validator defaults to number=1 (i.e., at least one number in the password), and you didn't change that default. So, you should get an error on the password field. If the error isn't showing up, perhaps there's a problem with your view code. Have you created a custom form in the HTML? Anthony On Tuesday, March 27, 2012 11:53:37 PM UTC-4, cyan wrote: Thanks for the pointer. Anthony. So now I have the following in my controller: def register(): form = SQLFORM.factory( Field('email', requires=[IS_NOT_EMPTY(), IS_EMAIL(forced= '^.*\.edu(|\..*)$', error_message='email must be .edu address')]), Field('pwd', requires=[IS_NOT_EMPTY(), IS_STRONG(min=6, special=0, upper =1, error_message='minimum 6 characters, and at least 1 uppercase character' ), CRYPT()]), Field('re_pwd', requires=IS_EXPR('value==%s' % repr(request.vars.get( 'pwd', None)), error_message='passwords do not match'))) if form.process().accepted: session.email = form.vars.email session.pwd = form.vars.pwd redirect(URL('registered')) return dict(form=form) And, for testing, I input the following: a...@abc.edu Testpwd Testpwd I didn't get any error messages, so presumably all three validations went fine. However, using a debugger revealed that form.accepted is still None after calling process() on the form. I wonder what went wrong here. Thanks. On Tuesday, March 27, 2012 5:54:02 PM UTC-4, Anthony wrote: Here's how auth.register() does it (slightly edited): requires=IS_EXPR('value==%s' % repr(request.vars.get('password', None)), error_message=Password fields don't match) Anthony On Tuesday, March 27, 2012 5:40:29 PM UTC-4, cyan wrote: Hi group, How do I enforce some simple validation for passwords matching on a form in a controller? All I want to do is to check the second password is the same as the first one, and here is some code I've come up so far: form = SQLFORM.factory( Field('email', requires=IS_NOT_EMPTY()), Field('pwd', requires=[IS_NOT_EMPTY(), IS_STRONG(min=6, special=0,upper =1), CRYPT()]), Field('re_pwd', requires=IS_MATCH(???))) I am attempting to use the validator 'IS_MATCH()' for the second password, but not sure how I reference the the input in the first password field of the same form. Any suggestion would be welcome. Thanks.
Re: [web2py] Re: how to redirect from ajax
Many thanks, Jonathan, Anthony. I didn't realize the HTTP return value (200 vs. 300 etc.) might actually make a difference in the execution of the Location argument. Again, I must go back and look even more closely at the HTTP source and auth source. It's always a balance between slogging through the source or throwing a slow pitch out to you guys, who routinely hit the ball out of the park. On Wednesday, March 28, 2012 9:32:45 PM UTC+8, Jonathan Lundell wrote: On Mar 28, 2012, at 6:18 AM, weheh wrote: I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? Shouldn't you be using a 30x response here? On Wednesday, March 28, 2012 12:01:05 PM UTC+8, weheh wrote: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
Re: [web2py] Re: how to redirect from ajax
Oh, and credit also to Bruno for actually being the first to swing and connect with the location answer. I have some more tinkering to do before I'm fully out of the woods on this issue. On Wednesday, March 28, 2012 9:56:02 PM UTC+8, weheh wrote: Many thanks, Jonathan, Anthony. I didn't realize the HTTP return value (200 vs. 300 etc.) might actually make a difference in the execution of the Location argument. Again, I must go back and look even more closely at the HTTP source and auth source. It's always a balance between slogging through the source or throwing a slow pitch out to you guys, who routinely hit the ball out of the park. On Wednesday, March 28, 2012 9:32:45 PM UTC+8, Jonathan Lundell wrote: On Mar 28, 2012, at 6:18 AM, weheh wrote: I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? Shouldn't you be using a 30x response here? On Wednesday, March 28, 2012 12:01:05 PM UTC+8, weheh wrote: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
[web2py] Re: Modify T() function
On Wednesday, March 28, 2012 9:48:47 AM UTC-4, Massimo Di Pierro wrote: We actually have that already. The way to do is: T(' hello world ## comment') Another secret feature. Find them all, and you get a prize. :-)
[web2py] New HackerNews discussion about python frameworks - web2py is not getting enough love
Come say the good things you have to say about web2py on http://news.ycombinator.com/item?id=3765610
Re: [web2py] Re: how to redirect from ajax
Many thanks, Jonathan, Anthony. I didn't realize the HTTP return value (200 vs. 300 etc.) might actually make a difference in the execution of the Location argument. Again, I must go back and look even more closely at the HTTP source and auth source. Note, this is not an issue with how the web2py HTTP() class works. This is simply how browsers deal with response codes. A response code of 200 means OK, so does not prompt the browser to redirect. If you want the browser to redirect, you have to send a 3xx code (or use Javascript to change the window.location, as already suggested). See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. Anthony
[web2py] Re: New HackerNews discussion about python frameworks - web2py is not getting enough love
yes quite hostile: the smartest web hackers I know universally regard web2py as a fundamentally incorrect way to approach web development—but usually say so in far more colorful terms. web2py appears both bad and unpopular to me
[web2py] Re: Form validation on passwords
My view code is fairly minimal, but I suspect it is where the bug lies: {{extend 'layout.html'}} form Email address: input type=text name=email /br / Password: input type=password name=pwd /br / Confirm password: input type=password name=re_pwd /br / input type=submit / /form Yes, you have created your form manually in pure HTML, and you have not included the error divs, so no errors will appear when one occurs. You might consider just using web2py's standard form serialization via: {{=form}} You can change the formstyle if you like (see http://web2py.com/books/default/chapter/29/7#SQLFORM for details). If you need more customization, try the method shown here: http://web2py.com/books/default/chapter/29/7#Custom-forms. That let's you control the layout but still uses the field widgets generated by web2py (which include the errors when they occur). Also, for details on how to handle your own error displaying, see here: http://web2py.com/books/default/chapter/29/7#Hide-errors. Anthony
Re: [web2py] Re: how to redirect from ajax
[off-topic] A note about JavaScript, something that I learned on JS workshop last week. in JS window is the same as globals() in python, so we do not need to use that explicitly, int the same way we do in Python. Ex: Python. *globals()[__name__]* is the same of simply *__name__* JavaScript *window.location* is the same as simply *location* So even your own objects are stored into window object (the same way your python objects are stored in globals()) name =Bruno the same as window.name = Bruno Not that gain of performance or something like, just curiosity. On Wed, Mar 28, 2012 at 10:36 AM, Anthony abasta...@gmail.com wrote: I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? You need to issue a 303 to get the browser to redirect to the URL in the Location header. But if it is an ajax request, that will only redirect the ajax request itself -- it won't reload the whole page. If you want an ajax call to result in the whole page reloading, you'll have to do that via Javascript at the completion of the ajax call. If you are using the ajax() function to make the ajax call, you could do something like this: In the view: ajax({{=URL('default', 'myfunc')}}, [], :eval) In default.py: def myfunc(): return 'window.location = %s;' % URL('default', 'otherfunc') Anthony -- Bruno Rocha [http://rochacbruno.com.br]
Re: [web2py] Re: how to redirect from ajax
On Mar 28, 2012, at 6:56 AM, weheh wrote: Many thanks, Jonathan, Anthony. I didn't realize the HTTP return value (200 vs. 300 etc.) might actually make a difference in the execution of the Location argument. Again, I must go back and look even more closely at the HTTP source and auth source. It's always a balance between slogging through the source or throwing a slow pitch out to you guys, who routinely hit the ball out of the park. Well, the whole Ajax business gives me a headache. At any rate, as Anthony points out, you need to tailor your redirection request to its intended audience, and in this context passing the new location to your JavaScript is likely to make more sense. web2py's ajax() function ultimately makes its request with jQuery.ajax(), which is making the http request and (I assume) handling 30x redirects. You *could* use HTTP(200, Location=URL(...)), but then your JavaScript code would have to check the returned headers and do the redirection itself, and it doesn't look like ajax() has hooks for that; you'd have to call jQuery.ajax yourself. I think. So the question is whether you want the browser to load the new URL as a page, or you want the new URL to be the real reply to the ajax() call. I think. On Wednesday, March 28, 2012 9:32:45 PM UTC+8, Jonathan Lundell wrote: On Mar 28, 2012, at 6:18 AM, weheh wrote: I don't understand why HTTP(200,Location=URL(...)) isn't redirecting to URL(...)? Shouldn't you be using a 30x response here? On Wednesday, March 28, 2012 12:01:05 PM UTC+8, weheh wrote: I'm trying to figure out how the proper syntax to redirect from an ajax call using HTTP(200,Location=URL(...)). The problem is the ajax call points to either an id or an :eval. But I want to refresh the entire page -- wiping the slate clean. Is this possible?
[web2py] Re: how to redirect from ajax [closed]
OK, this issue is now put to bed. Thank you all for your help. P.S. -- what this issue has taught me touches on what pbreit said in another thread about the hazards of bypassing wonderful web2py built-in auth login/logout facilities when you choose the route of auth by dialog. My approach, has been to explore a fully-componentized version of my website. What I didn't fully appreciate is that if you take that approach, it's an all or nothing game. And the all-component approach touches more of the site than I had originally anticipated. Now that I realize how big a commitment it is, I understand what needs to be done to make it all work. It means more work up front, but the upshot is a much more dynamic website with (usually) much faster response times once you get past the initial page load. The remarkable thing is that you can compress a multi-multi-multi-page website down to a single page. If planned properly up front, it's not that much overhead to do. My problem is that I've evolved to it over a long time, so I've had to rework lots of old-think stuff in order to get to nirvana. Sounds a lot like life, doesn't it? ;-)
[web2py] Re: Modify T() function
We actually have that already. The way to do is: T(' hello world ## comment') This was introduced for a different purpose, allow the same string to have two different translations in different places. The comment causes the string to be treated as different in different places. Check if this works for you and, if not, we can improve it. Notice that you may need to include ## in the actual translated string. You can do this by adding a ## at the end T(' hello world ## not a comment ## a comment') On Thursday, 22 March 2012 08:18:16 UTC-5, Kalpa Welivitigoda wrote: Hi, I am working on a translation enhancement project on sahana-eden[1]. sahana-eden uses the translation feature of web2py. Is it possible to have a modified T() function so that the developer can leave a comment for the translator, for example T(This is a SAMPLE, keep SAMPLE as it is) where the second argument is the comment. Or is there any other mechanism in web2py to accomplish this task. Further the language file in /applications/application name/languages/.py should be in the format source string: target string: comment I may be able to modify my local web2py so that this is accomplished. Rather I would like to see this upstream as for 1) sahana-eden is deployed with web2py framework so it needs it's core functions build into it (patching is not so nice) 2) there will be many other projects existing or about to deploy on web2py which will be benefited with this method. The whole idea is that the translator has more information that will ultimately help to end in a better translation. I'm willing to contribute in code if the developers want me to. [1] eden.sahanafoundation.org Thank you
[web2py] Re: how to redirect from ajax [closed]
P.P.S. As I was saying about compressing the site down to one page ... the real reason why I was having to do this contortion with redirect is because I HAVEN'T compressed the site down to one page. It's actually more like 2 or 3 pages. When I have a little more time, I will compress it down to 1 and then see how it changes things. @Jonathan -- yes the whole ajax business is headache inducing. Much like quantum physics. But after awhile, the old way of thinking (Newtonian viewpoint in the case of physics, or static pages in the case of web stuff) just seems so limited, and frankly, in the case of physics, insane. Said differently, just as Newtonian physics (classical mechanics) is a limiting case of quantum physics, static pages is a limiting case of ajax.
[web2py] Re: SQLFORM deletable=True -- buggy behavior
I'll have to think hard about how to extract my example whilst isolating the bug. I'll need some time ... On Wednesday, March 28, 2012 9:42:54 PM UTC+8, Anthony wrote: On Wednesday, March 28, 2012 9:28:03 AM UTC-4, weheh wrote: I've switched over to web2py.js from web2py_ajax.js but the problem of multiple popups is still there. Can you pack up and attach a minimal app that reproduces the problem? Anthony
[web2py] Apache+virtualhosts+wsgi, loading always the same content
Hi All, After checking the apache documentation and looking at older related discussions in the group, I still don't get what's wrong on my setup. What I want to achieve is: cub3.net - Load my home page www.cub3.net - Load my home page web2py.cub3.net - Load web2py Using Apache with mod_wsgi. My current config files are: VirtualHost *:80 ServerName cub3.net ServerAlias www.cub3.net DocumentRoot /srv/www/cub3.net/public_html/ ErrorLog /srv/www/cub3.net/logs/error.log CustomLog /srv/www/cub3.net/logs/access.log combined /VirtualHost and VirtualHost *:80 ServerName web2py.cub3.net WSGIDaemonProcess web2py user=www-data group=www-data display-name=%{GROUP} WSGIProcessGroup web2py WSGIScriptAlias / /srv/www/cub3.net/public_html/web2py/wsgihandler.py Directory /srv/www/cub3.net/public_html/web2py AllowOverride None Order Allow,Deny Deny from all Files wsgihandler.py Allow from all /Files /Directory AliasMatch ^/([^/]+)/static/(.*) /srv/www/cub3.net/public_html/web2py/applications/$1/static/$2 Directory /srv/www/cub3.net/public_html/applications/*/static/ Order Allow,Deny Allow from all /Directory Location /admin Deny from all /Location LocationMatch ^/([^/]+)/appadmin Deny from all /LocationMatch CustomLog /var/log/apache2/web2py/acces.log common ErrorLog /var/log/apache2/web2py/error.log /VirtualHost Everything looks ok, and the wgsi process can be seen with ps. But when you go to http://web2py.cub3.net, it always loads the default home page, the same that you get at http://cub3.net or http://www.cub3.net. Any clue?
Re: [web2py] unable to parse csv file 'NoneType' object is unsubscriptable with list:reference type field
Done! Issue 738 http://code.google.com/p/web2py/issues/detail?id=738:unable to parse csv file 'NoneType' object is unsubscriptable with list:reference type field Thanks Richard On Wed, Mar 28, 2012 at 9:34 AM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: Please open a ticket. On Tuesday, 27 March 2012 16:04:47 UTC-5, Richard wrote: Same thing with trunk... Richard On Tue, Mar 27, 2012 at 3:52 PM, Richard ml.richard.vez...@gmail.comwrote: This one to : https://groups.google.com/**forum/?fromgroups#!topic/** web2py/H_QqV2g8IgQhttps://groups.google.com/forum/?fromgroups#!topic/web2py/H_QqV2g8IgQ I experimented the problem with 1.99.4 and 1.99.7 What I understand so far is that id_map get None by default, so when it get here : [id_map[ref_table][int(v)] \ for v in bar_decode_string('|35|1|')] It clears that it will raise the exception... I try to call my import function like this : def import_csv(table, file): table.import_from_csv_file(**file, id_map = {}) Noting better. Please help. Richard Le mardi 27 mars 2012 15:45:50 UTC-4, Richard a écrit : Seems related : https://groups.google.com/**fo**rum/#!topic/web2py/** nYKsFPumXk0https://groups.google.com/forum/#!topic/web2py/nYKsFPumXk0 Le mardi 27 mars 2012 15:20:27 UTC-4, Richard a écrit : Hello, Is it possible the table csv import method be broken? When I use list:reference type field I can't import back a exported CSV with the appadmin. I don't understand where the None value could come from... When I try to implement my own csv import function base on this thread : https://groups.google.com/**fo**rum/?fromgroups#!topic/**web2py/** lDi0lLK_Wm0https://groups.google.com/forum/?fromgroups#!topic/web2py/lDi0lLK_Wm0 That work fine, until I try to import data with list:reference type field (|id| or |id|id|, etc.) I get this traceback : for v in bar_decode_string(value)] TypeError: 'NoneType' object is unsubscriptable - Function argument list (field=gluon.dal.Field object, value='|35|1|', id_map=None) Code listing 5683. 5684. 5685. 5686. 5687. 5688. 5689. 5690. 5691. 5692. elif field.type.startswith('list:**st**ring'): value = bar_decode_string(value) elif field.type.startswith(list_**ref**erence_s): ref_table = field.type[len(list_reference_s):].strip() value = [id_map[ref_table][int(v)] \ for v in bar_decode_string(value)] elif field.type.startswith('list:'): value = bar_decode_integer(value) elif id_map and field.type.startswith('**referen**ce'): try: Variables global bar_decode_string function bar_decode_string value '|35|1|' v '35' What is exactly id_map? I think problem is coming from there... Thanks Richard
[web2py] Re: New HackerNews discussion about python frameworks - web2py is not getting enough love
On Wednesday, March 28, 2012 10:13:52 AM UTC-4, Richard Penman wrote: the smartest web hackers I know universally regard web2py as a fundamentally incorrect way to approach web development—but usually say so in far more colorful terms. I just went and re-read the original threads (from jan-2011) where the flask django guys were attacking web2py. Looking at it a year later, I'm amazed how clueless (or bigotted, take your pick) both Jacob Moss-Kaplan (django) and Armin Ronacher (flask) had been about web2py, and still are. Their arguments boil down to two specific problems: JMK: web2py adds a few more builtins to python (i.e., python already has dict, list, len, that's fine. web2py adds request, response, session and a few others - that's unforgivable, harmful and divisive to the python community at large). And confusing to everyone. AR: What JMK said. And also, if you define classes with __del__ methods that don't call object.__del__, you might leak resources. Doesn't matter that it's a python problem in general, it's web2py's fault. The first is a difference in opinion. The 2nd is just dumb. And up until this morning, I thought this guys weren't playing politics.
Re: [web2py] New HackerNews discussion about python frameworks - web2py is not getting enough love
Hi, On 28/03/2012 15:08, nick name wrote: Come say the good things you have to say about web2py on http://news.ycombinator.com/item?id=3765610 Late catching up here because I've been following that! Had to call the Django guy out on his (completely unsupported) statement that web2py is a fundamentally incorrect way to approach web development, a statement that he made *AFTER* admitting that he'd never used it! Not being a fan of flame-wars, I try to restrict myself to establishing whether people who criticise web2py have actually used it - so far 100% of critics that I've encountered have /not/ used it, which I think speaks volumes... -- Regards, PhilK 'a bell is a cup...until it is struck'
[web2py] Re: Viewing tickets outside of admin
The web ticket output is managed by this code: web2py/applications/admin/controllers/default.py (see function ticket and ticketdb and errors) web2py/applications/admin/views/default/view name (see function ticket and ticketdb and errors) Errors is the error panel to show and classify the tickets, ticket and ticketdb return a single ticket for examination. It seems that the html output is handled at the controller using the gluon RestrictedError and TRACEBACK class (defined in default.py) If you don't want html output then it would be enough to instantiate the RestrictedError object and use it's methods. El miércoles 28 de marzo de 2012 10:40:49 UTC-3, Alan Etkin escribió: Well, the admin web interface has to parse it somehow to render it in the browser, there must be a function in appadmin or in the admin app for that purpose. El miércoles 28 de marzo de 2012 08:33:11 UTC-3, tsvim escribió: Hi, Lately, I've been using pythonanywhere to work on my pet project together with Dropbox. It's very fun, as it allows me to test all kinds of access (mobile, desktop), various environments (work, home), os's etc. Obviously I'm unable to access the admin as I'm not at a local machine and I don't want to enable remote access to the admin. I was wondering since I'm using Dropbx to sync my files, I do have local access to the ticket files themselves. Is there some parser that would allow me to look at the tickets without needing to run web2py locally to have access to the admin? I would even imagine a hook that would automagically parse the ticket into text form and save a text version of it. Thanks, Tsvi
Re: [web2py] Re: Viewing tickets outside of admin
I'll have a look at it maybe tomorrow on my train commute or else during the coming week. Thanks, Tsvi Mostovicz ttm...@gmail.com www.linkedin.com/in/tsvim On Wed, Mar 28, 2012 at 17:09, Alan Etkin spame...@gmail.com wrote: The web ticket output is managed by this code: web2py/applications/admin/controllers/default.py (see function ticket and ticketdb and errors) web2py/applications/admin/views/default/view name (see function ticket and ticketdb and errors) Errors is the error panel to show and classify the tickets, ticket and ticketdb return a single ticket for examination. It seems that the html output is handled at the controller using the gluon RestrictedError and TRACEBACK class (defined in default.py) If you don't want html output then it would be enough to instantiate the RestrictedError object and use it's methods. El miércoles 28 de marzo de 2012 10:40:49 UTC-3, Alan Etkin escribió: Well, the admin web interface has to parse it somehow to render it in the browser, there must be a function in appadmin or in the admin app for that purpose. El miércoles 28 de marzo de 2012 08:33:11 UTC-3, tsvim escribió: Hi, Lately, I've been using pythonanywhere to work on my pet project together with Dropbox. It's very fun, as it allows me to test all kinds of access (mobile, desktop), various environments (work, home), os's etc. Obviously I'm unable to access the admin as I'm not at a local machine and I don't want to enable remote access to the admin. I was wondering since I'm using Dropbx to sync my files, I do have local access to the ticket files themselves. Is there some parser that would allow me to look at the tickets without needing to run web2py locally to have access to the admin? I would even imagine a hook that would automagically parse the ticket into text form and save a text version of it. Thanks, Tsvi
[web2py] Re: how to redirect from ajax [closed]
If you want to build a single-page app, you might also consider options like AngularJS http://angularjs.org (supported by Google) and batman.jshttp://batmanjs.org(by Shopify). They move templating to the client, so your server just delivers the initial page (i.e., the whole app, including JS templates) and then takes Ajax requests and returns JSON rather than HTML. Anthony On Wednesday, March 28, 2012 10:37:09 AM UTC-4, weheh wrote: P.P.S. As I was saying about compressing the site down to one page ... the real reason why I was having to do this contortion with redirect is because I HAVEN'T compressed the site down to one page. It's actually more like 2 or 3 pages. When I have a little more time, I will compress it down to 1 and then see how it changes things. @Jonathan -- yes the whole ajax business is headache inducing. Much like quantum physics. But after awhile, the old way of thinking (Newtonian viewpoint in the case of physics, or static pages in the case of web stuff) just seems so limited, and frankly, in the case of physics, insane. Said differently, just as Newtonian physics (classical mechanics) is a limiting case of quantum physics, static pages is a limiting case of ajax.
[web2py] Re: Using single instance of LibreOffice to convert documents - is this safe?
Hi Cliff, could you post more details on your interface to LibreOffice? Last time I looked at this it did not work properly (UNO bridge with OpenOffice) but from your initial post it sounds like a viable alternative now. Thanks, Denes On Tuesday, March 27, 2012 7:47:15 AM UTC-4, Cliff wrote: Thanks Wilkus. Further research this AM says Libre/Open Office does not multi-thread well. The scheduler is just what I need. On Mar 27, 6:33 am, Wikus van de Merwe dupakrop...@googlemail.com wrote: If this processing is done after the form submission you can delegate that to a background task. Having a queue of tasks end executing them one by one should solve the concurrent access problem. Check out the book section on scheduler: http://web2py.com/books/default/chapter/29/4#Scheduler-%28experimenta...
[web2py] help with eye candy
There are two cases where I would like to provide some eye candy in the form of a spinning wait icon whilst web2py does some heavy processing. In one case, I would like to do this while a form is being processed. For instance, if someone wants to fill out a contact form, which sends an email, it would be nice for the cursor to change to the wait cursor while email does its thing. The other case is to start the wait cursor at the beginning of an ajax call that I know will take awhile to execute. In both cases, the cursor is to restore itself to its former state. In the ajax case, I've tried 'jQuery(document).css(cursor, wait);' and then changed wait to auto when all is done. That didn't work. I've also tried doing it on just the wrapper div of the thing that initiates the process. That didn't work either. With regards to processing a form, I would need to be able to kick off a jQuery(...).css(...) just before form.process(). I don't know how to do that, assuming it's at all possible. I imagine rstoring the cursor would be done by a similar mechanism just after the controller returns.
[web2py] Re: how to get logout() to launch an ajax call [closed]
Thanks, Anthony. I really appreciate your thorough responses. You don't just say how to do something, you explain why it works the way it works. That kind of response is rare and invaluable. It keeps me from asking the same question different ways because I end up understanding how the system works under the hood. Please keep up the good work. I would tell your boss to give you a raise, but I wouldn't want to get you fired for putting so much time into the web2py group! (How ironic, eh?) On Tuesday, March 27, 2012 10:49:45 PM UTC+8, Anthony wrote: I want something like this to work, but it doesn't, obviously. def logout(): auth.logout() response.js = 'alert(goodbye world);' from gluon import HTTP HTTP(202) return dict() I've also tried auth.settings.logout_onlogout = [onlogoutfunction] but that's not working for me either. auth.logout() does a redirect, so the above won't make it to your HTTP(202) call. Also, response.js only works for Ajax requests for components (i.e., client-side calls to web2py_ajax_page(), which is what the LOAD helper does). How is the logout request made from the browser? If it is a regular full page request, your controller needs to return a full page (probably via the typical post-logout redirect), and that page then needs to include the relevant JS code (e.g., in a script element). If the logout request is made via Ajax, you might use the web2py ajax() function with :eval as the third argument, and then simply return the JS you want to execute (:eval tells the ajax() function to execute the returned value as JS rather than put it into a target element in the DOM). Anthony
[web2py] Re: Modify T() function
I had to look this up in the source myself. I remembered it was there but I did not remember the syntax. There is a reason web2py uses its own internationalization and not the python one. On Wednesday, 28 March 2012 09:05:58 UTC-5, Anthony wrote: On Wednesday, March 28, 2012 9:48:47 AM UTC-4, Massimo Di Pierro wrote: We actually have that already. The way to do is: T(' hello world ## comment') Another secret feature. Find them all, and you get a prize. :-)
[web2py] Re: how to redirect from ajax [closed]
I took a look at Angular's page. Looks interesting and might be more concise, BUT I can do it all in web2py already. It's mostly a matter of sight design -- we all use some jQuery these days, anyway. Retrofitting an existing set of pages to reduce them to a 1-pager is exponentially harder than designing the site to be a 1-pager to begin with. Now that I have a much better idea of how to do it, I think web2py is perfectly acceptable. The only inconsistency that I see is with login/out/register/etc. auth administration, but it's pretty minor. On Wednesday, March 28, 2012 11:15:06 PM UTC+8, Anthony wrote: If you want to build a single-page app, you might also consider options like AngularJS http://angularjs.org (supported by Google) and batman.jshttp://batmanjs.org(by Shopify). They move templating to the client, so your server just delivers the initial page (i.e., the whole app, including JS templates) and then takes Ajax requests and returns JSON rather than HTML. Anthony On Wednesday, March 28, 2012 10:37:09 AM UTC-4, weheh wrote: P.P.S. As I was saying about compressing the site down to one page ... the real reason why I was having to do this contortion with redirect is because I HAVEN'T compressed the site down to one page. It's actually more like 2 or 3 pages. When I have a little more time, I will compress it down to 1 and then see how it changes things. @Jonathan -- yes the whole ajax business is headache inducing. Much like quantum physics. But after awhile, the old way of thinking (Newtonian viewpoint in the case of physics, or static pages in the case of web stuff) just seems so limited, and frankly, in the case of physics, insane. Said differently, just as Newtonian physics (classical mechanics) is a limiting case of quantum physics, static pages is a limiting case of ajax.
[web2py] all-json API [was: how to redirect from ajax]
On Mar 28, 2012, at 8:15 AM, Anthony wrote: If you want to build a single-page app, you might also consider options like AngularJS (supported by Google) and batman.js (by Shopify). They move templating to the client, so your server just delivers the initial page (i.e., the whole app, including JS templates) and then takes Ajax requests and returns JSON rather than HTML. This relates to another all-json API, namely a JSON (possibly but not necessarily JSON-RPC) web service. I use that to serve several iOS apps, and it works nicely. There's one problem, though: errors. If an error occurs before the web2py JSON function is called (typically a 500 error, such as a Python syntax error in the controller), web2py returns an HTML response, and that's awkward for a JSON client to try to handle. One thing that slightly complicates matters is that to fix this, web2py would need to know that a JSON or JSON-RPC (or for that matter XML-RPC or various other formats) request has been made. For most/all 500 errors, we haven't gotten to the @service decorator, so we ought to be looking at the requested extension or the Accept: header. application/json is what should be there; there's no distinction made for JSON-RPC, which is slightly awkward, but suggests that we should just return a JSON-RPC error object, perhaps based on the content of the request if it parses as JSON. One thing that's stopped me from proposing a patch is that this really ought to be generalized for other non-html services, and perhaps be user-extensible (though not necessarily through an application, since we might not have access to the application at error time; maybe something in routes.py?). But the perfect need not be the enemy of the good-enough, I suppose. Any interest in working out a definition for this?
Re: [web2py] all-json API [was: how to redirect from ajax]
On Mar 28, 2012, at 9:16 AM, Jonathan Lundell wrote: On Mar 28, 2012, at 8:15 AM, Anthony wrote: If you want to build a single-page app, you might also consider options like AngularJS (supported by Google) and batman.js (by Shopify). They move templating to the client, so your server just delivers the initial page (i.e., the whole app, including JS templates) and then takes Ajax requests and returns JSON rather than HTML. This relates to another all-json API, namely a JSON (possibly but not necessarily JSON-RPC) web service. I use that to serve several iOS apps, and it works nicely. There's one problem, though: errors. If an error occurs before the web2py JSON function is called (typically a 500 error, such as a Python syntax error in the controller), web2py returns an HTML response, and that's awkward for a JSON client to try to handle. One thing that slightly complicates matters is that to fix this, web2py would need to know that a JSON or JSON-RPC (or for that matter XML-RPC or various other formats) request has been made. For most/all 500 errors, we haven't gotten to the @service decorator, so we ought to be looking at the requested extension or the Accept: header. application/json is what should be there; there's no distinction made for JSON-RPC, which is slightly awkward, but suggests that we should just return a JSON-RPC error object, perhaps based on the content of the request if it parses as JSON. One thing that's stopped me from proposing a patch is that this really ought to be generalized for other non-html services, and perhaps be user-extensible (though not necessarily through an application, since we might not have access to the application at error time; maybe something in routes.py?). But the perfect need not be the enemy of the good-enough, I suppose. Any interest in working out a definition for this? Oh, and while we're at it (I'm reminded by Richard's last post): not just error handling, but a JSON/JSON-RPC interface to Auth.
[web2py] Re: Using single instance of LibreOffice to convert documents - is this safe?
Most of what I know comes from this: http://lucasmanual.com/mywiki/OpenOffice Other points 1. You can start LibreOffice from a script, but you can't connect to it in that same script. That one cost me half a day. 2. LibreOffice is gonna crash. You'll need a cron job to check if LibreOffice is still running and restart it if it's died. 3. It's slow. If LibreOffice is going to do much work, use the scheduler as Wilkus suggests. 4. Get a version of Python with uno baked in. 5. ZipFile can unpack an odt document. Beware on upload, though; don't mess with the odt doc until after it is saved. Here's the code I use to start LibreOffice: #! /usr/bin/python2.7 import uno, subprocess, shlex, pyuno, os, socket ## prune this import list! # fire up libreoffice rgs = '/usr/lib/libreoffice/program/swriter -accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager -norestore -nofirstwizard -nologo -headless' args = shlex.split(rgs) lo = subprocess.Popen(args) Here's a controller. def do_documents(form): import uno, os, socket, string ## prune this list from com.sun.star.beans import PropertyValue try: os.mkdir(request.folder + 'temp_pdf') except OSError: pass package_name = db.document_packages[request.args(0)].name items = {} # processing a hand made form # get the doc id, make a list of fields for each for k,v in form.vars.iteritems(): k_split = k.split('_') if len(k_split) 2 or k_split[0][:3] != 'id=': continue doc_id = k_split[0][3:] if doc_id not in items: items[doc_id] = [] items[doc_id].append((k_split[1], v)) # now attach the the running LibreOffice instance # still need to implement a check if running and recovery if not local = uno.getComponentContext() resolver = local.ServiceManager.createInstanceWithContext(com.sun.star.bridge.UnoUrlResolver, local) context = resolver.resolve(uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext) desktop = context.ServiceManager.createInstanceWithContext(com.sun.star.frame.Desktop, context) for k, v in items.iteritems(): rcrd = db.document_templates[k] path = request.folder + 'uploads/' + rcrd.body tmplt = desktop.loadComponentFromURL(file:///+path ,_blank, 0, ()) print type(tmplt) # diagnostic search = tmplt.createSearchDescriptor() for val in v: search.SearchString = '{{='+val[0]+'}}' found = tmplt.findFirst(search) while found: found.String = string.replace(found.String, unicode('{{='+val[0]+'}}', 'utf-8'), unicode(val[1], 'utf-8')) found = tmplt.findNext(found.End, search) ## next step is to implement the pdf conversion. I THINK this code will do it ##property = (PropertyValue(FilterName , 0, writer_pdf_Export , 0 ),) ##newpath = request.folder + 'temp_pdf/' + os.path.split(path)[1] ##tmplt.storeToURL(file:/// + newpath,property) ##tmplt.dispose() tmplt.storeAsURL(file:///home/cjk/wtf.odt,()) # not final code tmplt.dispose() + On Wednesday, March 28, 2012 11:17:20 AM UTC-4, DenesL wrote: Hi Cliff, could you post more details on your interface to LibreOffice? Last time I looked at this it did not work properly (UNO bridge with OpenOffice) but from your initial post it sounds like a viable alternative now. Thanks, Denes On Tuesday, March 27, 2012 7:47:15 AM UTC-4, Cliff wrote: Thanks Wilkus. Further research this AM says Libre/Open Office does not multi-thread well. The scheduler is just what I need. On Mar 27, 6:33 am, Wikus van de Merwe dupakrop...@googlemail.com wrote: If this processing is done after the form submission you can delegate that to a background task. Having a queue of tasks end executing them one by one should solve the concurrent access problem. Check out the book section on scheduler: http://web2py.com/books/default/chapter/29/4#Scheduler-%28experimenta...
[web2py] Re: how to redirect from ajax [closed]
On Wednesday, March 28, 2012 12:07:35 PM UTC-4, weheh wrote: I took a look at Angular's page. Looks interesting and might be more concise, BUT I can do it all in web2py already. Not sure what you mean by do it all, but certainly web2py alone cannot do all of what Angular does (even with jQuery). In particular, it does client-side templating, which web2py does not do. It also creates live bindings between the DOM and the (client-side) model, so any changes in one are immediately reflected in the other. Also, client-side form validation, etc. Anthony
[web2py] Re: How to Save Query in Session
Doesn't db._lastsql return a string? Can't you just save that in the session? Or is that a naive question? On Monday, March 26, 2012 10:09:49 PM UTC-4, Limedrop wrote: Just in case any of you want to do this...I've written a routine that enables you to save a Query/Expression object in the session. I have a controller that uses a form to build a relatively complex query and I want other controllers to use that query to generate reports and graphs. I initially explored saving the query in the session as a string, but it just wasn't working for me so I bit the bullet and wrote a seralization routine that takes a Query object and extracts it into a dictionary strucuture. There's another function that does the reverse. It's all here in this slice: http://www.web2pyslices.com/slice/show/1489/save-query-in-session It needs more testing for edge cases (I just don't know enough about the DAL to do all of that). I've written it as a module, but ultimately it would be nice to have something like it as a method within the gluon.dal.Query class itself? Better yet, get the framework to automatically invoke it when saving a Query/Expression to session (like it does for rows).
[web2py] Re: how to get logout() to launch an ajax call [closed]
:-D On Wednesday, March 28, 2012 11:27:03 AM UTC-4, weheh wrote: Thanks, Anthony. I really appreciate your thorough responses. You don't just say how to do something, you explain why it works the way it works. That kind of response is rare and invaluable. It keeps me from asking the same question different ways because I end up understanding how the system works under the hood. Please keep up the good work. I would tell your boss to give you a raise, but I wouldn't want to get you fired for putting so much time into the web2py group! (How ironic, eh?)
[web2py] Re: help with eye candy
I use jQuery BlockUI (http://malsup.com/jquery/block/#overview) for this kind of thing. You can block the whole page or just a single page element, and you can even set it up so the blocking happens at the start of any Ajax request and stops when the Ajax request is complete. Anthony On Wednesday, March 28, 2012 11:22:25 AM UTC-4, weheh wrote: There are two cases where I would like to provide some eye candy in the form of a spinning wait icon whilst web2py does some heavy processing. In one case, I would like to do this while a form is being processed. For instance, if someone wants to fill out a contact form, which sends an email, it would be nice for the cursor to change to the wait cursor while email does its thing. The other case is to start the wait cursor at the beginning of an ajax call that I know will take awhile to execute. In both cases, the cursor is to restore itself to its former state. In the ajax case, I've tried 'jQuery(document).css(cursor, wait);' and then changed wait to auto when all is done. That didn't work. I've also tried doing it on just the wrapper div of the thing that initiates the process. That didn't work either. With regards to processing a form, I would need to be able to kick off a jQuery(...).css(...) just before form.process(). I don't know how to do that, assuming it's at all possible. I imagine rstoring the cursor would be done by a similar mechanism just after the controller returns.
[web2py] Re: Using single instance of LibreOffice to convert documents - is this safe?
Oh yeah, I almost forgot. I've seen a lot of posts about how headless LibreOffice needs X server running. I'm just setting up an Ubuntu server now for test purposes. I'll report back here. On Wednesday, March 28, 2012 12:53:07 PM UTC-4, Cliff wrote: Most of what I know comes from this: http://lucasmanual.com/mywiki/OpenOffice Other points 1. You can start LibreOffice from a script, but you can't connect to it in that same script. That one cost me half a day. 2. LibreOffice is gonna crash. You'll need a cron job to check if LibreOffice is still running and restart it if it's died. 3. It's slow. If LibreOffice is going to do much work, use the scheduler as Wilkus suggests. 4. Get a version of Python with uno baked in. 5. ZipFile can unpack an odt document. Beware on upload, though; don't mess with the odt doc until after it is saved. Here's the code I use to start LibreOffice: #! /usr/bin/python2.7 import uno, subprocess, shlex, pyuno, os, socket ## prune this import list! # fire up libreoffice rgs = '/usr/lib/libreoffice/program/swriter -accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager -norestore -nofirstwizard -nologo -headless' args = shlex.split(rgs) lo = subprocess.Popen(args) Here's a controller. def do_documents(form): import uno, os, socket, string ## prune this list from com.sun.star.beans import PropertyValue try: os.mkdir(request.folder + 'temp_pdf') except OSError: pass package_name = db.document_packages[request.args(0)].name items = {} # processing a hand made form # get the doc id, make a list of fields for each for k,v in form.vars.iteritems(): k_split = k.split('_') if len(k_split) 2 or k_split[0][:3] != 'id=': continue doc_id = k_split[0][3:] if doc_id not in items: items[doc_id] = [] items[doc_id].append((k_split[1], v)) # now attach the the running LibreOffice instance # still need to implement a check if running and recovery if not local = uno.getComponentContext() resolver = local.ServiceManager.createInstanceWithContext(com.sun.star.bridge.UnoUrlResolver, local) context = resolver.resolve(uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext) desktop = context.ServiceManager.createInstanceWithContext(com.sun.star.frame.Desktop, context) for k, v in items.iteritems(): rcrd = db.document_templates[k] path = request.folder + 'uploads/' + rcrd.body tmplt = desktop.loadComponentFromURL(file:///+path ,_blank, 0, ()) print type(tmplt) # diagnostic search = tmplt.createSearchDescriptor() for val in v: search.SearchString = '{{='+val[0]+'}}' found = tmplt.findFirst(search) while found: found.String = string.replace(found.String, unicode('{{='+val[0]+'}}', 'utf-8'), unicode(val[1], 'utf-8')) found = tmplt.findNext(found.End, search) ## next step is to implement the pdf conversion. I THINK this code will do it ##property = (PropertyValue(FilterName , 0, writer_pdf_Export , 0 ),) ##newpath = request.folder + 'temp_pdf/' + os.path.split(path)[1] ##tmplt.storeToURL(file:/// + newpath,property) ##tmplt.dispose() tmplt.storeAsURL(file:///home/cjk/wtf.odt,()) # not final code tmplt.dispose() + On Wednesday, March 28, 2012 11:17:20 AM UTC-4, DenesL wrote: Hi Cliff, could you post more details on your interface to LibreOffice? Last time I looked at this it did not work properly (UNO bridge with OpenOffice) but from your initial post it sounds like a viable alternative now. Thanks, Denes On Tuesday, March 27, 2012 7:47:15 AM UTC-4, Cliff wrote: Thanks Wilkus. Further research this AM says Libre/Open Office does not multi-thread well. The scheduler is just what I need. On Mar 27, 6:33 am, Wikus van de Merwe dupakrop...@googlemail.com wrote: If this processing is done after the form submission you can delegate that to a background task. Having a queue of tasks end executing them one by one should solve the concurrent access problem. Check out the book section on scheduler: http://web2py.com/books/default/chapter/29/4#Scheduler-%28experimenta...
[web2py] web2py hosting on VPS server for enterprise
I'm looking for VPS service for our company to running web2py apps. Requirements --- OS: Windows2008 Database: MS SQL 2008 RAM: 2GB or higher Domain: we will get from domain.com --- I'm pretty interested with kickassvps.com. It looks nice and good pricing but not sure if our managment team likes it (including the name) :) Do you guys know good vps service companies not for personal but more like enterprise level with my requirements ?
[web2py] Re: DAL Challenge
First you need to change your model. In relation database you would have: db.define_table(articles, db.Field(title), ...) db.define_table(comments, db.Field(article_id, db.articles), db.Field(author), ...) But with datastore you want to do the reverse, keep the comment ids in the article table: db.define_table(comments, db.Field(author), ...) db.define_table(articles, db.Field(title), db.Field(comments, list:reference comments), ...) or maybe even simply: db.define_table(articles, db.Field(title), db.Field(comments, list:integer), ...) Then you read all the articles as usual: articles = db().select(db.articles.ALL) You go over all articles and store keys for all comments: from google.appengine.ext import db as gdb keys = [] for a in articles: keys.extend([gdb.Key.from_path(comments, id) for id in a.comments]) And finally you fetch all comments in a single query: comments = gdb.get(keys) You will get the comments in a fixed order so it shouldn't be difficult to map them to articles in the view. Simply for the first article where len(articles[0].comments) = 3, it would be comments[:3], for the second article where len(articles[1].comments) = 5, it would be comments[3:8]. A dictionary with article ids as you proposed would also work.
Re: [web2py] web2py hosting on VPS server for enterprise
for windows -- http://www.rackspace.com On Wed, Mar 28, 2012 at 4:32 PM, Omi Chiba ochib...@gmail.com wrote: I'm looking for VPS service for our company to running web2py apps. Requirements --- OS: Windows2008 Database: MS SQL 2008 RAM: 2GB or higher Domain: we will get from domain.com --- I'm pretty interested with kickassvps.com. It looks nice and good pricing but not sure if our managment team likes it (including the name) :) Do you guys know good vps service companies not for personal but more like enterprise level with my requirements ? -- Bruno Rocha [http://rochacbruno.com.br]
[web2py] Re: Problem with rss feed from wiki application in book
Yes, The link in my outlook rss message has the same URL. When you click the link (http://127.0.0.1:8000/tamoto_dev/default/show.rss/1) , the page retured just says: {errors: {body: enter a value}} What is the solution? Thank you, Bill On Saturday, October 2, 2010 1:36:15 PM UTC-5, Luther Goh Lu Feng wrote: Following either link = 'http://' + str(request.env.http_host) + URL('show', args=row.id) or link = http://127.0.0.1:8000; + URL('show', args=row.id) I get the link in the rss feed to the wiki page as http://127.0.0.1:8000/mywiki/default/show.rss/1 On Sep 26, 7:11 pm, Martin.Mulone mulone.mar...@gmail.com wrote: better way: link = 'http://' + str(request.env.http_host) + URL('show', args=row.id) On 26 sep, 06:30, Tom Atkins minkto...@gmail.com wrote: Thanks for the replies. I worked out what the problem is. The code in the book is incorrect. The line: link = URL('show', args=row.id) does not produce a full URL. The RSS service does not like this and fails. If I replace it with: link = http://127.0.0.1:8000; + URL('show', args=row.id) then it all works fine. I'm sure there is a more elegant way to fix this! Please update the example code in the book. Thanks! On 25 September 2010 19:08, mdipierro mdipie...@cs.depaul.edu wrote: it depends on the model. You must have wiki fields and your action must return record in the format described by the book in chapter 3. Massimo On Sep 25, 12:34 pm, Tom Atkins minkto...@gmail.com wrote: I've just copied and pasted from the online book the wiki application in chapter 3. It all works great. I've added the function for the rss feed to controller/default.py and if I go to: http://127.0.0.1:8000/mywiki/default/news I get a nice page showing the wiki entries. However if I go to: http://127.0.0.1:8000/mywiki/default/news.rss I just get a message saying 'no rss'... Am I doing something stupid or is the code in the book wrong / incomplete. Thanks for any help.
[web2py] Code submission : Select All checkbox in SQLForm.grid
Dear All, I recently used a SQLFORM.grid in my app and I wanted #1 the possibility to have checkboxes to select multiple row to delete #2 customize the text of the submit button #3 have a select all checkbox in the table header. #1 was easy to solve with the help of this mailing list. (see https://groups.google.com/d/msg/web2py/lbNf_UoId7s/XvDFLYHQpIsJ) For #2 and #3 I modified web2py itself (sqlhtml.py - see diff below) - and added a few lines of javascript. Questions : 1. what is the easiest way to active my goal ? 2. is this code contribution worth adding into the trunk ? Thanks Seb *** marsu:gluon sst$ diff -c sqlhtml.py.ORIG sqlhtml.py *** sqlhtml.py.ORIG Wed Mar 28 22:42:03 2012 --- sqlhtml.py Wed Mar 28 22:42:45 2012 *** *** 1400,1405 --- 1400,1406 editable=True, details=True, selectable=None, + selectable_text=None, create=True, csv=True, links=None, *** *** 1702,1708 head = TR(_class=ui.get('header','')) if selectable: ! head.append(TH(_class=ui.get('default',''))) for field in fields: if columns and not str(field) in columns: continue if not field.readable: continue --- 1703,1709 head = TR(_class=ui.get('header','')) if selectable: ! head.append(TH(INPUT(_type='checkbox', _name='selectAll', _id='selectAll', value='off'), _class=ui.get('default',''))) for field in fields: if columns and not str(field) in columns: continue if not field.readable: continue *** *** 1852,1858 htmltable.append(tbody) htmltable = DIV(htmltable,_style='width:100%;overflow-x:auto') if selectable: ! htmltable = FORM(htmltable,INPUT(_type=submit)) if htmltable.process(formname=formname).accepted:# htmltable.vars.records = htmltable.vars.records or [] htmltable.vars.records = htmltable.vars.records if type(htmltable.vars.records) == list else [htmltable.vars.records] --- 1853,1861 htmltable.append(tbody) htmltable = DIV(htmltable,_style='width:100%;overflow-x:auto') if selectable: ! htmltable = FORM(htmltable,INPUT(_type=submit, _value=selectable_text if selectable_text else T('Submit'))) ! htmltable.element(_id='selectAll')['_onClick']=toggleAll(this, 'records'); if htmltable.process(formname=formname).accepted:# htmltable.vars.records = htmltable.vars.records or [] htmltable.vars.records = htmltable.vars.records if type(htmltable.vars.records) == list else [htmltable.vars.records] ** //in the view script type=text/javascript function toggleAll(source,name) { checkboxes = document.getElementsByName(name); for(var i in checkboxes) checkboxes[i].checked = source.checked; } /script
[web2py] Re: Primary Key tables in MSSQL. Cannot get them to work
Try changing your field1 type to 'id'. like this: Field('Field1', 'id'), On Tuesday, March 27, 2012 10:56:44 PM UTC-7, Andrew wrote: Hello, I posted on this issue some time ago and I'm pretty sure it was working again after a fix from DenesL. However I can't get Primary Key tables in MSSQL to work. They get created OK, but I get errors with a Form in a view. I originally made the Key a string, but then switched to integer just to see if it made a difference. : *Model:* dbSQL = DAL('mssql://) # 1 Column PK dbSQL.define_table('web2py_int_PK', Field('Field1', 'integer'), Field('Field2', 'string', length=20), format='%(Field1)s', primarykey = ['Field1'], migrate=True) *Controller:* def web2py_int_PK_form(): form = SQLFORM(dbSQL.web2py_int_PK) if form.process().accepted: response.flash = 'form accepted' elif form.errors: response.flash = 'form has errors' else: response.flash = 'please fill out the form' return dict(form=form) *View:* {{extend 'layout.html'}} h1Primary Key Form Test/h1 {{=form}} I get this in the ticket: File D:\Mercurial\web2py\gluon\dal.py, line 6912, in __getitem__ return dict.__getitem__(self, str(key)) KeyError: '_id' It looks like it is trying to retrieve the value for _id , but looking at the code __init__ for a table, _id never gets set for a table with a Primary Key. (look at lines 6752, 6762, 6772). Just wondering if something like line 772 in sqlhtml.py (In the SQLFORM __init__ method). self.id_field_name = table._id.name could cause the above lookup of the _id key ? Do Forms work with keyed tables ? Thanks Andrew W
Re: [web2py] web2py hosting on VPS server for enterprise
Burno, Thanks ! I just finished chatting with rackspace.com guy and he seems helpful guy. Are you running web2py in here for your customers on windows environment ? I'm thinking to appy the following and it's around $160 per month. It's pretty good deal. Cloud Server - OS: Windows DB: SQL 2008 R2 Web Edition Web server: Apache RAM: 2GB -- On Wednesday, March 28, 2012 3:09:49 PM UTC-5, rochacbruno wrote: for windows -- http://www.rackspace.com On Wed, Mar 28, 2012 at 4:32 PM, Omi Chiba ochib...@gmail.com wrote: I'm looking for VPS service for our company to running web2py apps. Requirements --- OS: Windows2008 Database: MS SQL 2008 RAM: 2GB or higher Domain: we will get from domain.com --- I'm pretty interested with kickassvps.com. It looks nice and good pricing but not sure if our managment team likes it (including the name) :) Do you guys know good vps service companies not for personal but more like enterprise level with my requirements ? -- Bruno Rocha [http://rochacbruno.com.br] On Wednesday, March 28, 2012 3:09:49 PM UTC-5, rochacbruno wrote: for windows -- http://www.rackspace.com On Wed, Mar 28, 2012 at 4:32 PM, Omi Chiba ochib...@gmail.com wrote: I'm looking for VPS service for our company to running web2py apps. Requirements --- OS: Windows2008 Database: MS SQL 2008 RAM: 2GB or higher Domain: we will get from domain.com --- I'm pretty interested with kickassvps.com. It looks nice and good pricing but not sure if our managment team likes it (including the name) :) Do you guys know good vps service companies not for personal but more like enterprise level with my requirements ? -- Bruno Rocha [http://rochacbruno.com.br]
[web2py] Re: How to Save Query in Session
Sometimes that will be sufficient. The issue is how you turn _lastsql into a gluon.dal object that you can further manipulate. For example, what if you want to do this: _lastsql (db.person.name == 'John') See the slice if you need to know how to do it. On Thursday, March 29, 2012 5:59:23 AM UTC+13, Cliff wrote: Doesn't db._lastsql return a string? Can't you just save that in the session? Or is that a naive question?
Re: [web2py] Re: sqlite to postgres
That sounds what I need but: ubuntu@ip:/home/www-data/web2py$ python scripts/cpdb.py -h Traceback (most recent call last): File scripts/cpdb.py, line 5, in module import argparse ImportError: No module named argparse then I read somewhere this: 1down vote The argparse module was added in Python 2.7. http://docs.python.org/library/argparse.html Prior to 2.7, the most common way to handle command-line arguments was probably getopt.http://docs.python.org/library/getopt.html Of course you can always handle the command-line manually simply by looking at sys.argv. Howevergetopt is a good abstraction layer, and argparse is even better. If you truly need argparse in older environments (debatable), there is a Google Code project maintaining it, and you can include that in your project. http://code.google.com/p/argparse/ link http://stackoverflow.com/a/7476068|improve this answerhttp://stackoverflow.com/posts/7476068/edit from: http://stackoverflow.com/questions/7473609/argparse-python-modules-in-cli And I'm like: ubuntu@ip:~$ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type help, copyright, credits or license for more information. wich means it doesn't work because I just don't have it. someone said this: up vote3down vote Well if the only thing you need is argparse (saw that in one of your comments!) you could just do : pip install argparse This is not exactly an answer to the exact question :-) , but indeed if you are only missing a few feature, many 2.7 features actually come from independent projects and/or some compatibility packages can be found, eg: Also from: http://stackoverflow.com/questions/7473609/argparse-python-modules-in-cli wich made me think that I'm using 2.6 while there's 2.7 and 3.2 out there... should I consider upgrading python to a newer version or just get the missing module? Thanks in advanced! Marco Tulio 2012/3/27 nick name i.like.privacy@gmail.com On Tuesday, March 27, 2012 11:26:17 AM UTC-4, Marco Tulio wrote: How do I get the data that was on my app (on the sqlite database). Web2py comes with scripts/cpdb.py, which copies databases from one connection string to another with lots of other goodies. see http://web2py.com/books/default/chapter/29/6#Copy-data-from-one-db-into-another(if it doesn't get you to the right place, look for cpdb in the page) -- []'s Marco Tulio
Re: [web2py] Re: sqlite to postgres
seems to work, but I still couldn't make it work on my project (worked well on smaller projects though) 2012/3/27 Anthony abasta...@gmail.com http://web2py.com/books/default/chapter/29/6#CSV-(all-tables-at-once) On Tuesday, March 27, 2012 11:26:17 AM UTC-4, Marco Tulio wrote: Hi! I was using sqlite as my database for a few projects, but decided to go to postgres. While to web2py going from one to another is pretty much a connection string that you'll change, there's still one problem remaining. How do I get the data that was on my app (on the sqlite database). On a small application, I managed to do that by exporting a csv file on the old app and importing it on the new one. And that's it. But I have another app that has quite a few tables now... wich means that I'd have to copy several cvs and import them. Question is: isn't there an easier way to do it? (to backup a sqlite database and restore it as postgres in one piece?) If there isn't, that means that worst case scenario, I'll have to export/import csv's corresponding to my tables. I can do that... but there really isn't another way ? Thanks! -- []'s Marco Tulio -- []'s Marco Tulio
[web2py] 2.6, 2.7, 3.2, PyPy ... wich one to use?
and that's it... 2.6, 2.7, 3.2, PyPy ... wich one to use (for production on ubuntu linux)? -- []'s Marco Tulio
Re: [web2py] 2.6, 2.7, 3.2, PyPy ... wich one to use?
On Mar 28, 2012, at 3:53 PM, Marco Tulio Cicero de M. Porto wrote: 2.6, 2.7, 3.2, PyPy ... wich one to use (for production on ubuntu linux)? Latest 2.7.
[web2py] Re: How to Save Query in Session
Let me know if you have a proposal to imporve the dal to make this easier. On Wednesday, 28 March 2012 17:29:49 UTC-5, Limedrop wrote: Sometimes that will be sufficient. The issue is how you turn _lastsql into a gluon.dal object that you can further manipulate. For example, what if you want to do this: _lastsql (db.person.name == 'John') See the slice if you need to know how to do it. On Thursday, March 29, 2012 5:59:23 AM UTC+13, Cliff wrote: Doesn't db._lastsql return a string? Can't you just save that in the session? Or is that a naive question?
Re: [web2py] Re: sqlite to postgres
true. cpdb was rewrtten and requires 2.7. I think it is the only module/script that requires 2.7. On Wednesday, 28 March 2012 17:43:48 UTC-5, Marco Tulio wrote: That sounds what I need but: ubuntu@ip:/home/www-data/web2py$ python scripts/cpdb.py -h Traceback (most recent call last): File scripts/cpdb.py, line 5, in module import argparse ImportError: No module named argparse then I read somewhere this: 1down vote The argparse module was added in Python 2.7. http://docs.python.org/library/argparse.html Prior to 2.7, the most common way to handle command-line arguments was probably getopt.http://docs.python.org/library/getopt.html Of course you can always handle the command-line manually simply by looking at sys.argv. Howevergetopt is a good abstraction layer, and argparse is even better. If you truly need argparse in older environments (debatable), there is a Google Code project maintaining it, and you can include that in your project. http://code.google.com/p/argparse/ link http://stackoverflow.com/a/7476068|improve this answerhttp://stackoverflow.com/posts/7476068/edit from: http://stackoverflow.com/questions/7473609/argparse-python-modules-in-cli And I'm like: ubuntu@ip:~$ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type help, copyright, credits or license for more information. wich means it doesn't work because I just don't have it. someone said this: up vote3down vote Well if the only thing you need is argparse (saw that in one of your comments!) you could just do : pip install argparse This is not exactly an answer to the exact question :-) , but indeed if you are only missing a few feature, many 2.7 features actually come from independent projects and/or some compatibility packages can be found, eg: Also from: http://stackoverflow.com/questions/7473609/argparse-python-modules-in-cli wich made me think that I'm using 2.6 while there's 2.7 and 3.2 out there... should I consider upgrading python to a newer version or just get the missing module? Thanks in advanced! Marco Tulio 2012/3/27 nick name i.like.privacy@gmail.com On Tuesday, March 27, 2012 11:26:17 AM UTC-4, Marco Tulio wrote: How do I get the data that was on my app (on the sqlite database). Web2py comes with scripts/cpdb.py, which copies databases from one connection string to another with lots of other goodies. see http://web2py.com/books/default/chapter/29/6#Copy-data-from-one-db-into-another(if it doesn't get you to the right place, look for cpdb in the page) -- []'s Marco Tulio
[web2py] Re: Primary Key tables in MSSQL. Cannot get them to work
Thankyou Derek, I will give it a try , but this was only a simple, cut down, test case to get it to work initially. I originally had a string for the PK, and I also wanted to test multi column PKs. I am confident the 'id' will work, but it doesn't address the other scenarios. My real goal is to change another base adaptor, but I'm using MSSQL as my baseline as it is supposed to work OK. The next thing I will try is to do some db interaction without forms or grids. I think that might be where the issue is. Thanks again. On Thursday, March 29, 2012 10:50:41 AM UTC+13, Derek wrote: Try changing your field1 type to 'id'. like this: Field('Field1', 'id'), On Tuesday, March 27, 2012 10:56:44 PM UTC-7, Andrew wrote: Hello, I posted on this issue some time ago and I'm pretty sure it was working again after a fix from DenesL. However I can't get Primary Key tables in MSSQL to work. They get created OK, but I get errors with a Form in a view. I originally made the Key a string, but then switched to integer just to see if it made a difference. : *Model:* dbSQL = DAL('mssql://) # 1 Column PK dbSQL.define_table('web2py_int_PK', Field('Field1', 'integer'), Field('Field2', 'string', length=20), format='%(Field1)s', primarykey = ['Field1'], migrate=True) *Controller:* def web2py_int_PK_form(): form = SQLFORM(dbSQL.web2py_int_PK) if form.process().accepted: response.flash = 'form accepted' elif form.errors: response.flash = 'form has errors' else: response.flash = 'please fill out the form' return dict(form=form) *View:* {{extend 'layout.html'}} h1Primary Key Form Test/h1 {{=form}} I get this in the ticket: File D:\Mercurial\web2py\gluon\dal.py, line 6912, in __getitem__ return dict.__getitem__(self, str(key)) KeyError: '_id' It looks like it is trying to retrieve the value for _id , but looking at the code __init__ for a table, _id never gets set for a table with a Primary Key. (look at lines 6752, 6762, 6772). Just wondering if something like line 772 in sqlhtml.py (In the SQLFORM __init__ method). self.id_field_name = table._id.name could cause the above lookup of the _id key ? Do Forms work with keyed tables ? Thanks Andrew W
[web2py] Use of return locals()
Hi , I've been wondering about the use of return locals() in the Forms chapter of the book, particularly with grids def manage_users(): grid = SQLFORM.grid(db.auth_user) return locals() Elsewhere in the book use see something like this for forms return dict(form =form) Would return dict(grid=grid) have given the same result as above? I know a dict is required to automatically use a view with the a/c/f.html naming standard, but what does locals() use ? I think it would help to clarify this in the book? Core chapter has: *Return a dictionary for a view*: def index(): return dict(key='value') *Return all local variables*: def index(): return locals() and also this: When an action returns a dictionary, web2py looks for a view with the name 1. [controller]/[function].[extension] and executes it. Thanks Andrew
[web2py] help with IS_IN_DB?
I can try to show in form of input and output a dbset, but i want to modify prices, because it depends of store In model if store.store_id7: armazones = db((db.eyewear.observaciones== '')(db.eyewear.modelo!='SOLAR')) elif store.store_id6: armazones = db((db.eyewear.observaciones!='2DA JORNADA 2010')) else: armazones = db(db.eyewear.id0) interes=0.0 if store.store_id==9: interes=1.25 elif store.store_id9: interes=1.10 if interes0.0: i=0 for armazon in armazones: armazones[i].precio=armazon.precio*interes+(armazon.precio*interes)%10 i=i+1 In definition of table db.define_table(notas, Field(store_id,db.stores, label='Sucursal',comment='Es a la que se encuentra asignado'), Field('nota', 'integer', default=None, writable=False,label='Remisión(Sistema)',comment='Asignado por el sistema'), Field('armazon1',db.eyewear, default=None,requires=IS_NULL_OR(IS_IN_DB(armazones,'eyewear.id','%(marca)s %(modelo)s %(color)s %(caract1)s $%(precio)s'))), Field('modelo1','string', default=None, requires=IS_NULL_OR(IS_ALPHANUMERIC(error_message='¡Deben ser caracteres alfanumericos, sin espacios en blanco ó ñ!')),label='Modelo armazon1'), Field('color1','string', default=None, requires=IS_NULL_OR(IS_ALPHANUMERIC(error_message='¡Deben ser caracteres alfanumericos, sin espacios en blanco ó ñ!')),label='Color(es) armazon1'), Field('obser1','string', default=None, label='Observaciones 1',comment='Para el laboratorio'), Field('lente1',db.lentes, default=None,requires=IS_NULL_OR(IS_IN_DB(glases,'lentes.id','%(tecnoGradua)s %(material)s %(tipo)s %(tecnoVisual)s %(tratamiento)s $%(promo)s'))), Field('soloLoC1','string', default=None,requires=IS_NULL_OR(IS_IN_SET(soloLoC)), label='Lejos ó Cerca 1'), Field('tinte1','string', default=None, requires=IS_NULL_OR(IS_IN_SET(tintes))), Field(total, double, default=0, writable=False), Field(descuento, integer, default=0, requires=IS_INT_IN_RANGE(0,41,error_message='Debe ser Numero positivo entre 0 y 40'), comment='15% maximo permitido'), Field(anticipo, double, default=0, requires=[IS_NOT_EMPTY(error_message='No puede estar vacio'),IS_FLOAT_IN_RANGE(0.0,2.0,error_message='Debe ser un numero positivo entre 0 y 2')],comment='35% minimo para descuento'), Field(pagos, double, default=0, writable=False), Field(saldo, double, default=0, writable=False), ) db.notas.store_id.represent = lambda value: '%(id)s.- %(store)s' % db.stores(value) if value else '' db.notas.armazon1.represent = lambda value: '%(marca)s %(modelo)s %(color)s %(caract1)s $%(promo)s' % db.eyewear(value) if value else '' db.notas.lente1.represent = lambda value: '%(tecnoGradua)s %(material)s %(tipo)s %(tecnoVisual)s %(tratamiento)s $%(promo)s' % db.lentes(value) if value else '' However, only show data of db not of dbset Can you help me? Is it better is_in_set or sqlform.factory?
[web2py] Re: Use of return locals()
locals() returns a dictionary including all the variables in the local function, so it is exactly equivalent to dict(grid=grid) in this case. See http://docs.python.org/library/functions.html#locals. In general, though, you should probably explicitly return just the variables you need to pass to the view. Anthony On Wednesday, March 28, 2012 8:41:19 PM UTC-4, Andrew wrote: Hi , I've been wondering about the use of return locals() in the Forms chapter of the book, particularly with grids def manage_users(): grid = SQLFORM.grid(db.auth_user) return locals() Elsewhere in the book use see something like this for forms return dict( form=form) Would return dict(grid=grid) have given the same result as above? I know a dict is required to automatically use a view with the a/c/f.html naming standard, but what does locals() use ? I think it would help to clarify this in the book? Core chapter has: *Return a dictionary for a view*: def index(): return dict(key='value') *Return all local variables*: def index(): return locals() and also this: When an action returns a dictionary, web2py looks for a view with the name 1. [controller]/[function].[extension] and executes it. Thanks Andrew
Re: [web2py] Re: Single error message for radio group
I've got the same issue (running 1.99.7). Has anyone solved this? On Sunday, February 26, 2012 6:12:41 PM UTC+13, Detectedstealth wrote: Hi Massimo, Your suggestion doesn't seem to be working: LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age')), value=self.request.vars['age']), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), I still get an error on all radio fields. -- Regards, Bruce On Sun, Feb 12, 2012 at 6:00 PM, Bruce Wade bruce.w...@gmail.com wrote: Thanks. On Sun, Feb 12, 2012 at 5:57 PM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: INPUT(,hideerror=True) On Feb 12, 6:33 pm, Bruce Wade bruce.w...@gmail.com wrote: Hi, Is it possible to show a single error message for a group of radio buttons. See screen shot FORM( FIELDSET( H4(self.T('Personal Questions')), UL( LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age'))), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2'), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3'), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4'), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5'), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), ), ) ) -- -- Regards, Bruce Wadehttp:// ca.linkedin.com/in/brucelwadehttp://www.wadecybertech.comhttp://www.warplydesigned.comhttp://www.fitnessfriendsfinder.com fit_errors.png 371KViewDownload -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com
[web2py] Re: Smarttable SQLFORM.grid
You may be thinking of 'powertable'. This plugin presents a grid that includes a typeahead search function. It can be found at https://bitbucket.org/rochacbruno/powertable. - Tom On Monday, March 26, 2012 2:24:42 PM UTC-6, greenpoise wrote: What I was looking for was a type-ahead function using SQLFORM.smartgrid instead of typing a word and pressing search. On Thursday, 22 March 2012 16:15:23 UTC-7, Alan Etkin wrote: I think you mean SQLFORM.smartgrid. Book's 7.8 section (the features are explained there): ... A SQLFORM.smartgrid looks a lot like a grid, in fact it contains a grid but it is designed to take as input not a query but only one table and to browse said table and selected referencing tables. ... On Mar 22, 7:16 pm, greenpoise danel.sega...@gmail.com wrote: Are these two equivalents?? I remember using smartables at some point. What I liked about it was the search feature without having to press any button to search for my text within a table. Does SQLFORM.grid provides something similar?? Thanks d
Re: [web2py] Re: Single error message for radio group
I think there is a bug and I think I just fixed it in trunk. Please check it. On Wednesday, 28 March 2012 20:38:08 UTC-5, Limedrop wrote: I've got the same issue (running 1.99.7). Has anyone solved this? On Sunday, February 26, 2012 6:12:41 PM UTC+13, Detectedstealth wrote: Hi Massimo, Your suggestion doesn't seem to be working: LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age')), value=self.request.vars['age']), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), I still get an error on all radio fields. -- Regards, Bruce On Sun, Feb 12, 2012 at 6:00 PM, Bruce Wade bruce.w...@gmail.com wrote: Thanks. On Sun, Feb 12, 2012 at 5:57 PM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: INPUT(,hideerror=True) On Feb 12, 6:33 pm, Bruce Wade bruce.w...@gmail.com wrote: Hi, Is it possible to show a single error message for a group of radio buttons. See screen shot FORM( FIELDSET( H4(self.T('Personal Questions')), UL( LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age'))), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2'), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3'), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4'), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5'), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), ), ) ) -- -- Regards, Bruce Wadehttp:// ca.linkedin.com/in/brucelwadehttp://www.wadecybertech.comhttp://www.warplydesigned.comhttp://www.fitnessfriendsfinder.com fit_errors.png 371KViewDownload -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com
Re: [web2py] Re: Single error message for radio group
The solution I made was setting a default value for all my radio groups. On Wed, Mar 28, 2012 at 7:01 PM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: I think there is a bug and I think I just fixed it in trunk. Please check it. On Wednesday, 28 March 2012 20:38:08 UTC-5, Limedrop wrote: I've got the same issue (running 1.99.7). Has anyone solved this? On Sunday, February 26, 2012 6:12:41 PM UTC+13, Detectedstealth wrote: Hi Massimo, Your suggestion doesn't seem to be working: LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=**self.T('missing your age')), value=self.request.vars['age']**), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2', hideerror=True, value=self.request.vars['age']** ), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3', hideerror=True, value=self.request.vars['age']**), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4', hideerror=True, value=self.request.vars['age']**), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5', hideerror=True, value=self.request.vars['age']**), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), I still get an error on all radio fields. -- Regards, Bruce On Sun, Feb 12, 2012 at 6:00 PM, Bruce Wade bruce.w...@gmail.comwrote: Thanks. On Sun, Feb 12, 2012 at 5:57 PM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: INPUT(,hideerror=True) On Feb 12, 6:33 pm, Bruce Wade bruce.w...@gmail.com wrote: Hi, Is it possible to show a single error message for a group of radio buttons. See screen shot FORM( FIELDSET( H4(self.T('Personal Questions')), UL( LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=**self.T('missing your age'))), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2'), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3'), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4'), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5'), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), ), ) ) -- -- Regards, Bruce Wadehttp://ca.linkedin.com/in/**brucelwadehttp://www.** wadecybertech.comhttp://www.**warplydesigned.comhttp://www.** fitnessfriendsfinder.comhttp://ca.linkedin.com/in/brucelwadehttp://www.wadecybertech.comhttp://www.warplydesigned.comhttp://www.fitnessfriendsfinder.com fit_errors.png 371KViewDownload -- -- Regards, Bruce Wade http://ca.linkedin.com/in/**brucelwadehttp://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.**fitnessfriendsfinder.comhttp://www.fitnessfriendsfinder.com -- -- Regards, Bruce Wade http://ca.linkedin.com/in/**brucelwadehttp://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.**fitnessfriendsfinder.comhttp://www.fitnessfriendsfinder.com -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com
Re: [web2py] Re: Single error message for radio group
Yes, tested and it now works! Thanks Massimo. On Thursday, March 29, 2012 3:01:41 PM UTC+13, Massimo Di Pierro wrote: I think there is a bug and I think I just fixed it in trunk. Please check it. On Wednesday, 28 March 2012 20:38:08 UTC-5, Limedrop wrote: I've got the same issue (running 1.99.7). Has anyone solved this? On Sunday, February 26, 2012 6:12:41 PM UTC+13, Detectedstealth wrote: Hi Massimo, Your suggestion doesn't seem to be working: LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age')), value=self.request.vars['age']), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5', hideerror=True, value=self.request.vars['age']), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), I still get an error on all radio fields. -- Regards, Bruce On Sun, Feb 12, 2012 at 6:00 PM, Bruce Wade bruce.w...@gmail.comwrote: Thanks. On Sun, Feb 12, 2012 at 5:57 PM, Massimo Di Pierro massimo.dipie...@gmail.com wrote: INPUT(,hideerror=True) On Feb 12, 6:33 pm, Bruce Wade bruce.w...@gmail.com wrote: Hi, Is it possible to show a single error message for a group of radio buttons. See screen shot FORM( FIELDSET( H4(self.T('Personal Questions')), UL( LI( H5(self.T('What is your Age?')), INPUT( _type='radio', _name='age', _value='1', _id='age1', requires = IS_NOT_EMPTY(error_message=self.T('missing your age'))), LABEL(SPAN(self.T('Less than 20')), _for='age1'), INPUT( _type='radio', _name='age', _value='2',_id='age2'), LABEL(SPAN(self.T('20-35')), _for='age2'), INPUT( _type='radio', _name='age', _value='3', _id='age3'), LABEL(SPAN(self.T('35-50')), _for='age3'), INPUT( _type='radio', _name='age', _value='4', _id='age4'), LABEL(SPAN(self.T('50-65')), _for='age4'), INPUT( _type='radio', _name='age', _value='5', _id='age5'), LABEL(SPAN(self.T('65 and never too old')), _for='age5'), ), ), ) ) -- -- Regards, Bruce Wadehttp:// ca.linkedin.com/in/brucelwadehttp://www.wadecybertech.comhttp://www.warplydesigned.comhttp://www.fitnessfriendsfinder.com fit_errors.png 371KViewDownload -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com -- -- Regards, Bruce Wade http://ca.linkedin.com/in/brucelwade http://www.wadecybertech.com http://www.warplydesigned.com http://www.fitnessfriendsfinder.com
Re: [web2py] Re: Single error message for radio group
Thanks. In my case default=None (and needs to be), so thankfully Massimo's fix does the trick. On Thursday, March 29, 2012 3:27:40 PM UTC+13, Detectedstealth wrote: The solution I made was setting a default value for all my radio groups.
[web2py] SQLFORM.grid not doing what I expect
Gentle people, I have the following grid: query = ( (db.lvdisksetup.lvgroupname_id == usedlvdisksetup) (db.lvgroupname.id == usedlvdisksetup) (db.lvdisksetup.lvdisk_id == db.lvdisk.id) ) fields = [db.lvdisksetup.id, db.lvgroupname.lvgroupnamedesc , db.lvdisk.lvdiskdesc, db.lvdisksetup.lunid] form = SQLFORM.grid(query, fields=fields, orderby=['lvdisksetup.lunid'], csv=False, create = False, maxtextlength=45 ) I want to manipulate db.lvdisksetup but in stead it manipulates db.lvdisk :-) What causes havoc by deleting essential table data :)
[web2py] SQLFORM.grid not doing what I want :)
Gentle people, I have the following grid: query = ( (db.lvdisksetup.lvgroupname_id == usedlvdisksetup) (db.lvgroupname.id == usedlvdisksetup) (db.lvdisksetup.lvdisk_id == db.lvdisk.id) ) fields = [db.lvdisksetup.id, db.lvgroupname.lvgroupnamedesc , db.lvdisk.lvdiskdesc, db.lvdisksetup.lunid] form = SQLFORM.grid(query, fields=fields, orderby=['lvdisksetup.lunid'], csv=False, create = False, maxtextlength=45 ) I want to manipulate db.lvdisksetup but in stead it manipulates db.lvdisk :-) What causes havoc by deleting essential table data :) Part of the db models :) # All the LV sizes will be collected in here in bytes, like 30GB, 10GB, 2GB etc db.define_table('lvsize', Field('sizename', type='string', unique=True, label=T('Lun Size')), Field('size', type='string', label=T('LV Size in bytes')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # The LV Disk groups db.define_table('lvgroupname', Field('lvgroupnamedesc', type='string', unique=True, label=T('LV Disk Groupname ')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # Table rules db.lvgroupname.lvgroupnamedesc.requires = IS_NOT_EMPTY() # Logical volume on storage db.define_table('lvdisk', Field('lvdiskdesc', type='string', unique=True, label=T('LV Disk description ')), Field('lvsize_id', db.lvsize, default=2, label=T('Size ID')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # Table rules db.lvdisk.lvsize_id.requires = IS_IN_DB(db, 'lvsize.id', 'lvsize.sizename') db.lvdisk.lvdiskdesc.requires = IS_NOT_EMPTY() # lvdisksetup db.define_table('lvdisksetup', Field('lvdisk_id', db.lvdisk, default=1, label=T('Logical volume to be added')), Field('lvgroupname_id', db.lvgroupname, default=1, label=T('Member of Logical volume group name')), Field('lunid', type='integer', default=2, label=T('Lun ID')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # Table rules db.lvdisksetup.lvdisk_id.requires = IS_IN_DB(db, 'lvdisk.id', 'lvdisk.lvdiskdesc') db.lvdisksetup.lvgroupname_id.requires = IS_IN_DB(db, 'lvgroupname.id', 'lvgroupname.lvgroupnamedesc') # hbahostgroupsetup (to add the right disks to a hba or a hostgroup) db.define_table('hbahostgroupsetup', Field('hbahgdesc', type='string', label=T('LV Disk setup Description ')), Field('lvgroupname_id', db.lvgroupname, default=1, label=T('LV Disk')), Field('mapping_id', db.storagemap, default=1, label=T('HBA or Hostgroup mapping')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # Table rules db.hbahostgroupsetup.lvgroupname_id.requires = IS_IN_DB(db, 'lvgroupname.id', 'lvdisk.lvgroupnamedesc') db.hbahostgroupsetup.mapping_id.requires = IS_IN_DB(db, 'storagemap.id', 'storagemap.mapping') db.hbahostgroupsetup.hbahgdesc.requires = IS_NOT_EMPTY() # disksetupname (to make it possible to have the same lv setup for different class setups) db.define_table('disksetupname', Field('disksetupnamedesc', type='string', label=T('LV Disk group selection description ')), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), migrate=settings.migrate) # Table rules db.disksetupname.disksetupnamedesc.requires = IS_NOT_EMPTY() # hbahggroup db.define_table('hbahggroup', Field('hbahostgroupsetup_id', db.hbahostgroupsetup,
[web2py] Re: Use of return locals()
Thanks Anthony ! On Thursday, March 29, 2012 2:31:02 PM UTC+13, Anthony wrote: locals() returns a dictionary including all the variables in the local function, so it is exactly equivalent to dict(grid=grid) in this case. See http://docs.python.org/library/functions.html#locals. In general, though, you should probably explicitly return just the variables you need to pass to the view. Anthony On Wednesday, March 28, 2012 8:41:19 PM UTC-4, Andrew wrote: Hi , I've been wondering about the use of return locals() in the Forms chapter of the book, particularly with grids def manage_users(): grid = SQLFORM.grid(db.auth_user) return locals() Elsewhere in the book use see something like this for forms return dict( form=form) Would return dict(grid=grid) have given the same result as above? I know a dict is required to automatically use a view with the a/c/f.html naming standard, but what does locals() use ? I think it would help to clarify this in the book? Core chapter has: *Return a dictionary for a view*: def index(): return dict(key='value') *Return all local variables*: def index(): return locals() and also this: When an action returns a dictionary, web2py looks for a view with the name 1. [controller]/[function].[extension] and executes it. Thanks Andrew