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 <[email protected]> properties: branch-nick: forms + timestamp: 2010-12-01 22:00:52.105999947 +0100 committer: Reinhard Müller <[email protected]> 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 [email protected] 3117 [email protected] 3118 [email protected] 3119 [email protected] 3120 [email protected] 3121 [email protected] 3122 [email protected] 3123 [email protected] 3124 [email protected] 3125 [email protected] 3126 [email protected] 3127 [email protected] 3128 [email protected] 3129 [email protected] 3130 [email protected] 3131 [email protected] 3132 [email protected] 3133 [email protected] 3134 [email protected] 3135 [email protected] 3136 [email protected] 3137 [email protected] 3138 [email protected] 3139 [email protected] 3140 [email protected] 3141 [email protected] 3142 [email protected] 3143 [email protected] 3144 [email protected] 3145 [email protected] 3146 [email protected] 3147 [email protected] 3148 [email protected] 3149 [email protected] 3150 [email protected] 3151 [email protected] 3152 [email protected] 3153 [email protected] 3154 [email protected] 3155 [email protected] 3156 [email protected] + 3116 [email protected] 3117 [email protected] 3118 [email protected] 3119 [email protected] 3120 [email protected] 3121 [email protected] 3122 [email protected] 3123 [email protected] 3124 [email protected] 3125 [email protected] 3126 [email protected] 3127 [email protected] 3128 [email protected] 3129 [email protected] 3130 [email protected] 3131 [email protected] 3132 [email protected] 3133 [email protected] 3134 [email protected] 3135 [email protected] 3136 [email protected] 3137 [email protected] 3138 [email protected] 3139 [email protected] 3140 [email protected] 3141 [email protected] 3142 [email protected] 3143 [email protected] 3144 [email protected] 3145 [email protected] 3146 [email protected] 3147 [email protected] 3148 [email protected] 3149 [email protected] 3150 [email protected] 3151 [email protected] 3152 [email protected] 3153 [email protected] 3154 [email protected] 3155 [email protected] 3156 [email protected] 3157 [email protected] Name: bzr:text-parents - src/GFObjects/GFEntry.py [email protected] + src/GFForm.py [email protected] src/GFObjects/GFBlock.py [email protected] src/GFObjects/GFField.py [email protected] src/GFParser.py [email protected] 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 [email protected] http://lists.gnu.org/mailman/listinfo/commit-gnue
