class TrainingExperienceFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(TrainingExperienceFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('name', css_class='col-md-4'), Div('organization_name', css_class='col-md-4'), Div('start_date', css_class='col-md-2'), Div('end_date', css_class='col-md-2'), css_class='row' ), Div( Div('content', css_class='col-md-12'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=TRAINING_EXPERIENCE_FORMS_PREFIX)
class WorkExperienceFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(WorkExperienceFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('company_name', css_class='col-md-5'), Div('position', css_class='col-md-3'), Div('start_date', css_class='col-md-2'), Div('end_date', css_class='col-md-2'), css_class='row' ), Div( Div('resignation_reason', css_class='col-md-12'), css_class='row' ), Div( Div('description', css_class='col-md-12'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=WORK_EXPERIENCE_FORMS_PREFIX)
class SalaryFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(SalaryFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('salary_level', css_class='col-md-4'), Div('salary_proportion', css_class='col-md-4'), Div('actual_salary', css_class='col-md-2'), css_class='row' ), Div( Div('gross_salary', css_class='col-md-2', function='jisuan'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=SALARY_FORMS_PREFIX)
class ProjectFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(ProjectFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('name', css_class='col-md-8'), Div('start_date', css_class='col-md-2'), Div('end_date', css_class='col-md-2'), css_class='row' ), Div( Div('technology', css_class='col-md-12'), css_class='row' ), Div( Div('description', css_class='col-md-12'), css_class='row' ), Div( Div('responsibility', css_class='col-md-12'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden='true' ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=PROJECT_FORMS_PREFIX)
class TowerHelper(FormHelper): def __init__(self, *args, **kwargs): super(TowerHelper, self).__init__(*args, **kwargs) self.form_tag = False self.add_input( Submit("add-tower", "Add Tower", css_class='btn-block', css_id='add-tower')) self.add_input( Submit('project-details', 'Submit', css_class='btn-block', css_id='submit-project-details') ) self.disable_csrf = True self.layout = Layout( Fieldset( 'Tower Info', Div( 'name', css_class='col-md-6', style='padding-left:0px'), Div( 'floors_completed', css_class='col-md-6', style='padding-right:0px'), Div('finishing_status', 'other_status', css_class='col-md-12', style='padding:0px'), Div( 'image', css_class='col-md-12', style='padding:0% 0% 5% 0%' )) ) self.layout.extend(['DELETE'])
class DeveloperProjectHelper(FormHelper): def __init__(self, *args, **kwargs): super(DeveloperProjectHelper, self).__init__(*args, **kwargs) self.form_tag = False self.add_input( Submit("add-project", "Add Project", css_class='btn-block', css_id='add-project')) self.add_input(Submit("builder-details", "Save", css_class='btn-block', css_id='submit-builder-details')) self.disable_csrf = True self.layout = Layout( 'project_name', Div( Field('launch_date', css_class='month-year'), css_class='col-md-6', style='padding-left:0px' ), Div( Field('possession_date', css_class='month-year'), css_class='col-md-6', style='padding-right:0px' ), 'developer', ) self.layout.extend(['DELETE'])
class DailyReportFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(DailyReportFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('header', css_class='col-md-4'), Div('create_time', css_class='col-md-4'), css_class='row' ), Div( Div('report_content', css_class='col-md-2'), Div('assess', css_class='col-md-4'), css_class='row' ), Div( Div('score', css_class='col-md-2'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=DAILYREPORT_FORMS_PREFIX)
class RegularMeetingFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(RegularMeetingFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('title', css_class='col-md-4'), Div('specker', css_class='col-md-4'), Div('participant', css_class='col-md-2'), Div('meeting_time', css_class='col-md-4'), Div('enclosure', css_class='col-md-2'), css_class='row' ), Div( Div('main_content', css_class='col-md-2'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=REGULARMETTING_FORMS_PREFIX)
class CardFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(CardFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('number', css_class='col-md-6'), Div('bank_name', css_class='col-md-6'), css_class='row' ), Div( Div('branch_name', css_class='col-md-6'), Div('phone', css_class='col-md-6'), css_class='row' ), Div(Div('is_default', css_class='col-md-12'), css_class='row'), Div(Div('remark', css_class='col-md-12'), css_class='row'), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=CARD_FORMS_PREFIX)
class EducationFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(EducationFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('school', css_class='col-md-8'), Div('major', css_class='col-md-4'), css_class='row' ), Div( Div('education', css_class='col-md-3'), Div('education_type', css_class='col-md-3'), Div('start_date', css_class='col-md-3'), Div('end_date', css_class='col-md-3'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=EDUCATION_FORMS_PREFIX)
class UpdateSuggestionHelper(FormHelper): def __init__(self, suggestion = None, url = None, description=None, *args, **kwargs): try: super(UpdateSuggestionHelper, self).__init__(*args, **kwargs) # TODO: Assert that the model to be changed is the same as the instance submit_url = None name = None instance = suggestion.primary.instance if url: submit_url = kwargs.get('url') if instance: meta = instance._meta app, mod, name = meta.app_label, meta.model_name, meta.verbose_name if instance.pk and not submit_url: submit_url = '/rest/{}/{}/{}/'.format(app, mod, instance.pk) if suggestion and not submit_url: if suggestion.state != 'A': model = suggestion.primary.retrieve_model i = model() app, mod, name = i._meta.app_label, i._meta.model_name, i._meta.verbose_name submit_url = '{}_{}_/'.format(suggestion.url, suggestion.pk) else: submit_url = suggestion.url else: if not submit_url: submit_url = suggestion.url+ 'ERROR - might not be a primary instance?' self.attrs = {'action': '/suggest/suggest/'} self.form_method = 'POST' self.layout = Layout( Hidden('_method', 'PATCH'), Hidden('_url', submit_url), Hidden('_action', 'UM'), Hidden('_description', kwargs.get('description') or 'Modify a {} in the database'.format(name)), Hidden('_affected_instance_primary', 'suggest_suggest {}'.format(suggestion.pk)), Hidden('_next', '/suggest/#object=_suggestion_'), manyfieldlayout(instance), Layout(*[Hidden('__nochange', f) for f in kwargs.get('nochange', [])]), # HTML('''<div class="alert alert-{}" role="alert">{}</div>'''.format('info', 'UpdateSuggestionHelper loaded successfully')) ) except Exception, e: super(UpdateSuggestionHelper, self).__init__(*args, **kwargs) self.layout = Layout() self.layout.extend([HTML('''<div class="alert alert-{}" role="alert">{}</div>'''.format('warning', e.message))]) self.layout.extend([HTML('''<div class="alert alert-{}" role="alert">{}</div>'''.format('warning', 'UpdateSuggestionHelper'))]) raise
class MessageFormHelper(FormHelper): ''' Returns a FormHelper with a bootstrap message :return: ''' def __init__(self, message, cssclass="warning", *args, **kwargs): # Possible cssclass values for bootstrap are success, info, warning, and danger super(MessageFormHelper, self).__init__(*args, **kwargs) self.layout = Layout() self.layout.extend([HTML('''<div class="alert alert-{}" role="alert">{}</div>'''.format(cssclass, message))])
class UpdateFormHelper(FormHelper): def __init__(self, instance=None, suggestion=None, url=None, description=None, *args, **kwargs): try: super(UpdateFormHelper, self).__init__() if hasattr(instance, '_meta') and hasattr(instance, 'pk'): app = instance._meta.app_label mod = instance._meta.model_name pk = getattr(instance, 'pk') name = instance._meta.verbose_name aip = Hidden('_affected_instance_primary', '{}_{} {}'.format(app, mod, pk)) elif hasattr(suggestion, 'primary') and hasattr(suggestion, 'pk'): app, mod = suggestion.primary.model_name.split('_') name = "suggestion" pk = '_%s_'%(getattr(suggestion, 'pk')) instance = "suggestion" aip = Hidden('_affected_instance_primary', '{}_{} {}'.format('suggest', 'suggest', getattr(suggestion, 'pk'))) else: raise AssertionError('Supply either a Suggestion or a model instance') if not description: description = kwargs.get('description', 'Modify a {} ({}) in the database'.format(name, instance)) submit_url = url or '/rest/{}/{}/{}/'.format(app, mod, pk) self.attrs = {'action': '/suggest/suggest/'} self.form_method = 'POST' self.form_tag = True self.layout = Layout( Hidden('_method', 'PATCH'), Hidden('_url', submit_url), Hidden('_action', 'UM'), Hidden('_description', description), Hidden('__formtype', "Update Form"), manyfieldlayout(instance), aip) except Exception, e: super(UpdateFormHelper, self).__init__() self.layout = Layout() self.layout.extend([HTML('''<div class="alert alert-{}" role="alert">{}</div>'''.format('warning', e.message))]) raise
class TimeSheetFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(TimeSheetFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('work_project', css_class='col-md-3'), Div('year', css_class='col-md-3'), Div('month', css_class='col-md-3'), Div('time_percentage', css_class='col-md-3'), css_class='row' ), Button('button', '删除', css_class='btn btn-danger btn-block btn-delete'), ) # 将每一个表单加入‘user’、‘id’两个隐藏标签,使得button“添加”表单成功 self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=TIMESHEET_FORMS_PREFIX)
class CertificationFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(CertificationFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('name', css_class='col-md-6'), Div('remark', css_class='col-md-6'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden='true' ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=CERTIFICATION_FORMS_PREFIX)
class SkillFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(SkillFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('level', css_class='col-md-2'), Div('content', css_class='col-md-10'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden='true' ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=SKILL_FORMS_PREFIX)
class ContactFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super(ContactFormSetHelper, self).__init__(*args, **kwargs) self.form_tag = False self.layout = Layout( Div( Div('name', css_class='col-md-3'), Div('relationship', css_class='col-md-3'), Div('organization', css_class='col-md-3'), Div('telephone', css_class='col-md-3'), css_class='row' ), Button('button', '删除', css_class='btn btn-outline-danger btn-block btn-delete'), Div( Div('DELETE'), css_class='row', hidden="true" ) ) self.layout.extend(['user', 'id']) self.all().wrap_together(Div, css_class=CONTACT_FORMS_PREFIX)
class FormHelper(CrispyFormHelper, WFormHelper): """ Extended WFormHelper based on crispy WFormHelper, Dynamic form fields according to inputs types and parameters """ # TODO Created dedicated field for (copy_paste field) def __init__(self, form=None, **kwargs): form_tag = kwargs.pop('form_tag', True) form_class = kwargs.pop('form_class', 'form-horizontal') label_class = kwargs.pop('label_class', 'col-lg-4') field_class = kwargs.pop('field_class', 'col-lg-8 text-left') template_pack = kwargs.pop('template_pack', waves_settings.TEMPLATE_PACK) self.form_obj = form super(FormHelper, self).__init__(form) self.form_tag = form_tag self.form_class = form_class self.label_class = label_class self.field_class = field_class self.render_unmentioned_fields = False self.layout = Layout() self.template_pack = template_pack def set_layout(self, service_input, form=None): """ Setup crispy form for a submission """ css_class = "" field_id = "id_" + service_input.api_name dependent_on = "" dependent_4_value = "" has_sample = isinstance( service_input, FileInput) and service_input.input_samples.count() > 0 has_dependent = service_input.dependents_inputs.count() > 0 if has_dependent or has_sample: css_class = "has_dependent" field_dict = dict( css_class=css_class, id=field_id, title=service_input.help_text, ) wrapper = dict() if service_input.parent is not None and not isinstance( service_input, FileInputSample): field_id += '_' + service_input.parent.api_name + '_' + service_input.api_name dependent_on = service_input.parent.api_name dependent_4_value = service_input.when_value field_dict.update( dict(dependent_on=service_input.parent.api_name, dependent_4_value=str(service_input.when_value))) when_value = self.form_obj.data.get(service_input.parent.api_name, service_input.parent.default) if when_value is None: when_value = False hide_dep = service_input.when_value_python != when_value if when_value is not None: if type(service_input.when_value_python) is int: hide_dep = (service_input.when_value_python != int(when_value)) print "hide dep", hide_dep, when_value, service_input.when_value_python elif type(service_input.when_value_python) is Decimal: hide_dep = (service_input.when_value_python != Decimal( when_value.strip(' "'))) elif type(service_input.when_value_python) is bool: bool_value = str(when_value).lower() in ("yes", "true", "t", "1") hide_dep = (service_input.when_value_python != bool_value) if hide_dep: wrapper = dict(wrapper_class="hid_dep_parameter", disabled="disabled") else: wrapper = dict(wrapper_class="dis_dep_parameter") # file inputs if isinstance(service_input, FileInput): all_sample = [] if has_sample: for sample in service_input.input_samples.all(): all_sample.append( Field('sp_' + service_input.api_name + '_' + str(sample.pk), dependent_on=service_input.api_name, dependent_4_value=dependent_4_value, **wrapper)) field_dict.update(wrapper) input_field = Div(Field(service_input.api_name, **field_dict), *all_sample) if service_input.allow_copy_paste: cp_input_field = Field('cp_' + service_input.api_name, css_id='id_' + 'cp_' + service_input.api_name) tab_input = bootstrap.Tab("File Upload", input_field, css_id='tab_' + service_input.api_name) self.layout.append( Div(bootstrap.TabHolder( tab_input, bootstrap.Tab( "Copy/paste content", cp_input_field, css_class='copypaste', css_id='tab_cp_' + service_input.api_name, dependent_on=dependent_on, dependent_4_value=dependent_4_value, ), css_id='tab_holder_' + service_input.api_name, ), id='tab_pane_' + service_input.api_name, css_class=wrapper['wrapper_class'], dependent_on=dependent_on, dependent_4_value=dependent_4_value)) else: self.layout.append(input_field) elif not isinstance(service_input, FileInputSample): field_dict.update(wrapper) input_field = Field(service_input.api_name, **field_dict) self.layout.append(input_field) if isinstance( service_input, FileInput ) and not service_input.allow_copy_paste and service_input.input_samples.count( ) > 0: for sample in service_input.input_samples.all(): self.layout.append( Field('sp_' + service_input.api_name + '_' + str(sample.pk))) def init_layout(self, fields): l_fields = [] for field in fields: l_fields.append(Field(field)) self.layout = Layout() self.layout.extend(l_fields) return self.layout def end_layout(self): self.layout.extend([ HTML('<HR/>'), bootstrap.FormActions(Reset('reset', 'Reset form'), Submit('save', 'Submit a job')) ])