def get_ordered_columns(self, columns, order_list=None, is_group=None, is_time_series=False, time_series_columns=None, **kwargs): if not order_list: order_list = self.form_settings.get( 'group_column_order', []) if is_group else self.form_settings.get( 'details_column_order', []) put_back_control = False if columns[0] == '_control_': columns = columns[1:] put_back_control = True if is_time_series: columns = self.apply_order_time_series(columns, time_series_columns, order_list) else: columns = apply_order_to_list(columns, order_list) if put_back_control: columns = ['_control_'] + columns return columns return apply_order_to_list(columns, order_list)
def get_group_by_display(self): _values = [] group_by = self.get_group_by_filters() if self.cleaned_data.get('add_details_control', False): _values.append('_control_') if group_by != 'doc_type': _values.append(group_by + '_id') ordered_cols = apply_order_to_list( self.cleaned_data['group_columns'], self.cleaned_data['group_col_order'].split(',')) for item in ordered_cols: if item == 'slug' and group_by: _values.append(group_by + '__slug') elif item == 'title' and group_by: _values.append(group_by + '__title') else: _values.append(item) else: # allowed_document_magic_fields = self.allowed_document_magic_fields selected_fields = self.cleaned_data['group_columns'] if group_by == 'doc_date': _values.append('doc_date') elif group_by == 'slug': _values.append('slug') _values.append('doc_date') elif group_by == 'doc_type': _values.append('__doc_typeid__') _values.append('doc_type') allowed_document_magic_fields = self.magic_fields if 'slug' in selected_fields: selected_fields.remove(u'slug') allowed_magic = [ e for allowed in allowed_document_magic_fields for e in selected_fields if e in allowed ] if allowed_magic: _values += allowed_magic return _values
def report_form_factory(model, base_model=None, admin=True, magic_fields_filer_func=None, fkeys_filter_func=None, doc_types_filter_func=None, **kwargs): ''' ''' fkeys_filter_func = fkeys_filter_func or (lambda x: x) magic_fields_filer_func = magic_fields_filer_func or (lambda x: x) doc_types_filter_func = doc_types_filter_func or (lambda x: x) magic_fields = field_registry.get_all_report_fields_names() magic_fields = magic_fields_filer_func(magic_fields) fields = OrderedDict() base_model_list = [] fkeys_list = [] if base_model is not None: if type(base_model) is str: base_model_name = base_model else: base_model_name = base_model.__name__.lower() base_model_list.append(base_model_name) time_series_options = [ 'daily', 'weekly', 'semimonthly', 'monthly', 'quarterly', 'semiannually', 'annually' ] doc_types_raw = base_model.get_doc_types() doc_types_raw = doc_types_filter_func(doc_types_raw) doc_types_magical_field = [ '__doc_type_%s__' % doc for doc in list(doc_types_raw) ] magic_fields += doc_types_magical_field fkeys_map = get_foreign_keys(model) fkeys_map = fkeys_filter_func(fkeys_map) _movmenet_fields = get_model_fields2( model, all_fields=True, no_recurse=False, recurse_name_slug_only=True, exclude_movement=True) # get_id_and_slug=True magic_fields_ordered = apply_order_to_list(magic_fields, [ '__fb__', '__debit__', '__credit__', '__total__', '__balance__', '__last_doc_date__', '__doc_count__', '__line_count__' ]) fk_choices = [(k.replace('_id', ''), v.verbose_name) for k, v in fkeys_map.items()] scopes = choices_from_list(['group', 'details', 'both'], False) if admin: fields['group_by'] = forms.ChoiceField(required=False, widget=forms.Select(), choices=fk_choices + [('doc_type', _('doc_type'))], label=_('group by')) _grp_display = ['slug', 'title'] + magic_fields default_for_group_display = [ 'slug', 'title', '__fb__', '__debit__', '__credit__', '__balance__' ] fields['group_columns'] = forms.MultipleChoiceField( required=False, widget=forms.SelectMultiple(), choices=choices_from_list(_grp_display, False) + choices_from_list( _movmenet_fields, False, extra_list=magic_fields_ordered), initial=default_for_group_display, label=ugettext_lazy('group_columns')) fields['aggregate_on'] = forms.ChoiceField( required=False, widget=forms.Select(), choices=[ ('', '----'), ] + fk_choices, label=ugettext_lazy('aggregate_on')) default_display = list(_movmenet_fields) try: default_display.remove('creation_date') default_display.remove('lastmod') except ValueError: pass default_display += ['__fb__', '__debit__', '__credit__', '__balance__'] fields['details_columns'] = forms.MultipleChoiceField( required=False, widget=forms.SelectMultiple(), choices=choices_from_list(_movmenet_fields, False, extra_list=magic_fields_ordered), initial=default_display, label=_('details_columns')) time_series_options = choices_from_list(time_series_options) default_for_time_series = ['__balance__' ] # todo: fix Bug __last_doc_date__ fields['time_series_pattern'] = forms.ChoiceField( choices=time_series_options, widget=forms.Select(), required=False, label=_('time series pattern')) fields['time_series_fields'] = forms.MultipleChoiceField( required=False, widget=forms.SelectMultiple(), choices=choices_from_list(magic_fields, False), label=_('time series fields'), initial=default_for_time_series) fields['time_series_display'] = forms.MultipleChoiceField( required=False, widget=forms.SelectMultiple(), choices=choices_from_list(magic_fields, False), label=_('details time series display'), initial=default_for_time_series) fields['time_series_scope'] = forms.ChoiceField( required=False, widget=forms.Select, choices=scopes, label=_('time series scope'), initial='group') movement_or_balance_choices = choices_from_list( ['balance', 'movement'], False) fields['movement_or_balance'] = forms.ChoiceField( required=False, widget=forms.Select, label=_('computation type'), choices=movement_or_balance_choices, initial='movement') fields['doc_types'] = forms.MultipleChoiceField( required=False, widget=forms.CheckboxSelectMultiple(), choices=choices_from_list(doc_types_raw, append_none=False), initial=doc_types_raw, label=_('doc types')) fields['group_col_order'] = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput) fields['details_col_order'] = forms.CharField(max_length=255, required=False, widget=forms.HiddenInput) fields['print_group_title'] = forms.CharField( max_length=50, required=False, label=_('print group title')) fields['print_details_title'] = forms.CharField( max_length=50, required=False, label=_('print details title')) fields['custom_group_column_names'] = forms.CharField( max_length=10000, required=False, label=_('Custom group column names')) fields['custom_details_column_names'] = forms.CharField( max_length=10000, required=False, label=_('Custom details column names')) fields['from_doc_date'] = RaDateDateTimeField( required=False, label=capfirst(ugettext_lazy('from date')), initial=app_settings.DEFAULT_FROM_DATE_TIME, widget=RaBootstrapDateTime(), input_date_formats=['%Y-%m-%d', '%Y-%m-%d'], input_time_formats=['%H:%M', '%H:%M:%S']) to_date_initial = datetime.datetime.combine( now().date() + datetime.timedelta(days=1), datetime.time.min) fields['to_doc_date'] = RaDateDateTimeField( required=False, initial=to_date_initial, label=capfirst(ugettext_lazy('to date')), widget=RaBootstrapDateTime(), input_date_formats=['%Y-%m-%d', '%Y-%m-%d'], input_time_formats=['%H:%M', '%H:%M:%S']) fields['can_edit_primary_index'] = forms.BooleanField( required=False, initial=False, label=_('can edit primary index')) fields['can_edit_secondary_index'] = forms.BooleanField( required=False, initial=False, label=_('can edit secondary index')) fields['can_edit_time_series_pattern'] = forms.BooleanField( required=False, initial=False, label=_('can edit timeseries pattern')) fields['can_edit_doc_types'] = forms.BooleanField( required=False, initial=False, label=_('can edit doc_types')) fields['can_edit_matrix_entities'] = forms.BooleanField( required=False, initial=True, label=_('can edit matrix entities')) fields['matrix'] = forms.ChoiceField(choices=[ ('', '----'), ] + fk_choices, label=_('matrix support'), required=False, widget=forms.Select()) fields['matrix_columns'] = forms.MultipleChoiceField( choices=choices_from_list(magic_fields_ordered, False), label=_('matirx fields'), widget=forms.SelectMultiple, required=False, initial=['__balance__']) fields['matrix_show_other'] = forms.BooleanField( required=False, widget=forms.CheckboxInput(), label=_('Show [The rest]'), initial=True) fields['matrix_entities'] = forms.CharField(required=False, label=_('matrix entities')) fields['matrix_scope'] = forms.ChoiceField(required=False, widget=forms.Select, choices=scopes, label=_('matrix scope'), initial='both') for name, f_field in fkeys_map.items(): fkeys_list.append(name) from ra.admin.admin import ra_admin_site fields[name] = f_field.formfield( **{ 'form_class': forms.ModelMultipleChoiceField, 'required': False, 'widget': RaAutocompleteSelectMultiple(f_field.remote_field, ra_admin_site, attrs={'class': 'select2bs4'}) }) fields['doc_date'] = forms.DateField(input_formats=["%Y-%m-%d"], required=False, label=ugettext_lazy('at date')) fields['add_details_control'] = forms.BooleanField(required=False, initial=False) # Get_initial_form_settings initial_settings = {} for field in fields.keys(): initial_settings[field] = fields[field].initial new_form = type( 'ReportForm', ( BaseReportForm, forms.BaseForm, ), { "base_fields": fields, '_fkeys': fkeys_list, 'initial_settings': initial_settings, 'base_model': base_model, 'foreign_keys': fkeys_map, 'magic_fields': magic_fields, 'document_report_fields': ['slug', 'doc_date', 'doc_type'] }) return new_form