def query_object_form(base_typeclass, obj_typeclass, obj_key): """ Query all data of an object. Args: base_typeclass: (string) candidate typeclass group. obj_typeclass: (string, optional) object's typeclass. If it is empty, use the typeclass of the object or use base typeclass as object's typeclass. obj_key: (string) object's key. If it is empty, query an empty form. """ candidate_typeclasses = TYPECLASS_SET.get_group(base_typeclass) if not candidate_typeclasses: raise MudderyError(ERR.no_table, "Can not find typeclass: %s" % base_typeclass) if not obj_typeclass: if obj_key: # Get typeclass from the object's record table_name = TYPECLASS("OBJECT").model_name record = general_query_mapper.get_record_by_key( table_name, obj_key) obj_typeclass = record.typeclass else: # Or use the base typeclass obj_typeclass = base_typeclass typeclass = TYPECLASS_SET.get(obj_typeclass) if not typeclass: raise MudderyError(ERR.no_table, "Can not find typeclass: %s" % obj_typeclass) table_names = typeclass.get_models() forms = [] for table_name in table_names: if obj_key: object_form = query_form(table_name, key=obj_key) else: object_form = query_form(table_name) forms.append({"table": table_name, "fields": object_form}) # add typeclasses if len(forms) > 0: for field in forms[0]["fields"]: if field["name"] == "typeclass": # set typeclass to the new value field["value"] = obj_typeclass field["type"] = "Select" field["choices"] = [ (key, cls.typeclass_name + " (" + key + ")") for key, cls in candidate_typeclasses.items() ] break return forms
def query_object_form(base_typeclass, obj_typeclass, obj_key): """ Query all data of an object. Args: base_typeclass: (string) candidate typeclass group. obj_typeclass: (string, optional) object's typeclass. If it is empty, use the typeclass of the object or use base typeclass as object's typeclass. obj_key: (string) object's key. If it is empty, query an empty form. """ candidate_typeclasses = TYPECLASS_SET.get_group(base_typeclass) if not candidate_typeclasses: raise MudderyError(ERR.no_table, "Can not find typeclass: %s" % base_typeclass) if not obj_typeclass: if obj_key: # Get typeclass from the object's record table_name = TYPECLASS("OBJECT").model_name record = general_query_mapper.get_record_by_key(table_name, obj_key) obj_typeclass = record.typeclass else: # Or use the base typeclass obj_typeclass = base_typeclass typeclass = TYPECLASS_SET.get(obj_typeclass) if not typeclass: raise MudderyError(ERR.no_table, "Can not find typeclass: %s" % obj_typeclass) table_names = typeclass.get_models() forms = [] for table_name in table_names: if obj_key: object_form = query_form(table_name, key=obj_key) else: object_form = query_form(table_name) forms.append({"table": table_name, "fields": object_form}) # add typeclasses if len(forms) > 0: for field in forms[0]["fields"]: if field["name"] == "typeclass": # set typeclass to the new value field["value"] = obj_typeclass field["type"] = "Select" field["choices"] = [(key, cls.typeclass_name + " (" + key + ")") for key, cls in candidate_typeclasses.items()] break return forms
def delete_object(obj_key, base_typeclass=None): """ Delete an object from all tables under the base typeclass. """ if not base_typeclass: table_name = TYPECLASS("OBJECT").model_name record = general_query_mapper.get_record_by_key(table_name, obj_key) base_typeclass = record.typeclass typeclasses = TYPECLASS_SET.get_group(base_typeclass) tables = set() for key, value in typeclasses.items(): tables.update(value.get_models()) with transaction.atomic(): for table in tables: try: general_query_mapper.delete_record_by_key(table, obj_key) except ObjectDoesNotExist: pass
def save_object_form(tables, obj_typeclass, obj_key): """ Save all data of an object. Args: tables: (list) a list of table data. [{ "table": (string) table's name. "record": (string, optional) record's id. If it is empty, add a new record. }] obj_typeclass: (string) object's typeclass. obj_key: (string) current object's key. If it is empty or changed, query an empty form. """ if not tables: raise MudderyError(ERR.invalid_form, "Invalid form.", data="Empty form.") # Get object's new key from the first form. try: new_key = tables[0]["values"]["key"] except KeyError: new_key = obj_key if not new_key: # Does not has a new key, generate a new key. index = SYSTEM_DATA.get_object_index() new_key = "%s_auto_%s" % (obj_typeclass, index) for table in tables: table["values"]["key"] = new_key forms = [] for table in tables: table_name = table["table"] form_values = table["values"] form_class = FORM_SET.get(table_name) form = None if obj_key: try: # Query the current object's data. record = general_query_mapper.get_record_by_key(table_name, obj_key) form = form_class(form_values, instance=record) except ObjectDoesNotExist: form = None if not form: # Get empty data. form = form_class(form_values) forms.append(form) # check data for form in forms: if not form.is_valid(): raise MudderyError(ERR.invalid_form, "Invalid form.", data=form.errors) # Save data with transaction.atomic(): for form in forms: form.save() return new_key
obj_key = obj_typeclass + "_" + str(index) for table in tables: table["values"]["key"] = obj_key forms = [] for table in tables: table_name = table["table"] form_values = table["values"] form_class = FORM_SET.get(table_name) form = None if not new_obj: try: # Query record's data. record = general_query_mapper.get_record_by_key( table_name, obj_key) form = form_class(form_values, instance=record) except ObjectDoesNotExist: form = None if not form: # Get empty data. form = form_class(form_values) forms.append(form) # check data for form in forms: if not form.is_valid(): raise MudderyError(ERR.invalid_form, "Invalid form.",
def query_object_level_properties(object_key, level): """ Query properties of a level of the given object. Args: object_key: (string) object' key. level: (number) object's level. """ # Get fields. fields = [] # Object's key. fields.append({ "name": "key", "label": _("Key"), "disabled": True, "help_text": "", "type": "TextInput", "value": object_key }) # Object's level. fields.append({ "name": "level", "label": _("Level"), "disabled": False, "help_text": "", "type": "NumberInput", "value": level }) # Get typeclass from the object's record table_name = TYPECLASS("OBJECT").model_name record = general_query_mapper.get_record_by_key(table_name, object_key) obj_typeclass = record.typeclass properties_info = TYPECLASS(obj_typeclass).get_properties_info() # Get properties. data = {} records = OBJECT_PROPERTIES.get_properties(object_key, level) for record in records: data[record.property] = record.value # Set fields. for key, info in properties_info.items(): if info["mutable"]: continue field = { "name": key, "label": info["name"], "disabled": False, "help_text": info["desc"], "type": "TextInput", "value": data.get(key, "") } fields.append(field) return fields