コード例 #1
0
    def data_entry_form(self, row_name='new', data_instance = None, depth = 2):
        self.form_class = None
        self.classattr = {}

        if data_instance is None:
            data_instance = DataInstance(self.table_name, row_name, depth)

            if row_name != 'new':
                data_instance.get_linked_instances()

        self.instance = data_instance

        self.get_table(data_instance)

        self.classattr['form_data_type_0'] = HiddenField('form_data_type_0', default=self.form_type)
        self.classattr['form_data_table_0'] = HiddenField('form_data_table_0', default=self.table_name)
        self.classattr['form_data_row_name_0'] = HiddenField('form_data_row_name_0', default=row_name)
        self.classattr['row_counter'] = HiddenField('row_counter', default=data_instance.instance_counter)

        form_class = new_class('SingleForm', (Form,), {}, lambda ns: ns.update(self.classattr))

        logging.info(self.classattr)
        logging.info(self.classattr)

        self.form_class = form_class(None)
コード例 #2
0
    def multiple_data_entry_form(self, row_names=[], data_instance = None):
        self.form_class = None
        self.classattr = {}

        if data_instance is None:
            data_instance = DataInstance(self.table_name, None, 0)
            data_instance.get_multiple_data(row_names)

        self.get_table(data_instance)

        self.classattr['form_data_table_0'] = HiddenField('form_data_table_0', default=self.table_name)
        self.classattr['form_data_type_0'] =  HiddenField('form_data_type_0', default=self.form_type)

        row_counter = 0
        for row_name in row_names:
            self.classattr['form_data_row_name_' + str(row_counter)] = \
                HiddenField('form_data_row_name_' + str(row_counter), default=row_name)
            row_counter += 1

        self.classattr['row_counter'] = HiddenField('row_counter', default=data_instance.instance_counter)

        form_class = new_class('MultipleForm', (Form,), {}, lambda ns: ns.update(self.classattr))

        self.form_class = form_class(None)
コード例 #3
0
class FormParser():
    def __init__(self, table_name):
        self.table_name = table_name
        self.table_names = []
        self.instance = None
        self.files = {}
        
    def parse(self, form_data = None):
        fields = {}
        web_request = False
        if not form_data:
            web_request = True
            form_data = request.form

        # used to identify fields that contain data that needs to be saved
        field_pattern = \
            re.compile('^(files_data_entry|id_data_entry|long_text|data_entry|record_data|form_data)_(\S+)_(\d+)')
        for key in form_data:
            if web_request:
                data = request.form.get(key)
            else:
                data = form_data[key]

            if key.startswith('bool_'):
                key = key[key.index('_') + 1:]

            field_id = field_pattern.match(key)
            if field_id is not None:
                if field_id.group(3) not in fields.keys():
                    fields[field_id.group(3)] = {'long_text': {}, 'form_data': {}, 'data_entry': {}, 'record_data': {},
                                                 'id_data_entry': {}, 'files_data_entry': {}}

                fields[field_id.group(3)][field_id.group(1)][field_id.group(2)] = data

        if request.files:
            # http://werkzeug.pocoo.org/docs/0.11/datastructures/#werkzeug.datastructures.FileStorage
            files = request.files

            for key in files:
                if files[key] and util.allowed_file(files[key].filename):
                    field_id = field_pattern.match(files[key].name)

                    filename = secure_filename(files[key].filename)

                    if field_id.group(2) not in fields[field_id.group(3)][field_id.group(1)]:
                        fields[field_id.group(3)][field_id.group(1)][field_id.group(2)] = {}

                    fields[field_id.group(3)][field_id.group(1)][field_id.group(2)][filename] = files[key]

        # for key1, value1 in fields.items():
        #     for key2, value2 in value1.items():
        #         for key3, value3 in value2.items():
        #            logging.info(str(key1) + ' ' + str(key2) + ' ' + str(key3) + ': ' + str(value3))

        self.instance = DataInstance(self.table_name, None, int(fields['0']['form_data']['max_level']))

        for row_id in sorted(fields.keys()):
            row_data = fields[row_id]

            table_name_field = row_data['record_data']['table']
            if table_name_field not in self.table_names:
                self.table_names.append(table_name_field)

            if row_data['record_data']['new'] == '1':
                instance_name = self.instance.add_new_instance(table_name_field, 'new')
                if row_data['data_entry']['name'] != '' and row_data['data_entry']['name'] != 'new':
                    instance_name = row_data['data_entry']['name']
                else:
                    fields[row_id]['data_entry']['name'] = instance_name
            else:
                # on a multiform all instances are not fetched with get_data
                if row_data['record_data']['row_name'] not in self.instance.instances[table_name_field]:
                    instance_name = self.instance.add_new_instance(table_name_field,
                                                                   row_data['record_data']['row_name'])
                else:
                    instance_name = row_data['record_data']['row_name']

            if ('organization_id' in row_data['data_entry'].keys() and
                    row_data['data_entry']['organization_id']):
                row_org_id = row_data['data_entry']['organization_id']

                if not isinstance(row_org_id, int):
                    row_org_id = self.instance.set_foreign_key_field_id(table_name_field, 'organization_id', row_org_id)

            if row_org_id is None:
                if self.instance.get_value('organization_id', table_name_field, instance_name) is not None:
                    row_org_id = self.instance.get_value('organization_id')
                elif self.instance.organization_access_control.current_org_id is not None:
                    row_org_id = g.current_org_id
                else:
                    row_org_id = 1

            row_data['data_entry']['organization_id'] = row_org_id

            exclude_list = ['id', 'last_modified', 'date_created', 'organization_id']

            for table_field, meta_data in self.instance.fields[table_name_field].fields.items():
                # only update fields that were on the form
                if meta_data.Field.display_name not in row_data['data_entry'].keys():
                    continue

                field_data = meta_data.Field
                field = field_data.display_name

                if 'text' == meta_data.DataType.name.lower and row_data['data_entry'][field] != '':
                    if row_data['long_text'][field] == '':
                        lt = DataInstance('long_text', 'new')
                    else:
                        lt = DataInstance('long_text')
                        lt.get_data(None, int(row_data['long_text'][field]))

                    lt.set_value('organization_id', row_org_id)
                    lt.set_value('long_text', row_data['data_entry'][field])
                    msg = lt.save()

                    row_data['data_entry'][field] = next(iter(msg))
                elif field_data.foreign_key_table_object_id is not None or field_data.select_list_id is not None:
                    try:
                        if row_data['data_entry'][field] is None or row_data['data_entry'][field] == '' \
                                or int(row_data['data_entry'][field]) == -99:
                            row_data['data_entry'][field] = None
                        else:
                            row_data['data_entry'][field] = int(row_data['data_entry'][field])
                    except (ValueError, KeyError) as e:
                        try:
                            row_data['data_entry'][field] = int(row_data['id_data_entry'][field])
                        except  (ValueError, KeyError) as e:
                            row_data['data_entry'][field] = None
                elif meta_data.DataType.name.lower() == 'file':
                    old_files = []
                    self.files[(instance_name, table_name_field)] = []

                    if row_data['files_data_entry'][field] != "":
                        old_files = row_data['files_data_entry'][field].split("|")

                    if request.files:
                        for filename, file in row_data['data_entry'][field].items():
                            self.files[(instance_name, table_name_field)].append({'filename': filename, 'file': file})

                            if filename not in old_files:
                                old_files.append(filename)

                    if len(old_files) > 0:
                        filenames = "|".join(old_files)
                        row_data['data_entry'][field] = filenames
                elif field not in exclude_list:
                    if row_data['data_entry'][field] == '':
                        row_data['data_entry'][field] = None
                    elif field_data.data_type_id == 1:
                        row_data['data_entry'][field] = int(row_data['data_entry'][field])
                    elif field_data.data_type_id == 8:
                        row_data['data_entry'][field] = float(row_data['data_entry'][field])
                    elif field_data.data_type_id == 3:
                        if row_data['data_entry'][field] == 'y' or row_data['data_entry'][field] == 'True' or \
                                        row_data['data_entry'][field] == '1':
                            row_data['data_entry'][field] = True
                        else:
                            row_data['data_entry'][field] = False

            self.instance.set_values(row_data['data_entry'], table_name_field, instance_name)

    def save(self):
        commit_status, commit_msg = self.instance.commit()

        if commit_status is True:
            for key in set(self.files) & set(self.instance.instance_names):
                for file_data in self.files[key]:
                    directory = (os.path.join(current_app.config['UPLOAD_FOLDER'], key[1],
                                              self.instance.instance_names[key])).strip()

                    if not os.path.exists(directory):
                        os.makedirs(directory)

                    if os.path.exists(os.path.join(directory, file_data['filename'])):
                        os.remove(os.path.join(directory, file_data['filename']))

                    file_data['file'].save(os.path.join(directory, file_data['filename']))

            current_app.cache.increment_version(list(self.table_names))

        return commit_status, commit_msg

    def undo(self):
        self.instance.rollback()