diff --git a/.gitignore b/.gitignore index eba74f4..8bc348e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -venv/ \ No newline at end of file +venv/ +__pycache__ \ No newline at end of file diff --git a/base_data_model.py b/base_data_model.py new file mode 100644 index 0000000..464fe57 --- /dev/null +++ b/base_data_model.py @@ -0,0 +1,40 @@ +import npyscreen + +class base_data_model(): + def __init__(self, base_data_dict): + self.base_data_dict = base_data_dict + self.forms = {} + + def add_edit_fields(self, form): + base_data = self.base_data_dict + self.forms['fullname'] = form.add(npyscreen.TitleText, name="Name: ", value=base_data['fullname']) + self.forms['nickname'] = form.add(npyscreen.TitleText, name="Nickname: ", + value=base_data['nickname']) + self.forms['address_street'] = form.add( + npyscreen.TitleText, name="Adresse - Straße: ", value=base_data['address_street']) + self.forms['address_locality'] = form.add( + npyscreen.TitleText, name="Adresse - Stadt: ", value=base_data['address_locality']) + self.forms['address_code'] = form.add(npyscreen.TitleText, + name="Adresse - PLZ: ", value=base_data['address_code']) + self.forms['address_country'] = form.add( + npyscreen.TitleText, name="Adresse - Land: ", value=base_data['address_country']) + self.forms['birth_date'] = form.add(npyscreen.TitleText, + name="Geburtstag: ", value=base_data['birth_date']) + self.forms['birth_location'] = form.add( + npyscreen.TitleText, name="Geburtsort: ", value=base_data['birth_location']) + self.forms['email'] = form.add(npyscreen.TitleText, + name="email: ", value=base_data['email']) + self.forms['pgp-key'] = form.add(npyscreen.TitleText, name="URI PGP Key: ", value=base_data['pgp-key']) + self.forms['ssh-key'] = form.add(npyscreen.TitleText, name="URI SSH Key: ", value=base_data['ssh-key']) + + def get_form_values_dict(self): + base_data = dict(zip(self.forms.keys(), map(lambda f: f.value, self.forms.values()))) + base_data['address_label'] = \ + f"{base_data['fullname']}\n\ +{base_data['address_street']}\n\ +{base_data['address_code']} {base_data['address_locality']}" + base_data['address_region'] = '' + return base_data + + def has_changed(self): + return self.base_data_dict != self.get_form_values_dict() \ No newline at end of file diff --git a/edit_data_form.py b/edit_data_form.py index c8ce0ae..8c8c299 100755 --- a/edit_data_form.py +++ b/edit_data_form.py @@ -6,75 +6,45 @@ import json import datetime from sys import argv +from base_data_model import base_data_model +from financial_data_model import financial_data_model +from membership_data_model import membership_data_model + class FormApp(npyscreen.NPSAppManaged): def __init__(self, member_struct): super().__init__() self.member = member_struct + self.base_data = base_data_model(member_struct['stammdaten']) + self.financial_data = financial_data_model(member_struct['finanzdaten']) + self.membership_data = membership_data_model(member_struct['mitgliederdaten']) + def main(self): - f = npyscreen.Form(name='Edit Member data') + f = npyscreen.Form(name='Edit Member data') - sd = self.member['stammdaten'] - base_data_widgets = {} - base_data_widgets['fullname'] = f.add( - npyscreen.TitleText, name="Name: ", value=sd['fullname']) - base_data_widgets['nickname'] = f.add(npyscreen.TitleText, name="Nickname: ", - value=sd['nickname']) - base_data_widgets['address_street'] = f.add( - npyscreen.TitleText, name="Adresse - Straße: ", value=sd['address_street']) - base_data_widgets['address_locality'] = f.add( - npyscreen.TitleText, name="Adresse - Stadt: ", value=sd['address_locality']) - base_data_widgets['address_code'] = f.add(npyscreen.TitleText, - name="Adresse - PLZ: ", value=sd['address_code']) - base_data_widgets['address_country'] = f.add( - npyscreen.TitleText, name="Adresse - Land: ", value=sd['address_country']) - base_data_widgets['birth_date'] = f.add(npyscreen.TitleText, - name="Geburtstag: ", value=sd['birth_date']) - base_data_widgets['birth_location'] = f.add( - npyscreen.TitleText, name="Geburtsort: ", value=sd['birth_location']) - base_data_widgets['email'] = f.add(npyscreen.TitleText, - name="email: ", value=sd['email']) - base_data_widgets['pgp-key'] = f.add(npyscreen.TitleText, - name="URI PGP Key: ", value=sd['pgp-key']) - base_data_widgets['ssh-key'] = f.add(npyscreen.TitleText, - name="URI SSH Key: ", value=sd['ssh-key']) - self.base_data_widgets = base_data_widgets - - fin = self.member['finanzdaten'] - finance_widgets = {} - finance_widgets['iban'] = f.add( - npyscreen.TitleText, name="IBAN: ", value=fin['iban']) - finance_widgets['bic'] = f.add( - npyscreen.TitleText, name="BIC: ", value=fin['bic']) - finance_widgets['holder'] = f.add( - npyscreen.TitleText, name="Kontoinhaber: ", value=fin['holder']) - finance_widgets['issuance'] = f.add(npyscreen.TitleText, name="Tag der Erteilung Lastschriftmandat: ", - value=fin['issuance']) - finance_widgets['reference'] = f.add(npyscreen.TitleText, name="Mandatsreferenznummer: ", - value=fin['reference']) - finance_widgets['scan-sepa-mandate'] = f.add(npyscreen.TitleText, name="URI Scan SEPA-Mandat: ", - value=fin['scan-sepa-mandate']) - self.finance_widgets = finance_widgets - - mem = self.member['mitgliederdaten'] - member_widgets = {} - member_widgets['status'] = f.add( - npyscreen.TitleText, name="Status: ", value=mem['status']) - member_widgets['von'] = f.add( - npyscreen.TitleText, name="Von: ", value=mem['von']) - member_widgets['bis'] = f.add( - npyscreen.TitleText, name="Bis: ", value=mem['bis']) - member_widgets['mitgliedsbeitrag'] = f.add(npyscreen.TitleText, name="Mitgliedsbeitrag: ", - value=mem['mitgliedsbeitrag']) - member_widgets['schliessberechtigung'] = f.add(npyscreen.TitleText, name="Schliessberechtigung: ", - value=mem['schliessberechtigung']) - member_widgets['scan-antrag'] = f.add(npyscreen.TitleText, name="URI Scan Antrag: ", - value=mem['scan-antrag']) - self.member_widgets = member_widgets + self.base_data.add_edit_fields(f) + self.financial_data.add_edit_fields(f) + self.membership_data.add_edit_fields(f) f.edit() + def get_data_from_form(self): + data_dict = {} + data_dict['stammdaten'] = self.base_data.get_form_values_dict() + data_dict['finanzdaten'] = self.financial_data.get_form_values_dict() + data_dict['mitgliederdaten'] = self.membership_data.get_form_values_dict() + data_dict['timestamp'] = datetime.datetime.now().replace(microsecond=0).isoformat() + return data_dict + + def data_has_changed(self): + return self.base_data.has_changed() | self.financial_data.has_changed() | self.membership_data.has_changed() + + def get_filename(self): + name = self.base_data.get_form_values_dict()['fullname'] + fn = '{}_{}.json'.format('_'.join(name.split()), datetime.datetime.now().replace(microsecond=0).isoformat()) + return fn + def main(*_args): if len(argv) > 1: @@ -82,36 +52,22 @@ def main(*_args): else: member_struct = json.load(open('example.json', 'r')) app = FormApp(member_struct) + try: app.run() except Exception as e: print(e) - return 0 - - new_data = {} - new_data['stammdaten'] = dict( - zip(app.base_data_widgets.keys(), map(lambda f: f.value, app.base_data_widgets.values()))) - new_data['finanzdaten'] = dict( - zip(app.finance_widgets.keys(), map(lambda f: f.value, app.finance_widgets.values()))) - new_data['mitgliederdaten'] = dict( - zip(app.member_widgets.keys(), map(lambda f: f.value, app.member_widgets.values()))) - - new_data['stammdaten'] = dict(zip(app.base_data_widgets.keys(), map(lambda f: f.value, app.base_data_widgets.values()))) - new_data['stammdaten']['address_label'] = \ - f"{new_data['stammdaten']['fullname']}\n\ -{new_data['stammdaten']['address_street']}\n\ -{new_data['stammdaten']['address_code']} {new_data['stammdaten']['address_locality']}" - - new_data['finanzdaten'] = dict(zip(app.finance_widgets.keys(), map(lambda f: f.value, app.finance_widgets.values()))) - new_data['mitgliederdaten'] = dict(zip(app.member_widgets.keys(), map(lambda f: f.value, app.member_widgets.values()))) - - new_data['timestamp'] = datetime.datetime.now().replace(microsecond=0).isoformat() - - outfile_name = '{}_{}.json'.format('_'.join(new_data['stammdaten']['fullname'].split()), datetime.datetime.now().replace(microsecond=0).isoformat()) + return 0 + + if app.data_has_changed(): + out_data = app.get_data_from_form() + outfile_name = app.get_filename() + print(f"Writing changed Member Data to {outfile_name}") + with open(outfile_name, 'w') as outfile: + json.dump(out_data, outfile, sort_keys=True, indent=4) + else: + print("Nothing has changed, skipping writing file") - with open(outfile_name, 'w') as outfile: - json.dump(new_data, outfile, sort_keys=True, indent=4) - if __name__ == "__main__": npyscreen.wrapper_basic(main) diff --git a/financial_data_model.py b/financial_data_model.py new file mode 100644 index 0000000..3773b90 --- /dev/null +++ b/financial_data_model.py @@ -0,0 +1,25 @@ +import npyscreen + +class financial_data_model(): + def __init__(self, financial_data_dict): + self.financial_data_dict = financial_data_dict + self.forms = {} + + def add_edit_fields(self, form): + fin = self.financial_data_dict + self.forms['iban'] = form.add(npyscreen.TitleText, name="IBAN: ", value=fin['iban']) + self.forms['bic'] = form.add(npyscreen.TitleText, name="BIC: ", value=fin['bic']) + self.forms['holder'] = form.add(npyscreen.TitleText, name="Kontoinhaber: ", value=fin['holder']) + self.forms['issuance'] = form.add(npyscreen.TitleText, name="Tag der Erteilung Lastschriftmandat: ", + value=fin['issuance']) + self.forms['reference'] = form.add(npyscreen.TitleText, name="Mandatsreferenznummer: ", + value=fin['reference']) + self.forms['scan-sepa-mandate'] = form.add(npyscreen.TitleText, name="URI Scan SEPA-Mandat: ", + value=fin['scan-sepa-mandate']) + + def get_form_values_dict(self): + financial_data_model = dict(zip(self.forms.keys(), map(lambda f: f.value, self.forms.values()))) + return financial_data_model + + def has_changed(self): + return self.financial_data_dict != self.get_form_values_dict() \ No newline at end of file diff --git a/membership_data_model.py b/membership_data_model.py new file mode 100644 index 0000000..800f2b2 --- /dev/null +++ b/membership_data_model.py @@ -0,0 +1,27 @@ +import npyscreen + +class membership_data_model(): + def __init__(self, membership_data_dict): + self.membership_data_dict = membership_data_dict + self.forms = {} + + def add_edit_fields(self, parent_form): + mem = self.membership_data_dict + self.forms['status'] = parent_form.add(npyscreen.TitleText, name="Status: ", value=mem['status']) + self.forms['von'] = parent_form.add(npyscreen.TitleText, name="Von: ", value=mem['von']) + self.forms['bis'] = parent_form.add(npyscreen.TitleText, name="Bis: ", value=mem['bis']) + self.forms['mitgliedsbeitrag'] = parent_form.add(npyscreen.TitleText, name="Mitgliedsbeitrag: ", + value=mem['mitgliedsbeitrag']) + self.forms['spendenbeitrag'] = parent_form.add(npyscreen.TitleText, name="Spendenbeitrag: ", + value=mem['spendenbeitrag']) + self.forms['schliessberechtigung'] = parent_form.add(npyscreen.TitleText, name="Schliessberechtigung: ", + value=mem['schliessberechtigung']) + self.forms['scan-antrag'] = parent_form.add(npyscreen.TitleText, name="URI Scan Antrag: ", + value=mem['scan-antrag']) + + def get_form_values_dict(self): + membership_data_model = dict(zip(self.forms.keys(), map(lambda f: f.value, self.forms.values()))) + return membership_data_model + + def has_changed(self): + return self.membership_data_dict != self.get_form_values_dict() \ No newline at end of file