Author: reinhard
Date: 2010-12-01 15:02:47 -0600 (Wed, 01 Dec 2010)
New Revision: 10246

Modified:
   trunk/gnue-forms/
   trunk/gnue-forms/src/GFForm.py
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFField.py
   trunk/gnue-forms/src/GFParser.py
Log:
Introduced separate block attribute "insertable". This allows for blocks where
new records can only be inserted through trigger code (insertable="N") but
these newly inserted records can still be edited by the user (editable="Y").



Property changes on: trunk/gnue-forms
___________________________________________________________________
Name: bzr:revision-info
   - timestamp: 2010-11-22 09:33:36.551000118 +0100
committer: Reinhard Müller <reinhard.muel...@bytewise.at>
properties: 
        branch-nick: forms

   + timestamp: 2010-12-01 22:00:52.105999947 +0100
committer: Reinhard Müller <reinhard.muel...@bytewise.at>
properties: 
        branch-nick: forms

Name: bzr:file-ids
   - src/GFObjects/GFEntry.py   
1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFEntry.py

   + src/GFForm.py      
6...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFForm.py
src/GFObjects/GFBlock.py        
1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFBlock.py
src/GFObjects/GFField.py        
1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFField.py
src/GFParser.py 
1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFParser.py

Name: bzr:revision-id:v4
   - 3116 reinhard.muel...@bytewise.at-20100426083500-vtmq0qvd7htz02zx
3117 reinhard.muel...@bytewise.at-20100512151744-2jx8tmtop30kl5n0
3118 reinhard.muel...@bytewise.at-20100705094014-ks9yv7b8gs6ychrb
3119 reinhard.muel...@bytewise.at-20100706085143-hyxadj30ayg28jpx
3120 reinhard.muel...@bytewise.at-20100706140804-sn3npws1ykm81ubx
3121 reinhard.muel...@bytewise.at-20100909134008-5p7jq048nkutldse
3122 reinhard.muel...@bytewise.at-20100923144753-e8hthxho7n5mwg9z
3123 reinhard.muel...@bytewise.at-20100929193018-7r3injoy8g28fwm6
3124 reinhard.muel...@bytewise.at-20100930073631-ilf6smgjt6mfvkpz
3125 reinhard.muel...@bytewise.at-20101011191957-yaj9rkqbervc91ac
3126 reinhard.muel...@bytewise.at-20101020084039-jmfxjbctt6vc2usd
3127 reinhard.muel...@bytewise.at-20101020124425-0dpprxsmanmaenty
3128 reinhard.muel...@bytewise.at-20101020124541-zppkmzww1lnsk8x4
3129 reinhard.muel...@bytewise.at-20101020141905-vjg7r3wihnm7mxam
3130 reinhard.muel...@bytewise.at-20101020143045-pf9ywx1s3hdqbsh7
3131 reinhard.muel...@bytewise.at-20101020143328-ctfmr3fpp5quq1eo
3132 reinhard.muel...@bytewise.at-20101020152139-rlllh9m2qn45atcz
3133 reinhard.muel...@bytewise.at-20101020163022-tgnjcv18nzrc5sfw
3134 reinhard.muel...@bytewise.at-20101020165411-krluvclyw61ef9zp
3135 reinhard.muel...@bytewise.at-20101020185529-pmdkwkm59c1h630f
3136 reinhard.muel...@bytewise.at-20101020195954-1kd9avbmzkrzwzbt
3137 reinhard.muel...@bytewise.at-20101020202048-8q84nx5a54ifxkla
3138 reinhard.muel...@bytewise.at-20101027211256-o7pi879h2x1ceri2
3139 reinhard.muel...@bytewise.at-20101028135833-wftnu2r1cocknxyf
3140 reinhard.muel...@bytewise.at-20101028144709-dbamfa759xoeh127
3141 reinhard.muel...@bytewise.at-20101028145355-uhqftv7n1bcvuz8l
3142 reinhard.muel...@bytewise.at-20101028151042-ueeqwlufysjbke01
3143 reinhard.muel...@bytewise.at-20101028153459-522p7574jw2e11jj
3144 reinhard.muel...@bytewise.at-20101028164956-gua27xm7ad12a218
3145 reinhard.muel...@bytewise.at-20101028181046-hxaehghl84zx9ye0
3146 reinhard.muel...@bytewise.at-20101028194606-598w1lqua0te1m7j
3147 reinhard.muel...@bytewise.at-20101028205855-5k1f08wfdgofenjd
3148 reinhard.muel...@bytewise.at-20101102154340-basdvi9wrxzbx4va
3149 reinhard.muel...@bytewise.at-20101102155520-bbh74pv3qjur1epo
3150 reinhard.muel...@bytewise.at-20101112154024-57tv8mf0wbiycuw1
3151 reinhard.muel...@bytewise.at-20101112155954-ky2g6irsodlzg6yy
3152 reinhard.muel...@bytewise.at-20101114210345-8zsz8bdxtwjytkss
3153 reinhard.muel...@bytewise.at-20101114213813-m10tqf7r2elldh6l
3154 reinhard.muel...@bytewise.at-20101115202536-k0zrvggyt6jy8h0y
3155 reinhard.muel...@bytewise.at-20101122074637-ydmqkqy3udno2n5m
3156 reinhard.muel...@bytewise.at-20101122083336-1n0xys8y4ivtfzo4

   + 3116 reinhard.muel...@bytewise.at-20100426083500-vtmq0qvd7htz02zx
3117 reinhard.muel...@bytewise.at-20100512151744-2jx8tmtop30kl5n0
3118 reinhard.muel...@bytewise.at-20100705094014-ks9yv7b8gs6ychrb
3119 reinhard.muel...@bytewise.at-20100706085143-hyxadj30ayg28jpx
3120 reinhard.muel...@bytewise.at-20100706140804-sn3npws1ykm81ubx
3121 reinhard.muel...@bytewise.at-20100909134008-5p7jq048nkutldse
3122 reinhard.muel...@bytewise.at-20100923144753-e8hthxho7n5mwg9z
3123 reinhard.muel...@bytewise.at-20100929193018-7r3injoy8g28fwm6
3124 reinhard.muel...@bytewise.at-20100930073631-ilf6smgjt6mfvkpz
3125 reinhard.muel...@bytewise.at-20101011191957-yaj9rkqbervc91ac
3126 reinhard.muel...@bytewise.at-20101020084039-jmfxjbctt6vc2usd
3127 reinhard.muel...@bytewise.at-20101020124425-0dpprxsmanmaenty
3128 reinhard.muel...@bytewise.at-20101020124541-zppkmzww1lnsk8x4
3129 reinhard.muel...@bytewise.at-20101020141905-vjg7r3wihnm7mxam
3130 reinhard.muel...@bytewise.at-20101020143045-pf9ywx1s3hdqbsh7
3131 reinhard.muel...@bytewise.at-20101020143328-ctfmr3fpp5quq1eo
3132 reinhard.muel...@bytewise.at-20101020152139-rlllh9m2qn45atcz
3133 reinhard.muel...@bytewise.at-20101020163022-tgnjcv18nzrc5sfw
3134 reinhard.muel...@bytewise.at-20101020165411-krluvclyw61ef9zp
3135 reinhard.muel...@bytewise.at-20101020185529-pmdkwkm59c1h630f
3136 reinhard.muel...@bytewise.at-20101020195954-1kd9avbmzkrzwzbt
3137 reinhard.muel...@bytewise.at-20101020202048-8q84nx5a54ifxkla
3138 reinhard.muel...@bytewise.at-20101027211256-o7pi879h2x1ceri2
3139 reinhard.muel...@bytewise.at-20101028135833-wftnu2r1cocknxyf
3140 reinhard.muel...@bytewise.at-20101028144709-dbamfa759xoeh127
3141 reinhard.muel...@bytewise.at-20101028145355-uhqftv7n1bcvuz8l
3142 reinhard.muel...@bytewise.at-20101028151042-ueeqwlufysjbke01
3143 reinhard.muel...@bytewise.at-20101028153459-522p7574jw2e11jj
3144 reinhard.muel...@bytewise.at-20101028164956-gua27xm7ad12a218
3145 reinhard.muel...@bytewise.at-20101028181046-hxaehghl84zx9ye0
3146 reinhard.muel...@bytewise.at-20101028194606-598w1lqua0te1m7j
3147 reinhard.muel...@bytewise.at-20101028205855-5k1f08wfdgofenjd
3148 reinhard.muel...@bytewise.at-20101102154340-basdvi9wrxzbx4va
3149 reinhard.muel...@bytewise.at-20101102155520-bbh74pv3qjur1epo
3150 reinhard.muel...@bytewise.at-20101112154024-57tv8mf0wbiycuw1
3151 reinhard.muel...@bytewise.at-20101112155954-ky2g6irsodlzg6yy
3152 reinhard.muel...@bytewise.at-20101114210345-8zsz8bdxtwjytkss
3153 reinhard.muel...@bytewise.at-20101114213813-m10tqf7r2elldh6l
3154 reinhard.muel...@bytewise.at-20101115202536-k0zrvggyt6jy8h0y
3155 reinhard.muel...@bytewise.at-20101122074637-ydmqkqy3udno2n5m
3156 reinhard.muel...@bytewise.at-20101122083336-1n0xys8y4ivtfzo4
3157 reinhard.muel...@bytewise.at-20101201210052-n8pz9fkj6z95zlo2

Name: bzr:text-parents
   - src/GFObjects/GFEntry.py   
reinhard.muel...@bytewise.at-20101112154024-57tv8mf0wbiycuw1

   + src/GFForm.py      
reinhard.muel...@bytewise.at-20101122074637-ydmqkqy3udno2n5m
src/GFObjects/GFBlock.py        
reinhard.muel...@bytewise.at-20101028151042-ueeqwlufysjbke01
src/GFObjects/GFField.py        
reinhard.muel...@bytewise.at-20101115202536-k0zrvggyt6jy8h0y
src/GFParser.py reinhard.muel...@bytewise.at-20101112155954-ky2g6irsodlzg6yy


Modified: trunk/gnue-forms/src/GFForm.py
===================================================================
--- trunk/gnue-forms/src/GFForm.py      2010-11-30 14:26:27 UTC (rev 10245)
+++ trunk/gnue-forms/src/GFForm.py      2010-12-01 21:02:47 UTC (rev 10246)
@@ -842,82 +842,85 @@
         currentBlock = self._currentBlock
         mode = self.getCurrentMode()
 
-        if currentBlock is None or ( \
-            currentBlock.transparent and not ( \
-              currentBlock.autoNextRecord and not ( \
-                  currentBlock.get_record_status() in [None, 'empty'] or \
-                  (not reverse and currentBlock.is_last_record() and \
-                       not (currentBlock.autoCreate and \
-                            currentBlock.editable in ('Y', 'new')) or \
-                  (reverse and currentBlock.is_first_record()) \
-              )))):
-          source = self._currentPage.get_focus_order()
-          stayInBlock = False
+        if currentBlock is None:
+            stayInBlock = False
+        elif not currentBlock.transparent:
+            stayInBlock = True
+        elif currentBlock.autoNextRecord:
+            if reverse:
+                operation = 'prev_record'
+            else:
+                operation = 'next_record'
+            stayInBlock = operation in currentBlock.get_possible_operations()
         else:
-          source = currentBlock.get_focus_order()
-          stayInBlock = True
+            stayInBlock = False
 
+        if stayInBlock:
+            source = currentBlock.get_focus_order()
+        else:
+            source = self._currentPage.get_focus_order()
+
         # If we want the previous entry, then reverse the focusorder we're 
using
         if reverse:
-          source.reverse()
+            source.reverse()
 
         nextEntry = None
         firstEntry = None
         keepNext = False
 
         for object in source:
+            if not object.is_navigable(mode):
+                continue
 
-          if object.is_navigable(mode):
-            if stayInBlock and \
-               (currentBlock != object.get_block()):
-              continue
+            if stayInBlock and (currentBlock != object.get_block()):
+                continue
 
             # Put the first field as the next to rollover
             if nextEntry == None:
-              nextEntry = object
-              firstEntry = object
+                nextEntry = object
+                firstEntry = object
 
             # If we're at the current focused entry,
             # then the next entry will be what we want
             if object == self._currentEntry or self._currentEntry is None:
-              keepNext = True
+                keepNext = True
 
             # If we've already passed the current entry
             # Then this is the entry to return
             elif keepNext:
-              nextEntry = object
-              break
+                nextEntry = object
+                break
 
-        # If we've cycled back around to the first entry, then do special 
checks
-        if nextEntry == firstEntry:
+        # If we've not yet reached the end of the entry list, we just forward
+        # the focus to the next entry.
+        if nextEntry != firstEntry:
+            self.change_focus(nextEntry, 0)
+            return
 
-          # If we should navigate to the next record, do it...
-          if currentBlock is not None \
-                  and reverse and currentBlock.autoNextRecord \
-                  and not currentBlock.is_first_record():
-            self.change_focus(nextEntry, -1)
-          elif currentBlock is not None and not reverse and \
-             currentBlock.autoNextRecord and \
-             not currentBlock.get_record_status() in [None, 'empty'] and \
-             not (not currentBlock.autoCreate and \
-                  currentBlock.is_last_record()):
-               self.change_focus(nextEntry, +1)
+        # We have reached the end of the entry list. Do we want to navigate to
+        # the next record?
+        if stayInBlock:
+            if currentBlock.autoNextRecord and \
+                    operation in currentBlock.get_possible_operations():
+                if reverse:
+                    offset = -1
+                else:
+                    offset = 1
+            else:
+                offset = 0
+            self.change_focus(nextEntry, offset)
+            return
 
-          # Otherwise, are we transparent? If so, go to next block/page
-          elif (currentBlock is None or currentBlock.transparent) and \
-             self._currentPage.transparent:
-
-            # Jump to the next/(previous) page if block is page as transparent
+        # We've reached the end of the page. Do we want to jump to the next
+        # page?
+        if  self._currentPage.transparent:
             pages = self._layout._pageList
             i = pages.index(self._currentPage)
             list = pages[i+1:] + pages[:i]
             self.__find_and_change_focus(list, reverse)
-          else:
+        else:
             self.change_focus(nextEntry, 0)
 
-        else:
-          self.change_focus(nextEntry, 0)
-
     # -------------------------------------------------------------------------
 
     def previous_entry(self):

Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2010-11-30 14:26:27 UTC (rev 
10245)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2010-12-01 21:02:47 UTC (rev 
10246)
@@ -234,9 +234,16 @@
             del self.__dict__['restrictDelete']
 
         if hasattr(self, 'restrictInsert') and self.restrictInsert:
-            self.editable = 'update'
+            self.insertable = False
             del self.__dict__['restrictInsert']
 
+        if self.editable in ('N', 'update'):
+            # Don't let the user insert records if they wouldn't be editable
+            # afterwards. FIXME: Warn about this in 0.8, remove in 0.9. It
+            # might make sense to insert new records that can only be modified
+            # through trigger code.
+            self.insertable = False
+
         if hasattr(self,'datasource'):
             self.datasource = self.datasource.lower()
 
@@ -1644,14 +1651,11 @@
         if self._form.readonly:
             return False
 
-        if self.editable in ['N', 'update']:
-            return False
-
         for field in self._fieldMap.itervalues():
             if field.autosearch:
                 return False
 
-        return True
+        return self.insertable
 
     # -------------------------------------------------------------------------
 

Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py   2010-11-30 14:26:27 UTC (rev 
10245)
+++ trunk/gnue-forms/src/GFObjects/GFField.py   2010-12-01 21:02:47 UTC (rev 
10246)
@@ -630,7 +630,7 @@
                     # keywords to be strings.
                     if not self._block.search_record(
                             **{str(self.name): self.__autosearch_value}) and \
-                            self._block.editable in ('Y', 'new') and \
+                            self._block.insertable and \
                             not self._form.readonly:
                         self._block.new_record(
                                 **{str(self.name): self.__autosearch_value})

Modified: trunk/gnue-forms/src/GFParser.py
===================================================================
--- trunk/gnue-forms/src/GFParser.py    2010-11-30 14:26:27 UTC (rev 10245)
+++ trunk/gnue-forms/src/GFParser.py    2010-12-01 21:02:47 UTC (rev 10246)
@@ -409,22 +409,27 @@
                'Description': 'If set, then the block is cleared/emptied on '
                               'a commit.'},
             'editable': {
-               'Description': 'Can records be edited/created?',
+               'Description': 'Can the user edit records?',
                'Label': _('Allow Editing'),
                'ValueSet': {
                   'Y': {'Label': _('Yes')},
                   'N': {'Label': _('No')},
-                  'update': {'Label': _('Update Only')},
-                  'new': {'Label': _('New Records Only')} },
+                  'update': {'Label': _('Only existing records')},
+                  'new': {'Label': _('Only new records')} },
                'Typecast': GTypecast.text,
                'Default': 'Y' },
             'queryable': {
-               'Description': 'Can records be queried?',
+               'Description': 'Can the user query (filter) this block?',
                'Label': _('Allow Querying'),
                'Typecast': GTypecast.boolean,
                'Default': True },
+            'insertable': {
+               'Description': 'Can the user insert records?',
+               'Label': _('Allow Inserts'),
+               'Typecast': GTypecast.boolean,
+               'Default': True },
             'deletable': {
-               'Description': 'Can records be deleted?',
+               'Description': 'Can the user delete records?',
                'Label': _('Allow Deletes'),
                'Typecast': GTypecast.boolean,
                'Default': True },
@@ -444,7 +449,7 @@
                'Typecast': GTypecast.boolean,
                'Default': False,
                'Label': _('Prevent Inserts'),
-               'Deprecated': 'Use editable="update"',
+               'Deprecated': 'Use insertable="N"',
                'Description': 'If set then the user will be unable to request '
                               'that new records be inserted into the block.' },
             'datasource': {


_______________________________________________
commit-gnue mailing list
commit-gnue@gnu.org
http://lists.gnu.org/mailman/listinfo/commit-gnue

Reply via email to