Group Codes Proposal

I'd like to propose that we add a group code (or "slug") to the group table, and that it be used when creating variable names an in the ExpressionScript.

The Problem
Question groups are a great way to have survey building blocks, either for separate surveys or duplicating a block of questions. But since we now require unique question codes for each question, it's a lot of work to manage that. I propose that question codes be unique within groups, and group codes be unique within surveys.

Group codes could also be used in EM.

The Database
group_code (or slug) would be added to groups table, and make into a unique index (survey_id, group_code). During upgrade, we'd need a method to create a group code, either from the current group id (unique), the current order that the group is in with the survey (also unique, and a bit easier to understand) or the group name (checking for duplicates, etc.).

How it Helps
Suppose your survey has to do with children's names and ages. Right now, you'd create a group 'child1' with name and age questions, called child1_name, child1_age. For child 2, you export child1, import it as a new group, then change all the values one at a time. Then change all the conditions one at a time. Then do it again.

With a unique group code, you'd simply have 'name' and 'age' as qcodes, and a group_code of 'child1'. Internally this would map to 'child1_name'. Now when you import the 'child' group, you simply need to change one thing, the group_code, to child2. Now you have unique qcodes.

ExpressionScript
ExpressionScript would need to change to reflect that some expressions, especially conditions, are within-group only. For example, if you only want to ask the 'school' question if 'age' > 3, you'd need to indicate to EM that 'age' means "Age within this group". If you wanted a specific access, you'd need a format to say "child1.age", when you mean "the first one listed".

Group codes will also make import and exporting surveys easiers, and I'd like to see group_id dropped from everything except very low-level group edit functions.