def create_form(self, resource=None, edit_form=False): """Return form with fields loaded from DB. :param object resource: Optional map object :param bool edit_form: Set if edit form """ form = MapForm(self.config_models, obj=resource) if edit_form: # select responsible contact form.responsible.data = self.ContactsHelper.resource_contact_id( resource.gdi_oid, self.ContactsHelper.ROLE_RESPONSIBLE) # add map layers for resource on edit for map_layer in resource.map_layers: ows_layer = map_layer.owslayer form.sublayers.append_entry({ 'layer_id': ows_layer.gdi_oid, 'layer_name': ows_layer.name, 'layer_transparency': map_layer.layer_transparency, 'layer_active': map_layer.layer_active, 'layer_order': map_layer.layer_order }) if resource.thumbnail_image: # set that thumbnail image is present form.thumbnail_present = True # select background layer form.background_layer.data = resource.gdi_oid_default_bg_layer # add permissions for resource on edit roles = self.PermissionsHelper.resource_roles(resource.gdi_oid) for role in roles: form.permissions.append_entry({ 'role_id': role.id, 'role_name': role.name, 'read': True }) # load related resources from DB session = self.session() query = session.query(self.BackgroundLayer) \ .order_by(self.BackgroundLayer.name) background_layers = query.all() session.close() # set choices for responsible select field form.responsible.choices = [(0, "")] + \ self.ContactsHelper.person_choices() # reorder fields by layer_order form.sublayers.entries.sort(key=lambda f: int(f.layer_order.data)) # set choices for map layer select field form.layer.choices = self.wms_layer_choices() # set choices for background layer select field form.background_layer.choices = [(0, "")] + [ (bg_layer.gdi_oid, bg_layer.name) for bg_layer in background_layers ] # collect role ids from permissions subform role_permission_ids = [ int(permission.data['role_id']) for permission in form.permissions ] # set choices for role permission select field # skip roles from permissions subform roles = self.PermissionsHelper.roles() form.role.choices = [(role.id, role.name) for role in roles if role.id not in role_permission_ids] return form