73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
from formity.extensions import admin, db, ModelView
|
|
from formity.models import FaceshieldRequest, RequestChange
|
|
from spaceauth import current_user
|
|
import enum
|
|
from sqlalchemy import inspect
|
|
from sqlalchemy.orm import class_mapper
|
|
from sqlalchemy.orm.attributes import get_history
|
|
|
|
def get_diff(target, blacklist=['created', 'updated']):
|
|
state_before = {}
|
|
state_after = {}
|
|
inspr = inspect(target)
|
|
attrs = class_mapper(target.__class__).column_attrs
|
|
for attr in attrs:
|
|
if attr.key in blacklist:
|
|
continue
|
|
|
|
hist = getattr(inspr.attrs, attr.key).history
|
|
if hist.has_changes():
|
|
state_before[attr.key] = get_history(target, attr.key)[2].pop()
|
|
if isinstance(state_before[attr.key], enum.Enum):
|
|
state_before[attr.key] = state_before[attr.key].name
|
|
state_after[attr.key] = getattr(target, attr.key)
|
|
|
|
if state_after[attr.key] == state_before[attr.key] or (state_after[attr.key] in ['', None] and state_before[attr.key] in ['', None]):
|
|
state_after.pop(attr.key)
|
|
state_before.pop(attr.key)
|
|
|
|
return state_before, state_after
|
|
|
|
|
|
class FaceshieldRequestAdmin(ModelView):
|
|
details_modal_template = 'changelog_details_modal.html'
|
|
edit_template = 'changelog_edit.html'
|
|
|
|
column_searchable_list = ('email', 'remarks', 'extra', 'entity_info', 'full_name')
|
|
column_filters = (
|
|
'entity_info', 'full_name', 'phone_number', 'email', 'extra',
|
|
'faceshield_front_required', 'faceshield_model',
|
|
'faceshield_full_required',
|
|
'created', 'ua', 'ip', 'status', 'remarks',
|
|
)
|
|
|
|
column_export_list = column_filters
|
|
|
|
column_list = ('entity_info', 'full_name', 'faceshield_front_required', 'faceshield_full_required', 'created', 'status')
|
|
column_editable_list = ('status', 'remarks')
|
|
|
|
can_delete = False
|
|
can_view_details = True
|
|
details_modal = True
|
|
can_export = True
|
|
|
|
def on_model_change(self, form, model, is_created):
|
|
if is_created:
|
|
return
|
|
|
|
try:
|
|
before, after = get_diff(model)
|
|
except Exception:
|
|
# xD
|
|
before, after = {'diff': 'failed'}, {'diff': 'failed'}
|
|
|
|
if before or after:
|
|
db.session.add(RequestChange(
|
|
user_id=current_user.get_id() or 'nobody',
|
|
request_id=model.id,
|
|
state_before=before,
|
|
state_after=after,
|
|
))
|
|
|
|
|
|
admin.add_view(FaceshieldRequestAdmin(FaceshieldRequest, db.session))
|