Add support for Notes tab in profile view

This commit is contained in:
Lance Edgar 2023-06-17 14:18:43 -05:00
parent 105dab7a3d
commit d77de76c97
2 changed files with 357 additions and 32 deletions

View file

@ -60,7 +60,6 @@ class PersonView(MasterView):
has_versions = True
bulk_deletable = True
is_contact = True
manage_notes_from_profile_view = False
supports_autocomplete = True
configurable = True
@ -460,6 +459,8 @@ class PersonView(MasterView):
'employee_view_url': self.request.route_url('employees.view', uuid=employee.uuid) if employee else None,
'employee_history': employee.get_current_history() if employee else None,
'employee_history_data': self.get_context_employee_history(employee),
'notes_data': self.get_context_notes(person),
'note_type_options': self.get_note_type_options(),
'users_data': self.get_context_users(person),
'dynamic_content_title': self.get_context_content_title(person),
}
@ -752,6 +753,29 @@ class PersonView(MasterView):
})
return data
def get_context_notes(self, person):
data = []
notes = sorted(person.notes, key=lambda n: n.created, reverse=True)
for note in notes:
data.append(self.get_context_note(note))
return data
def get_context_note(self, note):
app = self.get_rattail_app()
return {
'uuid': note.uuid,
'note_type': note.type,
'note_type_display': self.enum.PERSON_NOTE_TYPE.get(note.type, note.type),
'subject': note.subject,
'text': note.text,
'created_display': raw_datetime(self.rattail_config, note.created),
'created_by_display': str(note.created_by),
}
def get_note_type_options(self):
return [{'value': k, 'label': v}
for k, v in self.enum.PERSON_NOTE_TYPE.items()]
def get_context_users(self, person):
data = []
users = person.users
@ -1385,6 +1409,8 @@ class PersonView(MasterView):
if mode == 'create':
del schema['uuid']
form = forms.Form(schema=schema, request=self.request)
if mode != 'delete':
form.set_validator('note_type', colander.OneOf(self.enum.PERSON_NOTE_TYPE))
return form
def profile_add_note(self):
@ -1406,11 +1432,15 @@ class PersonView(MasterView):
person.notes.append(note)
return note
def profile_add_note_success(self, note):
return self.redirect(self.get_action_url('view_profile', person))
def profile_add_note_success(self, note, person=None):
return {
'notes': self.get_context_notes(person or note.person),
}
def profile_add_note_failure(self, person, form):
return self.redirect(self.get_action_url('view_profile', person))
return {
'error': str(form.make_deform_form().error),
}
def profile_edit_note(self):
person = self.get_instance()
@ -1429,10 +1459,10 @@ class PersonView(MasterView):
return note
def profile_edit_note_success(self, note):
return self.redirect(self.get_action_url('view_profile', person))
return self.profile_add_note_success(note)
def profile_edit_note_failure(self, person, form):
return self.redirect(self.get_action_url('view_profile', person))
return self.profile_add_note_failure(person, form)
def profile_delete_note(self):
person = self.get_instance()
@ -1449,10 +1479,10 @@ class PersonView(MasterView):
self.Session.delete(note)
def profile_delete_note_success(self, person):
return self.redirect(self.get_action_url('view_profile', person))
return self.profile_add_note_success(None, person=person)
def profile_delete_note_failure(self, person, form):
return self.redirect(self.get_action_url('view_profile', person))
return self.profile_add_note_failure(person, form)
def make_user(self):
uuid = self.request.POST['person_uuid']
@ -1657,32 +1687,41 @@ class PersonView(MasterView):
permission='people_profile.view_versions',
renderer='json')
# manage notes from profile view
if cls.manage_notes_from_profile_view:
# profile - add note
config.add_tailbone_permission('people_profile',
'people_profile.add_note',
"Add new Note records")
config.add_route(f'{route_prefix}.profile_add_note',
f'{instance_url_prefix}/profile/new-note',
request_method='POST')
config.add_view(cls, attr='profile_add_note',
route_name=f'{route_prefix}.profile_add_note',
permission='people_profile.add_note',
renderer='json')
# add note
config.add_tailbone_permission('people_profile', 'people_profile.add_note',
"Add new {} Note records".format(model_title))
config.add_route('{}.profile_add_note'.format(route_prefix), '{}/{{{}}}/profile/new-note'.format(url_prefix, model_key),
request_method='POST')
config.add_view(cls, attr='profile_add_note', route_name='{}.profile_add_note'.format(route_prefix),
permission='people_profile.add_note')
# profile - edit note
config.add_tailbone_permission('people_profile',
'people_profile.edit_note',
"Edit Note records")
config.add_route(f'{route_prefix}.profile_edit_note',
f'{instance_url_prefix}/profile/edit-note',
request_method='POST')
config.add_view(cls, attr='profile_edit_note',
route_name=f'{route_prefix}.profile_edit_note',
permission='people_profile.edit_note',
renderer='json')
# edit note
config.add_tailbone_permission('people_profile', 'people_profile.edit_note',
"Edit {} Note records".format(model_title))
config.add_route('{}.profile_edit_note'.format(route_prefix), '{}/{{{}}}/profile/edit-note'.format(url_prefix, model_key),
request_method='POST')
config.add_view(cls, attr='profile_edit_note', route_name='{}.profile_edit_note'.format(route_prefix),
permission='people_profile.edit_note')
# delete note
config.add_tailbone_permission('people_profile', 'people_profile.delete_note',
"Delete {} Note records".format(model_title))
config.add_route('{}.profile_delete_note'.format(route_prefix), '{}/{{{}}}/profile/delete-note'.format(url_prefix, model_key),
request_method='POST')
config.add_view(cls, attr='profile_delete_note', route_name='{}.profile_delete_note'.format(route_prefix),
permission='people_profile.delete_note')
# profile - delete note
config.add_tailbone_permission('people_profile',
'people_profile.delete_note',
"Delete Note records")
config.add_route(f'{route_prefix}.profile_delete_note',
f'{instance_url_prefix}/profile/delete-note',
request_method='POST')
config.add_view(cls, attr='profile_delete_note',
route_name=f'{route_prefix}.profile_delete_note',
permission='people_profile.delete_note',
renderer='json')
# make user for person
config.add_route('{}.make_user'.format(route_prefix), '{}/make-user'.format(url_prefix),