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