Exemple #1
0
    def form_valid(self, form):
        fields = Member.get_fields()
        selected_fields = form.cleaned_data["field_list"]
        header = collections.OrderedDict([(f.field_id, f.name)
                                          for f in fields.values()
                                          if f.field_id in selected_fields])
        data = self.get_data(
            form,
            [(f.field_id, f.getter)
             for f in fields.values() if f.field_id in selected_fields],
        )

        LogEntry.objects.create(
            content_type=None,
            object_id=0,
            user=self.request.user,
            action_type="byro.members.export",
            data={
                "filter":
                form.cleaned_data["member_filter"],
                "format":
                form.cleaned_data["export_format"],
                "fields":
                collections.OrderedDict([
                    (f_id, str(f_name)) for (f_id, f_name) in header.items()
                ]),
            },
        )

        if form.cleaned_data["export_format"].startswith("csv"):
            return self.export_csv(
                header, data, csv_format=form.cleaned_data["export_format"])

        return redirect(self.request.get_full_path())
Exemple #2
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     fields = Member.get_fields()
     self.fields["field_list"].choices = [(f.field_id, f.name)
                                          for f in fields.values()]
     self.fields["field_list"].initial = [
         f.field_id for f in fields.values()
         if f.registration_form.get("position", -1) > -1
     ]
Exemple #3
0
def test_member_field_reading(member, membership, inactive_member):
    f = Member.get_fields()

    assert '_internal_id' in f
    assert f['_internal_id'].computed
    assert f['_internal_id'].read_only
    assert f['_internal_id'].getter(member) == member.pk

    assert f['member__name'].getter(member) == member.name

    assert f['_internal_active'].getter(member) is True
    assert f['_internal_active'].getter(inactive_member) is False
Exemple #4
0
def default_csv_form_valid(view, form, dialect='excel'):
    mapping = None
    fields = Member.get_fields()
    encoding = get_encoding(form)

    with form.cleaned_data['upload_file'].open() as fp:
        instream = unicodecsv.DictReader(fp,
                                         dialect=dialect,
                                         encoding=encoding)

        for indict in instream:
            if mapping is None:
                mapping = {}
                for k in indict.keys():
                    for field in fields.values():
                        if str(field.name).strip() == k.strip():
                            mapping[k.strip()] = field
                            break
                    else:
                        messages.error(
                            view.request,
                            _("Couldn't map input column '{}' to field").
                            format(k.strip()),
                        )
                        return redirect(view.request.get_full_path())

            member = Member.objects.create()
            membership_parms = {}
            for k, v in indict.items():
                field = mapping[k.strip()]
                #  FIXME We're special casing the Membership here, but really Field.setter should handle that
                #  (In the case of 'member.memberships.last()' for the getter it should create a new Membership
                #  if no Membership exists.)
                if field.field_id.startswith("membership__"):
                    if v:
                        membership_parms[field.field_id.split('__', 1)[1]] = v
                else:
                    field.setter(member, v)
            member.log(view, '.created')
            member.save()
            create_membership(membership_parms, member)

    return redirect(reverse('office:members.list'))
Exemple #5
0
def default_csv_form_valid(view, form, dialect="excel"):
    mapping = None
    fields = Member.get_fields()
    encoding = get_encoding(form)

    with form.cleaned_data["upload_file"].open() as fp:
        instream = unicodecsv.DictReader(fp,
                                         dialect=dialect,
                                         encoding=encoding)

        for indict in instream:
            if mapping is None:
                mapping = {}
                for k in indict.keys():
                    if not k.strip():
                        continue
                    for field in fields.values():
                        if str(field.name).strip() == k.strip():
                            mapping[k.strip()] = field
                            break
                    else:
                        messages.error(
                            view.request,
                            _("Couldn't map input column '{}' to field").
                            format(k.strip()),
                        )
                        return redirect(view.request.get_full_path())

            do_update = False
            have_changes = False
            for verb_name, field in mapping.items():
                if field.field_id == "_internal_id":
                    member = Member.all_objects.filter(
                        pk=indict[verb_name.strip()]).first()
                    if member:
                        do_update = True
                        del indict[verb_name]

            if not do_update:
                member = Member.objects.create()

            membership_parms = {}
            for k, v in indict.items():
                if k.strip() not in mapping:
                    continue
                field = mapping[k.strip()]
                #  FIXME We're special casing the Membership here, but really Field.setter should handle that
                #  (In the case of 'member.memberships.last()' for the getter it should create a new Membership
                #  if no Membership exists.)
                if field.field_id.startswith("membership__"):
                    if v:
                        membership_parms[field.field_id.split("__", 1)[1]] = v
                else:
                    if do_update:
                        old_v = field.getter(member)
                        if old_v != v and not (old_v is None and not v):
                            field.setter(member, v)
                            have_changes = True
                    else:
                        field.setter(member, v)

            if do_update:
                if have_changes:
                    member.log(view, ".updated")
                    member.save()
            else:
                member.log(view, ".created")
                member.save()

                # FIXME Changing membership when do_update is not implemented
                if membership_parms:
                    create_membership(membership_parms, member)

    return redirect(reverse("office:members.list"))
Exemple #6
0
def default_csv_form_valid(view, form, dialect="excel"):
    mapping = None
    fields = Member.get_fields()
    encoding = get_encoding(form)

    with form.cleaned_data["upload_file"].open() as fp:
        instream = unicodecsv.DictReader(fp,
                                         dialect=dialect,
                                         encoding=encoding)

        for indict in instream:
            if mapping is None:
                mapping = {}
                for k in indict.keys():
                    if not k.strip():
                        continue
                    for field in fields.values():
                        if str(field.name).strip() == k.strip():
                            mapping[k.strip()] = field
                            break
                    else:
                        messages.error(
                            view.request,
                            _("Couldn't map input column '{}' to field").
                            format(k.strip()),
                        )
                        return redirect(view.request.get_full_path())

            do_update = False
            have_changes = False
            create_initial_balance = False
            initial_balance = None
            initial_balance_timestamp = None
            for verb_name, field in mapping.items():
                if field.field_id == "_internal_id":
                    member = Member.all_objects.filter(
                        pk=indict[verb_name.strip()]).first()
                    if member:
                        do_update = True
                        del indict[verb_name]

            if not do_update:
                member = Member.objects.create()

            membership_parms = {}
            for k, v in indict.items():
                if k.strip() not in mapping:
                    continue
                field = mapping[k.strip()]
                #  FIXME We're special casing the Membership here, but really Field.setter should handle that
                #  (In the case of 'member.memberships.last()' for the getter it should create a new Membership
                #  if no Membership exists.)
                if field.field_id.startswith("membership__"):
                    if v:
                        membership_parms[field.field_id.split("__", 1)[1]] = v
                else:
                    if do_update:
                        old_v = field.getter(member)
                        if old_v != v and not (old_v is None and not v):
                            field.setter(member, v)
                            have_changes = True
                    else:
                        if field.field_id == "_internal_balance":
                            if dialect == csv_excel_de:
                                v = v.replace(".", "").replace(",", ".")
                            initial_balance = Decimal(v)
                            if initial_balance != 0:
                                create_initial_balance = True
                        elif field.field_id == "_internal_last_transaction":
                            if v != "" and v is not None:
                                initial_balance_timestamp = dateparser.parse(
                                    v,
                                    languages=[settings.LANGUAGE_CODE, "en"])
                                create_initial_balance = True
                        else:
                            field.setter(member, v)

            if do_update:
                if have_changes:
                    member.log(view, ".updated")
                    member.save()
            else:
                if create_initial_balance and not initial_balance_timestamp:
                    messages.error(
                        view.request,
                        _("Either both or none columns has to be given: '{}' and '{}'"
                          ).format(
                              fields["_internal_balance"].name,
                              fields["_internal_last_transaction"].name,
                          ),
                    )
                    return redirect(view.request.get_full_path())

                member.log(view, ".created")
                member.save()

                # FIXME Changing membership when do_update is not implemented
                if membership_parms:
                    create_membership(membership_parms, member)

                if create_initial_balance:

                    balance_changed = member.adjust_balance(
                        view,
                        "Initial Balance created by CSV Import",
                        initial_balance,
                        SpecialAccounts.fees_receivable,
                        SpecialAccounts.opening_balance,
                        initial_balance_timestamp,
                    )

                    if balance_changed:
                        member.log(view,
                                   ".finance.initial_balance",
                                   balance=member.balance)

    return redirect(reverse("office:members.list"))
Exemple #7
0
def test_member_field_writing_sepa_iban(member):
    f = Member.get_fields()

    f['MemberSepa__iban'].setter(member, 'DE491234567890')
    assert member.profile_sepa.iban == 'DE491234567890'
Exemple #8
0
def test_member_field_writing(member):
    f = Member.get_fields()

    assert member.name != 'Fnord'
    f['member__name'].setter(member, 'Fnord')
    assert member.name == 'Fnord'
Exemple #9
0
def test_member_field_writing_sepa_iban(member):
    f = Member.get_fields()

    f["MemberSepa__iban"].setter(member, "DE491234567890")
    assert member.profile_sepa.iban == "DE491234567890"
Exemple #10
0
def test_member_field_writing(member):
    f = Member.get_fields()

    assert member.name != "Fnord"
    f["member__name"].setter(member, "Fnord")
    assert member.name == "Fnord"