Пример #1
0
    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)
Пример #2
0
    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
Пример #3
0
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