def check_dependencies(self): msg = super(CustomFieldEdit, self).check_dependencies() if msg: return msg custom_values = CustomFieldValue.query.filter_by(custom_field=self.obj) non_empty_values = custom_values.filter( (CustomFieldValue.value != None) & (CustomFieldValue.value != u'') | (CustomFieldValue.choice != None)) if non_empty_values.count(): return ("Unable to remove the custom field. There are " "participants with values for this field.") # Clean up empty values custom_values.delete() db.session.commit() printout_fields = [ getattr(self.obj.meeting, field, None) for field in Meeting.PRINTOUT_FIELDS ] if self.obj in printout_fields: return ("This field is currently selected as a printout field") count = Rule.get_rules_for_fields([self.obj]).count() if count: return ("Unable to remove the custom field. There are rules" "defined for this field.")
def check_dependencies(self): msg = super(CustomFieldEdit, self).check_dependencies() if not msg: count = Rule.get_rules_for_fields([self.obj]).count() if count: msg = ("Unable to remove the custom field. There are rules " "defined for this field.") return msg
def save(self): rule = self.rule or Rule(meeting=g.meeting) rule.name = self.name.data rule.rule_type = g.rule_type # if edit, delete all conditions and actions for this rule and their # corresponding values if rule.id: Condition.query.filter_by(rule=rule).delete() Action.query.filter_by(rule=rule).delete() for condition_form in self.conditions: condition_form.save(rule) for action_form in self.actions: action_form.save(rule) if not rule.id: db.session.add(rule) db.session.commit()
def custom_form_factory(form, field_types=None, field_slugs=None, excluded_field_types=None, registration_fields=False): fields = (CustomField.query.filter_by(meeting_id=g.meeting.id) .order_by(CustomField.sort)) if field_types: fields = fields.filter(CustomField.field_type.in_(field_types)) if field_slugs: fields = fields.filter(CustomField.slug.in_(field_slugs)) if excluded_field_types: fields = fields.filter( ~CustomField.field_type.in_(excluded_field_types)) if registration_fields: fields = fields.for_registration() if getattr(form, 'CUSTOM_FIELDS_TYPE', None): fields = fields.filter_by(custom_field_type=form.CUSTOM_FIELDS_TYPE) form_attrs = { '_custom_fields': OrderedMultiDict({c.slug: c for c in fields}), } for f in fields: attrs = {'label': unicode(CustomFieldLabel(f.label)), 'validators': [], 'render_kw': {}, 'description': f.hint} data = _CUSTOM_FIELDS_MAP[f.field_type.code] # overwrite data if _CUSTOM_FIELDS_MAP attribute is present on form form_fields_map = getattr(form, '_CUSTOM_FIELDS_MAP', None) if form_fields_map: try: data = form_fields_map[f.field_type.code] except KeyError: pass if f.required: attrs['validators'].append(DataRequired()) attrs['validators'].extend(data.get('validators', [])) if f.max_length: attrs['validators'].append(Length(max=f.max_length)) if f.field_type.code == CustomField.SELECT: query = CustomFieldChoice.query.filter_by(custom_field=f) attrs['choices'] = [(unicode(c.value), __(c.value.english)) for c in query] if not f.required: attrs['choices'] = [('', '---')] + attrs['choices'] if f.slug == 'title': attrs['choices'] = [choice for choice in attrs['choices'] if choice[0] in app.config['TITLE_CHOICES']] attrs['coerce'] = unicode if f.field_type.code == CustomField.LANGUAGE: attrs['choices'] = [i for i in Participant.LANGUAGE_CHOICES if i[0].lower() in app.config['TRANSLATIONS']] if not f.required: attrs['choices'] = [('', '---')] + attrs['choices'] attrs['coerce'] = unicode if f.field_type.code == CustomField.CATEGORY: query = Category.get_categories_for_meeting( form.CUSTOM_FIELDS_TYPE) if registration_fields: query = query.filter_by(visible_on_registration_form=True) attrs['choices'] = [(c.id, c) for c in query] attrs['coerce'] = int if f.field_type.code in (CustomField.MULTI_CHECKBOX, CustomField.RADIO): query = CustomFieldChoice.query.filter_by(custom_field=f) attrs['choices'] = [(unicode(c.value), c.value) for c in query] attrs['coerce'] = unicode if f.field_type.code == CustomField.IMAGE and f.photo_size and f.photo_size.code: attrs['render_kw']["data-photoSize"] = f.photo_size.code for coord in ("x1", "y1", "x2", "y2"): form_attrs['%s_%s_' % (f.slug, coord)] = HiddenField(default=0) # set field to form # _set_rules_for_custom_fields(f, attrs) field = data['field'](**attrs) setattr(field, 'field_type', f.field_type.code) form_attrs[f.slug] = field form_attrs['rules'] = Rule.get_rules_for_fields(fields) return type(form)(form.__name__, (form,), form_attrs)
def validate_required(self, field): if self.obj and field.data: count = Rule.get_rules_for_fields([self.obj]).count() if count: raise ValidationError('This custom field cannot be required ' 'as there are rules defined for it.')
def validate_field_type(self, field): if self.obj and field.data != self.obj.field_type: count = Rule.get_rules_for_fields([self.obj]).count() if count: raise ValidationError('Custom field type cannot be changed as ' 'there are rules defined for this field')
def validate_field_type(self, field): if self.obj and field.data != self.obj.field_type: count = Rule.get_rules_for_fields([self.obj]).count() if count: raise ValidationError('Custom field type cannot be changed as ' 'here are rules defined for this field')
def custom_form_factory(form, field_types=[], field_slugs=[], excluded_field_types=[], registration_fields=False): fields = (CustomField.query.filter_by(meeting_id=g.meeting.id) .order_by(CustomField.sort)) form_attrs = { '_custom_fields': OrderedMultiDict({c.slug: c for c in fields}), } if field_types: fields = fields.filter(CustomField.field_type.in_(field_types)) if field_slugs: fields = fields.filter(CustomField.slug.in_(field_slugs)) if excluded_field_types: fields = fields.filter( ~CustomField.field_type.in_(excluded_field_types)) if registration_fields: fields = fields.for_registration() if getattr(form, 'CUSTOM_FIELDS_TYPE', None): fields = fields.filter_by(custom_field_type=form.CUSTOM_FIELDS_TYPE) for f in fields: attrs = {'label': unicode(CustomFieldLabel(f.label)), 'validators': [], 'description': f.hint} data = _CUSTOM_FIELDS_MAP[f.field_type.code] # overwrite data if _CUSTOM_FIELDS_MAP attribute is present on form form_fields_map = getattr(form, '_CUSTOM_FIELDS_MAP', None) if form_fields_map: try: data = form_fields_map[f.field_type.code] except KeyError: pass if f.required: attrs['validators'].append(DataRequired()) attrs['validators'].extend(data.get('validators', [])) if f.max_length: attrs['validators'].append(Length(max=f.max_length)) if f.field_type.code == CustomField.SELECT: query = CustomFieldChoice.query.filter_by(custom_field=f) attrs['choices'] = [(unicode(c.value), __(c.value.english)) for c in query] if not f.required: attrs['choices'] = [('', '---')] + attrs['choices'] attrs['coerce'] = unicode if f.field_type.code == CustomField.LANGUAGE: attrs['choices'] = [i for i in Participant.LANGUAGE_CHOICES if i[0].lower() in app.config['TRANSLATIONS']] if not f.required: attrs['choices'] = [('', '---')] + attrs['choices'] attrs['coerce'] = unicode if f.field_type.code == CustomField.CATEGORY: query = Category.get_categories_for_meeting( form.CUSTOM_FIELDS_TYPE) if registration_fields: query = query.filter_by(visible_on_registration_form=True) attrs['choices'] = [(c.id, c) for c in query] attrs['coerce'] = int if f.field_type.code in (CustomField.MULTI_CHECKBOX,CustomField.RADIO): query = CustomFieldChoice.query.filter_by(custom_field=f) attrs['choices'] = [(unicode(c.value), c.value) for c in query] attrs['coerce'] = unicode # set field to form # _set_rules_for_custom_fields(f, attrs) field = data['field'](**attrs) setattr(field, 'field_type', f.field_type.code) form_attrs[f.slug] = field form_attrs['rules'] = Rule.get_rules_for_fields(fields) return type(form)(form.__name__, (form,), form_attrs)