I think, I found a solution :

This answer :
Joss -- to restore a previously saved order, you would just set your server
side script to output the HTML option tags in the order you want them.
In this page :
http://www.ryancramer.com/journal/entries/asmselect_v104/

I think it will need :

IS_IN_DB(..., selected_order=True)

Or it could be include somewhere else when generating form...

Richard

On Fri, May 4, 2012 at 1:38 PM, Richard Vézina
<[email protected]>wrote:

> Ok, I had a closer look at what's going on...
>
> Test :
>
> No plugin (no chosen), no validator (no is_in_db), field type
> list:reference so multiselect.
>
> What's happen :
> Select options will be sorted alphanumerically so if first_name is the id
> represent set with format='%(first_name)s' options will be ordered
> alphabetically. Then the selecting options will be stored in the order they
> appears in the select options html list. Trying to define the order
> with default=['35', '18', '38'] that goes against the alphabetic order of
> the select options get overrided and the order of stored field entry is the
> same as the order of the select option list.
>
> Conclusion :
> I wrongly thought that chosen was returning the selected element in the
> order they have been selected by the user... I was miss leading because at
> first I thought that the default behavior or web2py was to order the
> selected input option base on id of the referenced table. So I was only
> looking for a different behavior. The first tests I made was to printing
> the content of form.vars.referencefiedl, so I thought that because the id
> was not in order (not [1,2,3]) but [2,3,1] for example, it means that
> web2py was doing something behind me... I was wrong.
>
> Using the asmselect (http://code.google.com/p/jquery-asmselect/, see also
> this fork : https://github.com/vicb/bsmSelect) I have been able to do
> what I want only at creation of a record... On update it not working so
> far...
>
>
>
> So, it's not a web2py issue...
>
> Only remaining issue is that records can't be update without the lost of
> the initial user selected elements order. So a complementary field (a uses
> "hidded" field to store the order of the element) will be needed to keep
> track of the order to make it usables.
>
> Thanks.
>
> Richard
>
>
> On Thu, May 3, 2012 at 10:21 AM, Richard Vézina <
> [email protected]> wrote:
>
>> Wait I think it return the element base on the orderby...
>>
>> I test further.
>>
>> Richard
>>
>>
>> On Thu, May 3, 2012 at 10:05 AM, Richard Vézina <
>> [email protected]> wrote:
>>
>>> Think that "sort=False" does the trick!!
>>>
>>> Thanks for help, I think you can close the issue... Do you want I leave
>>> the solution with the issue?
>>>
>>> Richard
>>>
>>>
>>> On Thu, May 3, 2012 at 10:02 AM, Richard Vézina <
>>> [email protected]> wrote:
>>>
>>>> Ok, I remove the IS_IN_DB validator and now I get unordered list... So,
>>>> look like it the problem...
>>>>
>>>> I will try to change it...
>>>>
>>>> Richard
>>>>
>>>>
>>>> On Thu, May 3, 2012 at 9:53 AM, Richard Vézina <
>>>> [email protected]> wrote:
>>>>
>>>>> I use IS_IN_DB with a set not the table directly...
>>>>>
>>>>> analyst_set = db((db.auth_group.role=='analyst') & 
>>>>> (db.auth_user.id==db.auth_membership.user_id)
>>>>> & (db.auth_membership.group_id==db.auth_group.id))
>>>>>
>>>>> requires=IS_IN_DB(analyst_set,'auth_user.id','%(initials)s',\
>>>>>             multiple=True,cache=(cache.ram, 3600)),
>>>>>
>>>>> So, maybe it is the IS_IN_DB validator that order the list at the end
>>>>> of the process before returning the list to the DAL.
>>>>>
>>>>> Richard
>>>>>
>>>>> On Wed, May 2, 2012 at 11:12 PM, Massimo Di Pierro <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Are you talking about the IS_IN_SET() validator? I need to see some
>>>>>> code. There is nothing in DAL that cases this. It must be a validator. So
>>>>>> it depends on what you are using.
>>>>>>
>>>>>>
>>>>>> On Wednesday, 2 May 2012 17:29:35 UTC-5, Richard wrote:
>>>>>>>
>>>>>>> Ok DAL do will return [1,2,3] in case of the user has select the
>>>>>>> first 3 element of the referenced table.
>>>>>>>
>>>>>>> What Choosen plugin return (and what I would to be stored in
>>>>>>> database field) could be [1,3,2] or [3,1,2] or what ever other order in
>>>>>>> which the user had pick those referenced elements. Choosen allow that 
>>>>>>> when
>>>>>>> use multiple option.
>>>>>>>
>>>>>>> So I would like that the DAL return at the database level the order
>>>>>>> in which the element have been entered in the field in case of use of
>>>>>>> plugin like choosen. Off course it is not applying if someone is not 
>>>>>>> using
>>>>>>> a plugin because you can't know in which order the element have been
>>>>>>> selected.
>>>>>>>
>>>>>>> Now, I think that what prevent the DAL to return a unordered list to
>>>>>>> the database is the use of dict...
>>>>>>>
>>>>>>> I think I found a work around... But I didn't have time to implement
>>>>>>> it... It consist of creating an other field to store the content of the
>>>>>>> form.vars.field (list:reference field). So having 2 fields instead of 
>>>>>>> 1...
>>>>>>>
>>>>>>> Hope it more clear.
>>>>>>>
>>>>>>> Richard
>>>>>>>
>>>>>>> On Wed, May 2, 2012 at 4:52 PM, Massimo Di Pierro <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Richard, I am at a loss about this. the dal does not sort, nor does
>>>>>>>> the validator. Can you show me and example to reproduce this sorting?
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thursday, 19 April 2012 16:14:50 UTC-5, Richard wrote:
>>>>>>>>>
>>>>>>>>>   Issue 768 <http://code.google.com/p/web2py/issues/detail?id=768>
>>>>>>>>> : Allow insert of unsorted or unordered list:reference type field
>>>>>>>>> values
>>>>>>>>> On Thu, Apr 19, 2012 at 5:08 PM, Richard Vézina <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Found this http://stackoverflow.com/****questions/1867861/python-
>>>>>>>>>> **dicti**onary-keep-keys-values-**in-**same-order-as-declared<http://stackoverflow.com/questions/1867861/python-dictionary-keep-keys-values-in-same-order-as-declared>
>>>>>>>>>>  on
>>>>>>>>>> stackoverflow where the most rated post redirect here :
>>>>>>>>>> http://dev.pocoo.org/hg/**sandbo**x/raw-file/tip/odict.py<http://dev.pocoo.org/hg/sandbox/raw-file/tip/odict.py>
>>>>>>>>>>
>>>>>>>>>> Notice, it will download odict.py into your computer that contain
>>>>>>>>>> a class supposing to allow preservation of initial order in a python 
>>>>>>>>>> dict...
>>>>>>>>>>
>>>>>>>>>> I think, it could be nice to have this class added to web2py in
>>>>>>>>>> order to allow insert into database of unordered list:reference field
>>>>>>>>>> input...
>>>>>>>>>>
>>>>>>>>>> Since this could be slow (not in case of few value I think), it
>>>>>>>>>> could be a choice offer to the user like : list:reference sorted or
>>>>>>>>>> list:reference unsorted...
>>>>>>>>>>
>>>>>>>>>> What do you think??
>>>>>>>>>>
>>>>>>>>>> Richard
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thu, Apr 19, 2012 at 4:59 PM, Richard Vézina <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>>> Some progress...
>>>>>>>>>>>
>>>>>>>>>>> I just make a check and chosen plugin multiple select option
>>>>>>>>>>> return a unordered list of the picked element by the user...
>>>>>>>>>>>
>>>>>>>>>>> So, now, I think that it could be nice if web2py allow some way
>>>>>>>>>>> to determine in case of use of chosen kind of plugin to store a 
>>>>>>>>>>> unordered
>>>>>>>>>>> list in list:reference field...
>>>>>>>>>>>
>>>>>>>>>>> I think that it is near line 207 (web2py 1.99.4) gluon/sqlhtml
>>>>>>>>>>> that we have to make change :
>>>>>>>>>>>
>>>>>>>>>>> class OptionsWidget(FormWidget):
>>>>>>>>>>>
>>>>>>>>>>>     @staticmethod
>>>>>>>>>>>     def has_options(field):
>>>>>>>>>>>         """
>>>>>>>>>>>         checks if the field has selectable options
>>>>>>>>>>>
>>>>>>>>>>>         :param field: the field needing checking
>>>>>>>>>>>         :returns: True if the field has options
>>>>>>>>>>>         """
>>>>>>>>>>>
>>>>>>>>>>>         return hasattr(field.requires, 'options')
>>>>>>>>>>>
>>>>>>>>>>>     @classmethod
>>>>>>>>>>>     def widget(cls, field, value, **attributes):
>>>>>>>>>>>         """
>>>>>>>>>>>         generates a SELECT tag, including OPTIONs (only 1 option
>>>>>>>>>>> allowed)
>>>>>>>>>>>
>>>>>>>>>>>         see also: :meth:`FormWidget.widget`
>>>>>>>>>>>         """
>>>>>>>>>>>         default = dict(value=value) # HERE!!!!!!!!
>>>>>>>>>>>
>>>>>>>>>>> I am not pretty sure actually... And I don't really know, what
>>>>>>>>>>> could be done to keep submit multiple list order in case of plugin 
>>>>>>>>>>> use...
>>>>>>>>>>>
>>>>>>>>>>> I try naively to replace
>>>>>>>>>>>
>>>>>>>>>>> default = dict(value=value)
>>>>>>>>>>>
>>>>>>>>>>> By
>>>>>>>>>>>
>>>>>>>>>>> defautl = value
>>>>>>>>>>>
>>>>>>>>>>> But it failed.
>>>>>>>>>>>
>>>>>>>>>>> Richard
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Apr 19, 2012 at 3:43 PM, Richard Vézina <
>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> This is a part of the solution I think :
>>>>>>>>>>>>
>>>>>>>>>>>> http://www.ryancramer.com/**jour**nal/entries/select_**
>>>>>>>>>>>> multiple/<http://www.ryancramer.com/journal/entries/select_multiple/>
>>>>>>>>>>>>
>>>>>>>>>>>> Richard
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Apr 19, 2012 at 3:08 PM, Richard <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I would know if there is a way to tell to list:reference to
>>>>>>>>>>>>> not order the id of the reference table to keep the order in wich 
>>>>>>>>>>>>> the user
>>>>>>>>>>>>> has pick those element... At the same time I just thought that 
>>>>>>>>>>>>> this concept
>>>>>>>>>>>>> is useless except in case you use some javascript plugin like 
>>>>>>>>>>>>> Chosen
>>>>>>>>>>>>> Multiple Select 
>>>>>>>>>>>>> (http://harvesthq.github.com/**c**hosen/<http://harvesthq.github.com/chosen/>)
>>>>>>>>>>>>> because, you pick the element in a list and there is no way to 
>>>>>>>>>>>>> know which
>>>>>>>>>>>>> element in the list the user has selected first.
>>>>>>>>>>>>>
>>>>>>>>>>>>> My need is to allow users to select element from an other
>>>>>>>>>>>>> table and keep a more informative those selected thing. Like the 
>>>>>>>>>>>>> ingredient
>>>>>>>>>>>>> on the back panel of food box, the first ingredient more abondant 
>>>>>>>>>>>>> than the
>>>>>>>>>>>>> second an so on.
>>>>>>>>>>>>>
>>>>>>>>>>>>> So, for now I think I am stock with a text field. I would
>>>>>>>>>>>>> avoid a free text field because I would prefer user to always use 
>>>>>>>>>>>>> the same
>>>>>>>>>>>>> name for the same thing, but I can't do it with text type field. 
>>>>>>>>>>>>> What I
>>>>>>>>>>>>> thought is a list:reference field and a button beside the field 
>>>>>>>>>>>>> to allow
>>>>>>>>>>>>> allow user to add missing element name in the foreign table if 
>>>>>>>>>>>>> need without
>>>>>>>>>>>>> leave the original form. This can be done easily with the select 
>>>>>>>>>>>>> or add
>>>>>>>>>>>>> web2py slice : http://www.web2pyslices.com/****
>>>>>>>>>>>>> slice/show/1446/widget-select-****or-add-option<http://www.web2pyslices.com/slice/show/1446/widget-select-or-add-option>.
>>>>>>>>>>>>> Thanks to the author.
>>>>>>>>>>>>>
>>>>>>>>>>>>> But, I think that keeping the order of the selected element
>>>>>>>>>>>>> can't be done??
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks for help.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Richard
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to