20130128¶
Number fields in grids (continued)¶
Solved several subtil problems with “number” fields in a grid: quantities, percentages, prices,…
- Ext.grid.NumberColumn renders null values as “0,00” . That’s why we have Lino.NullNumberColumn who renders them as spaces. 
- Quantity fields accept values like “2:30” or “2/3” and therefore are stored as CharField, not DecimalField. But they are right aligned like number fields. 
What’s allowed on a registered invoice?¶
Registrered sales invoice didn’t disable their fields and their items.
Here is the new code:
class Registrable(model.Model):
    @classmethod
    def get_registrable_fields(cls,site):
        yield 'date'
    @classmethod
    def site_setup(cls,site):
        super(Registrable,cls).site_setup(site)
        self._registrable_fields = set(self.get_registrable_fields(site))
    def disabled_fields(self,ar):
        if not self.state.editable:
            return self._registrable_fields
        return super(Registrable,self).disabled_fields(ar)
Generators or lists?¶
For the above API I wondered whether a generator function is more efficient than to return a list. Until now I’ve been believing this intuitively, but here is a test suite which proves it:
import time
def testit(VALUES,CALLS):
    def get_numbers_gen():
        for i in range(VALUES): yield i
    def get_numbers_list():
        l = []
        for i in range(VALUES): l.append(i)
        return l
    def runit(f):
        now = time.time()
        for i in range(CALLS):
            set(f())
        return 1 + time.time() - now
    return [VALUES,CALLS,runit(get_numbers_gen)/runit(get_numbers_list)]
def suite():
    yield testit(1,10000)
    yield testit(10000,1)
    yield testit(1000,1000)
    yield testit(10,10000)
    yield testit(10000,100)
    yield testit(100000,10)
for row in suite():
    print row
The results are clear on my machine: the generator version takes less time than the list version, leading to a ratio < 1:
$ python tt.py
[1, 10000, 0.9835269406046683]
[10000, 1, 1.0]
[1000, 1000, 0.8884890661076352]
[10, 10000, 0.9849482286261549]
[10000, 100, 0.9123783513935135]
[100000, 10, 0.8948787720221897]
$ python tt.py
[1, 10000, 0.9990160538337997]
[10000, 1, 1.0150001049041748]
[1000, 1000, 0.9090909090909091]
[10, 10000, 0.9712429171108448]
[10000, 100, 0.9137090679526116]
[100000, 10, 0.8955525776438877]
Miscellaneous¶
- views.py used Http403 instead of PermissionDenied 
- ChangeStateAction was broken. Trying to run any ChangeStateAction caused an error message “global name ‘dd’ is not defined”. Fixed. 
- hidden_elements 
Zwei DSBE-spezifische Bugs¶
- watch_tim setzte das Feld “Dienst” der primären Begleitung nicht. 
- Coaching.full_clean() - if not self.type and self.user: self.type = self.user.coaching_type 
Comment dire BCSS en allemand?¶
Die Abkürzung “KBSS” ist offenbar falsch: die “offizielle” Übersetzung für BCSS lautet “Zentrale Datenbank der sozialen Sicherheit (ZDSS)”. Zuständig für sowas ist die Zentrale Dienststelle für Deutsche Übersetzungen (ZDDÜ) in Malmedy, http://www.scta.be