__package__ = 'archivebox.abid_utils' from django.contrib import admin from datetime import datetime from django.utils.html import format_html from django.utils.safestring import mark_safe from abid_utils.abid import abid_part_from_ts, abid_part_from_uri, abid_part_from_rand, abid_part_from_subtype from api.auth import get_or_create_api_token from ..util import parse_date def highlight_diff(display_val, compare_val): """highlight each character in red that differs with the char at the same index in compare_val""" display_val = str(display_val) compare_val = str(compare_val) diff_chars = mark_safe('').join( format_html('{}', display_val[i]) if display_val[i] != compare_val[i] else format_html('{}', display_val[i]) for i in range(len(display_val)) ) return diff_chars def get_abid_info(self, obj, request=None): try: abid_diff = f' != obj.ABID: {highlight_diff(obj.ABID, obj.abid)} ❌' if str(obj.ABID) != str(obj.abid) else ' == .ABID ✅' fresh_abid = obj.generate_abid() fresh_abid_diff = f' !=   .fresh_abid: {highlight_diff(obj.ABID, fresh_abid)} ❌' if str(fresh_abid) != str(obj.ABID) else '✅' fresh_uuid_diff = f' !=   .fresh_uuid: {highlight_diff(obj.ABID.uuid, fresh_abid.uuid)} ❌' if str(fresh_abid.uuid) != str(obj.ABID.uuid) else '✅' id_fresh_abid_diff = f' != .fresh_abid ❌' if str(fresh_abid.uuid) != str(obj.id) else ' == .fresh_abid ✅' id_abid_diff = f' != .abid.uuid: {highlight_diff(obj.ABID.uuid, obj.id)} ❌' if str(obj.id) != str(obj.ABID.uuid) else ' == .abid ✅' id_pk_diff = f' != .pk: {highlight_diff(obj.pk, obj.id)} ❌' if str(obj.pk) != str(obj.id) else ' == .pk ✅' source_ts_val = parse_date(obj.abid_values['ts']) or None derived_ts = abid_part_from_ts(source_ts_val) if source_ts_val else None ts_diff = f'!= {highlight_diff(derived_ts, obj.ABID.ts)} ❌' if derived_ts != obj.ABID.ts else '✅' derived_uri = abid_part_from_uri(obj.abid_values['uri']) uri_diff = f'!= {highlight_diff(derived_uri, obj.ABID.uri)} ❌' if derived_uri != obj.ABID.uri else '✅' derived_subtype = abid_part_from_subtype(obj.abid_values['subtype']) subtype_diff = f'!= {highlight_diff(derived_subtype, obj.ABID.subtype)} ❌' if derived_subtype != obj.ABID.subtype else '✅' derived_rand = abid_part_from_rand(obj.abid_values['rand']) rand_diff = f'!= {highlight_diff(derived_rand, obj.ABID.rand)} ❌' if derived_rand != obj.ABID.rand else '✅' # any_abid_discrepancies = any( # '❌' in diff or '!=' in diff # for diff in (abid_diff, fresh_abid_diff, id_abid_diff, id_pk_diff, ts_diff, uri_diff, subtype_diff, rand_diff) # ) # total_diff = f' != .generate_abid() -> {fresh_abid} ❌' if any_abid_discrepancies else '✅' return format_html( # URL Hash: {}
''' {}     📖 API DOCS

    .abid:                   {}                 {}
    .abid.uuid:           {}     {}
    .id:                       {}     {}

    TS:                  {}   {}        {} {}: {}
    URI:                 {}     {}           {} {}: {}
    SUBTYPE:       {}           {}                           {} {}: {}
    RAND:             {}       {}                 {} {}: {}

    .old_id:                {}
''', obj.api_url + (f'?api_key={get_or_create_api_token(request.user)}' if request and request.user else ''), obj.api_url, obj.api_docs_url, str(obj.abid), mark_safe(fresh_abid_diff), str(obj.ABID.uuid), mark_safe(fresh_uuid_diff), str(obj.id), mark_safe(id_pk_diff + id_abid_diff + id_fresh_abid_diff), # str(fresh_abid.uuid), mark_safe(fresh_uuid_diff), # str(fresh_abid), mark_safe(fresh_abid_diff), obj.ABID.ts, str(obj.ABID.uuid)[0:14], mark_safe(ts_diff), obj.abid_ts_src, source_ts_val and source_ts_val.isoformat(), obj.ABID.uri, str(obj.ABID.uuid)[14:26], mark_safe(uri_diff), obj.abid_uri_src, str(obj.abid_values['uri']), obj.ABID.subtype, str(obj.ABID.uuid)[26:28], mark_safe(subtype_diff), obj.abid_subtype_src, str(obj.abid_values['subtype']), obj.ABID.rand, str(obj.ABID.uuid)[28:36], mark_safe(rand_diff), obj.abid_rand_src, str(obj.abid_values['rand'])[-7:], str(getattr(obj, 'old_id', '')), ) except Exception as e: return str(e) class ABIDModelAdmin(admin.ModelAdmin): list_display = ('created', 'created_by', 'abid', '__str__') sort_fields = ('created', 'created_by', 'abid', '__str__') readonly_fields = ('created', 'modified', '__str__', 'API') def API(self, obj): return get_abid_info(self, obj, request=self.request) def queryset(self, request): self.request = request return super().queryset(request) def change_view(self, request, object_id, form_url="", extra_context=None): self.request = request return super().change_view(request, object_id, form_url, extra_context) def get_form(self, request, obj=None, **kwargs): self.request = request form = super().get_form(request, obj, **kwargs) if 'created_by' in form.base_fields: form.base_fields['created_by'].initial = request.user return form # def save_model(self, request, obj, form, change): # if getattr(obj, 'created_by_id', None) in (None, get_or_create_system_user_pk()): # obj.created_by = request.user # obj.save()